From d3e770254de0bb301815ca87257c8b1a357d06c4 Mon Sep 17 00:00:00 2001 From: Your Name Date: Sun, 26 Apr 2026 21:02:47 +0800 Subject: hehe --- terraform/modules/agent/main.tf | 114 +++++++++++++++++++++++++++++++++++ terraform/modules/agent/outputs.tf | 11 ++++ terraform/modules/agent/variables.tf | 33 ++++++++++ terraform/modules/agent/versions.tf | 5 ++ 4 files changed, 163 insertions(+) create mode 100644 terraform/modules/agent/main.tf create mode 100644 terraform/modules/agent/outputs.tf create mode 100644 terraform/modules/agent/variables.tf create mode 100644 terraform/modules/agent/versions.tf (limited to 'terraform/modules/agent') 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 @@ +resource "kubernetes_namespace_v1" "agent" { + metadata { + name = var.namespace + labels = { + "app.kubernetes.io/part-of" = "llm-platform" + } + } +} + +resource "kubernetes_deployment_v1" "agent" { + metadata { + name = "agent" + namespace = kubernetes_namespace_v1.agent.metadata[0].name + labels = { app = "agent" } + } + spec { + replicas = 1 + selector { + match_labels = { app = "agent" } + } + template { + metadata { + labels = { app = "agent" } + annotations = { + # Bounce the pod when agent.py changes on disk, even if image tag is unchanged. + "checksum/code" = substr(sha256(file(var.agent_source_path)), 0, 16) + } + } + spec { + container { + name = "agent" + image = var.agent_image + image_pull_policy = "IfNotPresent" + env { + name = "OPENAI_BASE_URL" + value = var.llm_service_url + } + env { + name = "MODEL" + value = var.model_alias + } + port { + name = "http" + container_port = 8001 + } + readiness_probe { + http_get { + path = "/health" + port = "http" + } + initial_delay_seconds = 3 + period_seconds = 5 + failure_threshold = 10 + } + liveness_probe { + http_get { + path = "/health" + port = "http" + } + initial_delay_seconds = 30 + period_seconds = 30 + } + resources { + requests = { cpu = "100m", memory = "128Mi" } + limits = { cpu = "1", memory = "512Mi" } + } + } + } + } + } +} + +resource "kubernetes_service_v1" "agent" { + metadata { + name = "agent" + namespace = kubernetes_namespace_v1.agent.metadata[0].name + labels = { app = "agent" } + } + spec { + selector = { app = "agent" } + port { + name = "http" + port = 8001 + target_port = "http" + } + } +} + +resource "kubernetes_ingress_v1" "agent" { + metadata { + name = "agent" + namespace = kubernetes_namespace_v1.agent.metadata[0].name + } + spec { + ingress_class_name = var.ingress_class + rule { + host = var.ingress_host + http { + path { + path = "/" + path_type = "Prefix" + backend { + service { + name = kubernetes_service_v1.agent.metadata[0].name + port { + number = 8001 + } + } + } + } + } + } + } +} 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 @@ +output "service_dns" { + value = "${kubernetes_service_v1.agent.metadata[0].name}.${kubernetes_namespace_v1.agent.metadata[0].name}.svc.cluster.local" +} + +output "ingress_host" { + value = var.ingress_host +} + +output "namespace" { + value = kubernetes_namespace_v1.agent.metadata[0].name +} 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 @@ +variable "namespace" { + type = string +} + +variable "agent_source_path" { + type = string + description = "Absolute path to agent/agent.py. Used only to bounce pods on code change." +} + +variable "agent_image" { + type = string + default = "localhost/agent:0.1.0" + description = "Pre-built agent image. Must be loaded into kind with `make agent-build`." +} + +variable "llm_service_url" { + type = string + description = "OpenAI-compatible base URL, e.g. http://llm-llm-app.llm-prod.svc.cluster.local:8000/v1" +} + +variable "model_alias" { + type = string + default = "Qwen2.5-1.5B-Instruct" +} + +variable "ingress_host" { + type = string +} + +variable "ingress_class" { + type = string + default = "nginx" +} 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 @@ +terraform { + required_providers { + kubernetes = { source = "hashicorp/kubernetes", version = "~> 2.31" } + } +} -- cgit