Skip to content

Commit be3fde2

Browse files
refactor(infra): consolidate tofu micro-files into domain modules (#298)
1 parent 47d52e0 commit be3fde2

File tree

14 files changed

+211
-184
lines changed

14 files changed

+211
-184
lines changed

tofu/grafana.tf

Lines changed: 0 additions & 23 deletions
This file was deleted.

tofu/infrastructure.tf

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
# --- Storage ---
2+
3+
resource "kubernetes_storage_class_v1" "local_path_retain" {
4+
metadata {
5+
name = "local-path-retain"
6+
}
7+
8+
storage_provisioner = "rancher.io/local-path"
9+
reclaim_policy = "Retain"
10+
volume_binding_mode = "WaitForFirstConsumer"
11+
}
12+
13+
# --- Database (Postgres) ---
14+
15+
resource "helm_release" "postgres" {
16+
name = "postgres"
17+
repository = "oci://registry-1.docker.io/bitnamicharts"
18+
chart = "postgresql"
19+
version = "18.3.0"
20+
namespace = kubernetes_namespace_v1.observability.metadata[0].name
21+
22+
values = [file("${path.module}/../k3s/postgres/values.yaml")]
23+
24+
depends_on = [kubernetes_namespace_v1.observability]
25+
}
26+
27+
# --- Object Storage (MinIO) ---
28+
29+
resource "helm_release" "minio" {
30+
name = "minio"
31+
repository = "https://charts.min.io/"
32+
chart = "minio"
33+
version = "5.4.0"
34+
namespace = kubernetes_namespace_v1.observability.metadata[0].name
35+
36+
values = [file("${path.module}/../k3s/minio/values.yaml")]
37+
38+
depends_on = [kubernetes_namespace_v1.observability]
39+
}

tofu/loki.tf

Lines changed: 0 additions & 11 deletions
This file was deleted.

tofu/providers.tf renamed to tofu/main.tf

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,10 @@ terraform {
1616
}
1717
}
1818

19-
# Step 9: MinIO state backend - uncomment AFTER MinIO pod is confirmed healthy (Step 4)
20-
# This stores OpenTofu's own .tfstate file inside MinIO, separate from the MinIO pod itself.
2119
# backend "s3" {
2220
# bucket = "tofu-state"
2321
# key = "observability-hub/terraform.tfstate"
24-
# region = "minio" # dummy value - required by S3 SDK but ignored
22+
# region = "minio"
2523
# endpoint = "http://<minio-node-ip>:9000"
2624
# skip_credentials_validation = true
2725
# skip_metadata_api_check = true
@@ -30,6 +28,8 @@ terraform {
3028
# }
3129
}
3230

