From 34c33697bbc5cc1b5c312ffe9e32728eb4f2cd05 Mon Sep 17 00:00:00 2001 From: mr-forust Date: Fri, 18 Sep 2026 19:02:36 +0200 Subject: [PATCH] feat(loki): add single-binary loki and alloy stack Filesystem storage on local-path-retain, 14d retention. Alloy daemonset ships k8s pod logs to loki-gateway. --- loki/k8s/active | 0 loki/k8s/alloy-values.yaml | 57 ++++++++++++++++++++++ loki/k8s/loki-values.yaml | 97 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 154 insertions(+) create mode 100644 loki/k8s/active create mode 100644 loki/k8s/alloy-values.yaml create mode 100644 loki/k8s/loki-values.yaml diff --git a/loki/k8s/active b/loki/k8s/active new file mode 100644 index 0000000..e69de29 diff --git a/loki/k8s/alloy-values.yaml b/loki/k8s/alloy-values.yaml new file mode 100644 index 0000000..2f88adc --- /dev/null +++ b/loki/k8s/alloy-values.yaml @@ -0,0 +1,57 @@ +# Pinned chart: grafana/alloy 1.12.1 (app v1.19.2). +# Install (deferred to deploy task, namespace prometheus): +# helm upgrade --install alloy grafana/alloy --version 1.12.1 \ +# --namespace prometheus --values loki/k8s/alloy-values.yaml --wait +# DaemonSet ships k8s pod logs (API-tailed, no hostPath mounts) to Loki. +# Scope phase 1: k8s only, compose leftovers out. + +controller: + type: daemonset + resources: + requests: + memory: "128Mi" + cpu: "50m" + limits: + memory: "512Mi" + cpu: "500m" + +image: + tag: "v1.19.2" + +alloy: + configMap: + create: true + content: | + discovery.kubernetes "pods" { + role = "pod" + } + + discovery.relabel "pods" { + targets = discovery.kubernetes.pods.targets + + rule { + source_labels = ["__meta_kubernetes_namespace"] + target_label = "namespace" + } + + rule { + source_labels = ["__meta_kubernetes_pod_name"] + target_label = "pod" + } + + rule { + source_labels = ["__meta_kubernetes_pod_container_name"] + target_label = "container" + } + } + + loki.source.kubernetes "pods" { + targets = discovery.relabel.pods.output + forward_to = [loki.write.default.receiver] + } + + loki.write "default" { + endpoint { + url = "http://loki-gateway.prometheus.svc.cluster.local/loki/api/v1/push" + } + } diff --git a/loki/k8s/loki-values.yaml b/loki/k8s/loki-values.yaml new file mode 100644 index 0000000..d22c4f3 --- /dev/null +++ b/loki/k8s/loki-values.yaml @@ -0,0 +1,97 @@ +# Pinned chart: grafana/loki 7.3.0 (app 3.6.12). +# Install (deferred to deploy task, namespace prometheus): +# helm upgrade --install loki grafana/loki --version 7.3.0 \ +# --namespace prometheus --values loki/k8s/loki-values.yaml --wait +# SingleBinary, filesystem storage on local-path-retain, 14d retention. +# No IngressRoute: Loki is cluster-internal, queried via Grafana datasource. + +deploymentMode: SingleBinary + +loki: + # Multitenancy off: single-node homelab, gateway + Alloy + Grafana talk to one tenant. + auth_enabled: false + image: + tag: "3.6.12" + commonConfig: + # Single replica: default RF=3 would require 3 ingesters and fail all writes. + replication_factor: 1 + storage: + type: filesystem + schemaConfig: + configs: + - from: "2024-04-01" + store: tsdb + object_store: filesystem + schema: v13 + index: + prefix: index_ + period: 24h + compactor: + retention_enabled: true + delete_request_store: filesystem + limits_config: + retention_period: 336h + rulerConfig: + wal: + dir: /var/loki/ruler-wal + storage: + type: local + local: + directory: /var/loki/rules + +singleBinary: + replicas: 1 + persistence: + enabled: true + size: 20Gi + storageClass: local-path-retain + resources: + requests: + memory: "512Mi" + cpu: "200m" + limits: + memory: "2Gi" + cpu: "1000m" + +# Zeroed: unused in SingleBinary mode (chart validation requires it). +write: + replicas: 0 +read: + replicas: 0 +backend: + replicas: 0 + +gateway: + replicas: 1 + resources: + requests: + memory: "64Mi" + cpu: "50m" + limits: + memory: "256Mi" + cpu: "300m" + +monitoring: + serviceMonitor: + enabled: true + labels: + release: prometheus-stack + interval: 15s + rules: + enabled: true + namespace: prometheus + labels: + release: prometheus-stack + +# Disabled: memcached caches don't fit a memory-tight single node. +# SingleBinary works without them (slower repeated queries, fine at homelab scale). +resultsCache: + enabled: false +chunksCache: + enabled: false + +# Disabled: synthetic canary traffic + helm test pod, noise on a single node. +lokiCanary: + enabled: false +test: + enabled: false