apiVersion: source.toolkit.fluxcd.io/v1 kind: HelmRepository metadata: name: grafana namespace: monitoring spec: interval: 24h url: https://grafana.github.io/helm-charts --- apiVersion: helm.toolkit.fluxcd.io/v2 kind: HelmRelease metadata: name: loki namespace: monitoring spec: interval: 30m chart: spec: chart: loki version: ">=6.0.0" sourceRef: kind: HelmRepository name: grafana namespace: monitoring install: remediation: retries: 3 upgrade: remediation: retries: 3 values: deploymentMode: SingleBinary loki: auth_enabled: false commonConfig: replication_factor: 1 storage: type: filesystem limits_config: retention_period: 2160h ingestion_rate_mb: 10 ingestion_burst_size_mb: 20 max_streams_per_user: 10000 max_query_length: 720h max_entries_limit_per_query: 5000 schemaConfig: configs: - from: "2024-01-01" store: tsdb object_store: filesystem schema: v13 index: prefix: loki_index_ period: 24h singleBinary: replicas: 1 persistence: enabled: true storageClass: ceph-block size: 80Gi # Chart ships no defaults. Without a memory limit the pod is OOM- # killed by the kernel when WAL replay / large queries spike RSS # (lost loki-0 once on 2026-05-14 to exit 137 during initial # install). Steady-state RSS is ~540Mi at current ingest (~37 # lines/sec); 2Gi limit gives 4x headroom for replay/query bursts. # CPU is left unlimited so queries can burst. resources: requests: cpu: 100m memory: 512Mi limits: memory: 2Gi gateway: enabled: false chunksCache: enabled: false resultsCache: enabled: false # Disable components not needed in SingleBinary mode backend: replicas: 0 read: replicas: 0 write: replicas: 0 --- apiVersion: helm.toolkit.fluxcd.io/v2 kind: HelmRelease metadata: name: alloy namespace: monitoring spec: interval: 30m chart: spec: chart: alloy version: ">=0.12.0" sourceRef: kind: HelmRepository name: grafana namespace: monitoring install: remediation: retries: 3 upgrade: remediation: retries: 3 values: alloy: configMap: content: | // Discover and collect K8s pod logs 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.monitoring.svc.cluster.local:3100/loki/api/v1/push" } }