31+
# --- Providers ---
32+
3333
provider "kubernetes" {
3434
config_path = var.kubeconfig_path
3535
config_context = "default"
@@ -53,3 +53,30 @@ provider "grafana" {
5353
url = "http://localhost:30000"
5454
auth = try("${data.kubernetes_secret_v1.grafana_admin.data["admin-user"]}:${data.kubernetes_secret_v1.grafana_admin.data["admin-password"]}", "admin:admin")
5555
}
56+
57+
# --- Variables ---
58+
59+
variable "kubeconfig_path" {
60+
description = "Path to the kubeconfig file."
61+
type = string
62+
default = "~/.kube/config"
63+
}
64+
65+
variable "observability_namespace" {
66+
description = "Namespace for all observability services."
67+
type = string
68+
default = "observability"
69+
}
70+
71+
# --- Namespace ---
72+
73+
resource "kubernetes_namespace_v1" "observability" {
74+
metadata {
75+
name = var.observability_namespace
76+
}
77+
}
78+
79+
moved {
80+
from = kubernetes_namespace.observability
81+
to = kubernetes_namespace_v1.observability
82+
}

tofu/minio.tf

Lines changed: 0 additions & 12 deletions
This file was deleted.

tofu/namespace.tf

Lines changed: 0 additions & 10 deletions
This file was deleted.

tofu/observability.tf

Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
# --- Metrics (Prometheus & Kepler) ---
2+
3+
resource "helm_release" "prometheus" {
4+
name = "prometheus"
5+
repository = "https://prometheus-community.github.io/helm-charts"
6+
chart = "prometheus"
7+
version = "28.10.1"
8+
namespace = kubernetes_namespace_v1.observability.metadata[0].name
9+
10+
values = [file("${path.module}/../k3s/prometheus/values.yaml")]
11+
12+
depends_on = [kubernetes_namespace_v1.observability]
13+
}
14+
15+
resource "helm_release" "kepler" {
16+
name = "kepler"
17+
repository = "oci://quay.io/sustainable_computing_io/charts"
18+
chart = "kepler"
19+
version = "0.11.2"
20+
namespace = kubernetes_namespace_v1.observability.metadata[0].name
21+
22+
values = [file("${path.module}/../k3s/kepler/values.yaml")]
23+
24+
depends_on = [kubernetes_namespace_v1.observability]
25+
}
26+
27+
resource "kubernetes_service_v1" "prometheus_thanos_grpc" {
28+
metadata {
29+
name = "prometheus-thanos-grpc"
30+
namespace = kubernetes_namespace_v1.observability.metadata[0].name
31+
labels = {
32+
"app.kubernetes.io/name" = "prometheus"
33+
"app.kubernetes.io/component" = "thanos-sidecar"
34+
}
35+
}
36+
37+
spec {
38+
selector = {
39+
"app.kubernetes.io/name" = "prometheus"
40+
"app.kubernetes.io/component" = "server"
41+
"app.kubernetes.io/instance" = "prometheus"
42+
}
43+
44+
port {
45+
name = "grpc"
46+
port = 10901
47+
target_port = 10901
48+
}
49+
50+
type = "ClusterIP"
51+
cluster_ip = "None" # Headless service for SRV discovery
52+
}
53+
}
54+
55+
# --- Long-term Metrics (Thanos) ---
56+
57+
resource "helm_release" "thanos" {
58+
name = "thanos"
59+
repository = "oci://registry-1.docker.io/bitnamicharts"
60+
chart = "thanos"
61+
version = "17.3.1"
62+
namespace = kubernetes_namespace_v1.observability.metadata[0].name
63+
64+
values = [
65+
file("${path.module}/../k3s/thanos/values.yaml"),
66+
yamlencode({
67+
query = {
68+
extraFlags = ["--endpoint=prometheus-thanos-grpc.observability.svc.cluster.local:10901"]
69+
}
70+
})
71+
]
72+
73+
depends_on = [kubernetes_namespace_v1.observability]
74+
}
75+
76+
# --- Logs (Loki) ---
77+
78+
resource "helm_release" "loki" {
79+
name = "loki"
80+
repository = "https://grafana.github.io/helm-charts"
81+
chart = "loki"
82+
version = "6.53.0"
83+
namespace = kubernetes_namespace_v1.observability.metadata[0].name
84+
85+
values = [file("${path.module}/../k3s/loki/values.yaml")]
86+
87+
depends_on = [kubernetes_namespace_v1.observability]
88+
}
89+
90+
# --- Traces (Tempo) ---
91+
92+
resource "helm_release" "tempo" {
93+
name = "tempo"
94+
repository = "https://grafana-community.github.io/helm-charts"
95+
chart = "tempo"
96+
version = "1.26.1"
97+
namespace = kubernetes_namespace_v1.observability.metadata[0].name
98+
99+
values = [file("${path.module}/../k3s/tempo/values.yaml")]
100+
101+
depends_on = [kubernetes_namespace_v1.observability]
102+
}
103+
104+
# --- Signal Processing (OpenTelemetry) ---
105+
106+
resource "helm_release" "opentelemetry_collector" {
107+
name = "opentelemetry-collector"
108+
repository = "https://open-telemetry.github.io/opentelemetry-helm-charts"
109+
chart = "opentelemetry-collector"
110+
version = "0.146.0"
111+
namespace = kubernetes_namespace_v1.observability.metadata[0].name
112+
113+
values = [file("${path.module}/../k3s/opentelemetry/values.yaml")]
114+
115+
depends_on = [kubernetes_namespace_v1.observability]
116+
}
117+
118+
# --- Visualization (Grafana) ---
119+
120+
resource "helm_release" "grafana" {
121+
name = "grafana"
122+
repository = "https://grafana.github.io/helm-charts"
123+
chart = "grafana"
124+
version = "10.5.15"
125+
namespace = kubernetes_namespace_v1.observability.metadata[0].name
126+
127+
values = [file("${path.module}/../k3s/grafana/values.yaml")]
128+
129+
depends_on = [kubernetes_namespace_v1.observability]
130+
}
131+
132+
resource "grafana_folder" "observability" {
133+
title = "Observability"
134+
}
135+
136+
resource "grafana_dashboard" "dashboards" {
137+
for_each = fileset("${path.module}/../k3s/grafana/dashboards", "*.json")
138+
139+
folder = grafana_folder.observability.id
140+
config_json = file("${path.module}/../k3s/grafana/dashboards/${each.value}")
141+
overwrite = true
142+
}

tofu/opentelemetry.tf

Lines changed: 0 additions & 12 deletions
This file was deleted.

tofu/postgres.tf

Lines changed: 0 additions & 12 deletions
This file was deleted.

tofu/prometheus.tf

Lines changed: 0 additions & 51 deletions
This file was deleted.

0 commit comments

Comments
 (0)