2025-10-13 22:35:35 +02:00
|
|
|
resource "kubernetes_service_account" "devolo_exporter" {
|
|
|
|
|
metadata {
|
|
|
|
|
name = "devolo-exporter-sa-${var.devolo_model}"
|
|
|
|
|
namespace = var.namespace
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
resource "kubernetes_config_map" "devolo_exporter" {
|
|
|
|
|
metadata {
|
|
|
|
|
name = "devolo-exporter-config-${var.devolo_model}"
|
|
|
|
|
namespace = var.namespace
|
|
|
|
|
}
|
|
|
|
|
data = {
|
|
|
|
|
"exporter.py" = local.exporter_script
|
|
|
|
|
"requirements.txt" = local.requirements_txt
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
resource "kubernetes_deployment" "devolo_exporter" {
|
|
|
|
|
metadata {
|
|
|
|
|
name = "devolo-exporter-${var.devolo_model}"
|
|
|
|
|
namespace = var.namespace
|
|
|
|
|
labels = {
|
|
|
|
|
app = "devolo-exporter-${var.devolo_model}"
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
spec {
|
|
|
|
|
replicas = 1
|
|
|
|
|
selector {
|
|
|
|
|
match_labels = {
|
|
|
|
|
app = "devolo-exporter-${var.devolo_model}"
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
strategy {
|
|
|
|
|
type = "RollingUpdate"
|
|
|
|
|
}
|
|
|
|
|
template {
|
|
|
|
|
metadata {
|
|
|
|
|
labels = {
|
|
|
|
|
app = "devolo-exporter-${var.devolo_model}"
|
|
|
|
|
}
|
|
|
|
|
annotations = {
|
|
|
|
|
"checksum/exporter" = local.exporter_checksum
|
|
|
|
|
"checksum/requirements" = local.requirements_checksum
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
spec {
|
|
|
|
|
service_account_name = kubernetes_service_account.devolo_exporter.metadata[0].name
|
|
|
|
|
automount_service_account_token = false
|
|
|
|
|
|
|
|
|
|
container {
|
|
|
|
|
name = "devolo-exporter"
|
|
|
|
|
image = "python:${var.tag}"
|
|
|
|
|
command = ["sh", "-c", join(" && ", local.commands)]
|
|
|
|
|
|
|
|
|
|
env {
|
|
|
|
|
name = "EXPORTER_PORT"
|
|
|
|
|
value = tostring(var.exporter_port)
|
|
|
|
|
}
|
|
|
|
|
env {
|
|
|
|
|
name = "DEVOLO_IP"
|
|
|
|
|
value = var.devolo_ip
|
|
|
|
|
}
|
|
|
|
|
env {
|
|
|
|
|
name = "RD_PORT"
|
|
|
|
|
value = tostring(var.rd_port)
|
|
|
|
|
}
|
|
|
|
|
port {
|
|
|
|
|
container_port = var.exporter_port
|
|
|
|
|
name = "http-metrics"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
liveness_probe {
|
|
|
|
|
http_get {
|
|
|
|
|
path = "/healthz"
|
|
|
|
|
port = var.exporter_port
|
|
|
|
|
}
|
2025-10-14 22:43:02 +02:00
|
|
|
initial_delay_seconds = 15
|
|
|
|
|
period_seconds = 60
|
|
|
|
|
timeout_seconds = 10
|
2025-10-13 22:35:35 +02:00
|
|
|
failure_threshold = 3
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
readiness_probe {
|
|
|
|
|
http_get {
|
|
|
|
|
path = "/healthz"
|
|
|
|
|
port = var.exporter_port
|
|
|
|
|
}
|
2025-10-14 22:43:02 +02:00
|
|
|
initial_delay_seconds = 10
|
2025-10-13 22:35:35 +02:00
|
|
|
period_seconds = 10
|
|
|
|
|
timeout_seconds = 5
|
|
|
|
|
failure_threshold = 3
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
volume_mount {
|
|
|
|
|
name = "exporter-volume"
|
|
|
|
|
mount_path = "/exporter"
|
|
|
|
|
read_only = true
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
volume_mount {
|
|
|
|
|
name = "tmp"
|
|
|
|
|
mount_path = "/tmp"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
security_context {
|
|
|
|
|
run_as_user = 0
|
|
|
|
|
run_as_group = 0
|
|
|
|
|
read_only_root_filesystem = true
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# Chromium sidecar providing the DevTools endpoint used by the exporter
|
|
|
|
|
container {
|
|
|
|
|
name = "chromium"
|
|
|
|
|
image = "nextools/chromium:latest"
|
|
|
|
|
command = ["/usr/bin/chromium-browser"]
|
|
|
|
|
args = [
|
|
|
|
|
"--disable-background-networking",
|
|
|
|
|
"--disable-background-timer-throttling",
|
|
|
|
|
"--disable-backgrounding-occluded-windows",
|
|
|
|
|
"--disable-renderer-backgrounding",
|
|
|
|
|
"--disable-breakpad",
|
|
|
|
|
"--disable-client-side-phishing-detection",
|
|
|
|
|
"--disable-default-apps",
|
|
|
|
|
"--disable-dev-shm-usage",
|
|
|
|
|
"--disable-extensions",
|
|
|
|
|
"--disable-gpu",
|
2025-10-14 22:43:02 +02:00
|
|
|
"--enable-low-end-device-mode",
|
|
|
|
|
"--memory-pressure-thresholds=moderate:512,critical:256",
|
|
|
|
|
"--force-device-scale-factor=1",
|
2025-10-13 22:35:35 +02:00
|
|
|
"--disable-popup-blocking",
|
|
|
|
|
"--disable-prompt-on-repost",
|
|
|
|
|
"--disable-sync",
|
|
|
|
|
"--disable-translate",
|
|
|
|
|
"--headless",
|
|
|
|
|
"--hide-scrollbars",
|
|
|
|
|
"--ignore-certificate-errors",
|
|
|
|
|
"--ignore-certificate-errors-spki-list",
|
|
|
|
|
"--ignore-ssl-errors",
|
|
|
|
|
"--metrics-recording-only",
|
|
|
|
|
"--mute-audio",
|
|
|
|
|
"--no-first-run",
|
|
|
|
|
"--no-sandbox",
|
|
|
|
|
"--remote-debugging-address=0.0.0.0",
|
|
|
|
|
"--remote-debugging-port=${var.rd_port}",
|
|
|
|
|
"--remote-allow-origins=http://localhost:9222",
|
|
|
|
|
"--safebrowsing-disable-auto-update",
|
|
|
|
|
"--user-data-dir=/home/chromium",
|
2025-10-14 22:43:02 +02:00
|
|
|
"about:blank"
|
2025-10-13 22:35:35 +02:00
|
|
|
]
|
|
|
|
|
|
|
|
|
|
# Optional: expose the DevTools port within the pod (not needed outside)
|
|
|
|
|
port {
|
|
|
|
|
container_port = var.rd_port
|
|
|
|
|
name = "devtools"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
volume_mount {
|
|
|
|
|
name = "chromium-data"
|
|
|
|
|
mount_path = "/home/chromium"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
volume_mount {
|
|
|
|
|
name = "tmp"
|
|
|
|
|
mount_path = "/tmp"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
security_context {
|
|
|
|
|
run_as_user = 0
|
|
|
|
|
run_as_group = 0
|
|
|
|
|
read_only_root_filesystem = true
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
volume {
|
|
|
|
|
name = "exporter-volume"
|
|
|
|
|
config_map {
|
|
|
|
|
name = kubernetes_config_map.devolo_exporter.metadata[0].name
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# Writable /tmp for venv/site-packages installed under /tmp/python
|
|
|
|
|
volume {
|
|
|
|
|
name = "tmp"
|
|
|
|
|
empty_dir {}
|
|
|
|
|
}
|
|
|
|
|
volume {
|
|
|
|
|
name = "chromium-data"
|
|
|
|
|
empty_dir {}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
resource "kubernetes_service" "devolo_exporter" {
|
|
|
|
|
metadata {
|
|
|
|
|
name = "devolo-exporter-${var.devolo_model}"
|
|
|
|
|
namespace = var.namespace
|
|
|
|
|
labels = {
|
|
|
|
|
app = "devolo-exporter-${var.devolo_model}"
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
spec {
|
|
|
|
|
selector = {
|
|
|
|
|
app = "devolo-exporter-${var.devolo_model}"
|
|
|
|
|
}
|
|
|
|
|
port {
|
|
|
|
|
port = var.exporter_port
|
|
|
|
|
target_port = var.exporter_port
|
|
|
|
|
protocol = "TCP"
|
|
|
|
|
name = "http-metrics"
|
|
|
|
|
}
|
|
|
|
|
type = "ClusterIP"
|
|
|
|
|
}
|
|
|
|
|
}
|