Skip to content

Commit 356db86

Browse files
committed
Terraform setup: enable Kubernetes Monitoring
1 parent d32fe4f commit 356db86

File tree

8 files changed

+195
-2
lines changed

8 files changed

+195
-2
lines changed

terraform/README.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,3 +82,19 @@ To use a locally built QuickPizza image instead of the default from the registry
8282
```bash
8383
terraform apply
8484
```
85+
86+
## Enable Kubernetes Monitoring
87+
88+
Update `terraform.tfvars` and set the required settings:
89+
90+
```hcl
91+
enable_k8s_monitoring = true
92+
cluster_name = ""
93+
externalservices_prometheus_host = ""
94+
externalservices_prometheus_basicauth_username = ""
95+
externalservices_prometheus_basicauth_password = ""
96+
97+
externalservices_loki_host = ""
98+
externalservices_loki_basicauth_username = ""
99+
externalservices_loki_basicauth_password = ""
100+
```

terraform/alloy.tf

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,10 @@ resource "kubernetes_deployment" "alloy" {
8888
name = kubernetes_secret.alloy_credentials.metadata[0].name
8989
}
9090
}
91+
env {
92+
name = "KUBERNETES_CLUSTER_NAME"
93+
value = var.cluster_name
94+
}
9195
env {
9296
name = "QUICKPIZZA_PYROSCOPE_SERVICE_GIT_REF"
9397
value = var.quickpizza_git_ref

terraform/alloy/config.alloy

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,10 +76,26 @@ prometheus.scrape "application_pods" {
7676
targets = discovery.relabel.application_pods.output
7777
}
7878

79+
discovery.relabel "application_pods_logs" {
80+
// Enable logs in Kubernetes Monitoring
81+
// Only add cluster_name label if KUBERNETES_CLUSTER_NAME env var is set
82+
rule {
83+
target_label = "cluster"
84+
replacement = env("KUBERNETES_CLUSTER_NAME")
85+
}
86+
rule {
87+
target_label = "pod"
88+
source_labels = [
89+
"__meta_kubernetes_pod_name",
90+
]
91+
}
92+
targets = discovery.relabel.application_pods.output
93+
}
94+
7995
// Logs: application pods
8096
loki.source.kubernetes "application_pods" {
8197
forward_to = [grafana_cloud.stack.receivers.logs]
82-
targets = discovery.relabel.application_pods.output
98+
targets = discovery.relabel.application_pods_logs.output
8399
}
84100

85101
discovery.relabel "application_pods_profiles" {

terraform/k8-monitoring.tf

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
resource "helm_release" "grafana-k8s-monitoring" {
2+
count = var.enable_k8s_monitoring ? 1 : 0
3+
name = "grafana-k8s-monitoring"
4+
repository = "https://grafana.github.io/helm-charts"
5+
chart = "k8s-monitoring"
6+
version = "^1"
7+
namespace = "quickpizza-monitoring"
8+
create_namespace = true
9+
atomic = true
10+
timeout = 300
11+
12+
lifecycle {
13+
# this causes a warning saying it's redundant, but it is intentional,
14+
# see https://github.com/hashicorp/terraform-provider-helm/issues/1315
15+
ignore_changes = [metadata]
16+
}
17+
18+
values = [file("${path.module}/k8-monitoring.yaml")]
19+
20+
set {
21+
name = "cluster.name"
22+
value = var.cluster_name
23+
}
24+
25+
set {
26+
name = "externalServices.prometheus.host"
27+
value = var.externalservices_prometheus_host
28+
}
29+
30+
set_sensitive {
31+
name = "externalServices.prometheus.basicAuth.username"
32+
value = var.externalservices_prometheus_basicauth_username
33+
}
34+
35+
set_sensitive {
36+
name = "externalServices.prometheus.basicAuth.password"
37+
value = var.externalservices_prometheus_basicauth_password
38+
}
39+
40+
set {
41+
name = "externalServices.loki.host"
42+
value = var.externalservices_loki_host
43+
}
44+
45+
set_sensitive {
46+
name = "externalServices.loki.basicAuth.username"
47+
value = var.externalservices_loki_basicauth_username
48+
}
49+
50+
set_sensitive {
51+
name = "externalServices.loki.basicAuth.password"
52+
value = var.externalservices_loki_basicauth_password
53+
}
54+
55+
set {
56+
name = "opencost.opencost.exporter.defaultClusterId"
57+
value = var.cluster_name
58+
}
59+
60+
set {
61+
name = "opencost.opencost.prometheus.external.url"
62+
value = format("%s/api/prom", var.externalservices_prometheus_host)
63+
}
64+
}

terraform/k8-monitoring.yaml

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
metrics:
2+
enabled: true
3+
kepler:
4+
enabled: true
5+
6+
alloy-logs:
7+
alloy:
8+
mounts:
9+
dockercontainers: true
10+
11+
logs:
12+
enabled: true
13+
pod_logs:
14+
enabled: true
15+
# The Alloy pod in quickpizza ns collects quickpizza logs
16+
excludeNamespaces: [quickpizza]
17+
18+
traces:
19+
enabled: false
20+
21+
profiles:
22+
enabled: false
23+
24+
kepler:
25+
enabled: true

terraform/terraform.tf

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@ terraform {
44
source = "hashicorp/kubernetes"
55
version = ">= 2.0.1"
66
}
7+
helm = {
8+
source = "hashicorp/helm"
9+
version = "2.17.0"
10+
}
711
}
812
required_version = ">= 1.8.0"
913
}
@@ -12,3 +16,10 @@ provider "kubernetes" {
1216
config_path = "~/.kube/config"
1317
config_context = "minikube"
1418
}
19+
20+
provider "helm" {
21+
kubernetes {
22+
config_path = "~/.kube/config"
23+
config_context = "minikube"
24+
}
25+
}

