summaryrefslogtreecommitdiff
path: root/terraform/modules/agent
diff options
context:
space:
mode:
Diffstat (limited to 'terraform/modules/agent')
-rw-r--r--terraform/modules/agent/main.tf114
-rw-r--r--terraform/modules/agent/outputs.tf11
-rw-r--r--terraform/modules/agent/variables.tf33
-rw-r--r--terraform/modules/agent/versions.tf5
4 files changed, 163 insertions, 0 deletions
diff --git a/terraform/modules/agent/main.tf b/terraform/modules/agent/main.tf
new file mode 100644
index 0000000..f53acdc
--- /dev/null
+++ b/terraform/modules/agent/main.tf
@@ -0,0 +1,114 @@
1resource "kubernetes_namespace_v1" "agent" {
2 metadata {
3 name = var.namespace
4 labels = {
5 "app.kubernetes.io/part-of" = "llm-platform"
6 }
7 }
8}
9
10resource "kubernetes_deployment_v1" "agent" {
11 metadata {
12 name = "agent"
13 namespace = kubernetes_namespace_v1.agent.metadata[0].name
14 labels = { app = "agent" }
15 }
16 spec {
17 replicas = 1
18 selector {
19 match_labels = { app = "agent" }
20 }
21 template {
22 metadata {
23 labels = { app = "agent" }
24 annotations = {
25 # Bounce the pod when agent.py changes on disk, even if image tag is unchanged.
26 "checksum/code" = substr(sha256(file(var.agent_source_path)), 0, 16)
27 }
28 }
29 spec {
30 container {
31 name = "agent"
32 image = var.agent_image
33 image_pull_policy = "IfNotPresent"
34 env {
35 name = "OPENAI_BASE_URL"
36 value = var.llm_service_url
37 }
38 env {
39 name = "MODEL"
40 value = var.model_alias
41 }
42 port {
43 name = "http"
44 container_port = 8001
45 }
46 readiness_probe {
47 http_get {
48 path = "/health"
49 port = "http"
50 }
51 initial_delay_seconds = 3
52 period_seconds = 5
53 failure_threshold = 10
54 }
55 liveness_probe {
56 http_get {
57 path = "/health"
58 port = "http"
59 }
60 initial_delay_seconds = 30
61 period_seconds = 30
62 }
63 resources {
64 requests = { cpu = "100m", memory = "128Mi" }
65 limits = { cpu = "1", memory = "512Mi" }
66 }
67 }
68 }
69 }
70 }
71}
72
73resource "kubernetes_service_v1" "agent" {
74 metadata {
75 name = "agent"
76 namespace = kubernetes_namespace_v1.agent.metadata[0].name
77 labels = { app = "agent" }
78 }
79 spec {
80 selector = { app = "agent" }
81 port {
82 name = "http"
83 port = 8001
84 target_port = "http"
85 }
86 }
87}
88
89resource "kubernetes_ingress_v1" "agent" {
90 metadata {
91 name = "agent"
92 namespace = kubernetes_namespace_v1.agent.metadata[0].name
93 }
94 spec {
95 ingress_class_name = var.ingress_class
96 rule {
97 host = var.ingress_host
98 http {
99 path {
100 path = "/"
101 path_type = "Prefix"
102 backend {
103 service {
104 name = kubernetes_service_v1.agent.metadata[0].name
105 port {
106 number = 8001
107 }
108 }
109 }
110 }
111 }
112 }
113 }
114}
diff --git a/terraform/modules/agent/outputs.tf b/terraform/modules/agent/outputs.tf
new file mode 100644
index 0000000..ac9932b
--- /dev/null
+++ b/terraform/modules/agent/outputs.tf
@@ -0,0 +1,11 @@
1output "service_dns" {
2 value = "${kubernetes_service_v1.agent.metadata[0].name}.${kubernetes_namespace_v1.agent.metadata[0].name}.svc.cluster.local"
3}
4
5output "ingress_host" {
6 value = var.ingress_host
7}
8
9output "namespace" {
10 value = kubernetes_namespace_v1.agent.metadata[0].name
11}
diff --git a/terraform/modules/agent/variables.tf b/terraform/modules/agent/variables.tf
new file mode 100644
index 0000000..6f525ee
--- /dev/null
+++ b/terraform/modules/agent/variables.tf
@@ -0,0 +1,33 @@
1variable "namespace" {
2 type = string
3}
4
5variable "agent_source_path" {
6 type = string
7 description = "Absolute path to agent/agent.py. Used only to bounce pods on code change."
8}
9
10variable "agent_image" {
11 type = string
12 default = "localhost/agent:0.1.0"
13 description = "Pre-built agent image. Must be loaded into kind with `make agent-build`."
14}
15
16variable "llm_service_url" {
17 type = string
18 description = "OpenAI-compatible base URL, e.g. http://llm-llm-app.llm-prod.svc.cluster.local:8000/v1"
19}
20
21variable "model_alias" {
22 type = string
23 default = "Qwen2.5-1.5B-Instruct"
24}
25
26variable "ingress_host" {
27 type = string
28}
29
30variable "ingress_class" {
31 type = string
32 default = "nginx"
33}
diff --git a/terraform/modules/agent/versions.tf b/terraform/modules/agent/versions.tf
new file mode 100644
index 0000000..4242705
--- /dev/null
+++ b/terraform/modules/agent/versions.tf
@@ -0,0 +1,5 @@
1terraform {
2 required_providers {
3 kubernetes = { source = "hashicorp/kubernetes", version = "~> 2.31" }
4 }
5}