terraform/terraform.tfvars.local

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,15 @@ grafana_cloud_token = "glc_your_token_here"
1212
# Optional: Faro configuration for Frontend Observability
1313
# Get these from your Grafana Cloud Faro app configuration
1414
# quickpizza_conf_faro_url = ""
15-
# quickpizza_conf_faro_app_name = ""
15+
# quickpizza_conf_faro_app_name = ""
16+
17+
18+
# enable_k8s_monitoring = true
19+
# cluster_name = ""
20+
# externalservices_prometheus_host = ""
21+
# externalservices_prometheus_basicauth_username = ""
22+
# externalservices_prometheus_basicauth_password = ""
23+
24+
# externalservices_loki_host = ""
25+
# externalservices_loki_basicauth_username = ""
26+
# externalservices_loki_basicauth_password = ""

terraform/variables.tf

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,4 +65,50 @@ variable "quickpizza_log_level" {
6565
description = "The Log Level to use for the QuickPizza Demo Application, for example \"info\" or \"debug\"."
6666
nullable = false
6767
type = string
68+
}
69+
70+
variable "enable_k8s_monitoring" {
71+
description = "Enable or disable Kubernetes monitoring Helm chart"
72+
type = bool
73+
default = false
74+
}
75+
76+
variable "cluster_name" {
77+
type = string
78+
default = null
79+
}
80+
81+
variable "externalservices_prometheus_host" {
82+
type = string
83+
default = null
84+
}
85+
86+
variable "externalservices_prometheus_basicauth_username" {
87+
default = null
88+
type = string
89+
sensitive = true
90+
}
91+
92+
variable "externalservices_prometheus_basicauth_password" {
93+
default = null
94+
type = string
95+
sensitive = true
96+
}
97+
98+
variable "externalservices_loki_host" {
99+
default = null
100+
type = string
101+
sensitive = true
102+
}
103+
104+
variable "externalservices_loki_basicauth_username" {
105+
default = null
106+
type = string
107+
sensitive = true
108+
}
109+
110+
variable "externalservices_loki_basicauth_password" {
111+
default = null
112+
type = string
113+
sensitive = true
68114
}

0 commit comments

Comments
 (0)