# Loki — log aggregation (single-binary mode, local filesystem storage). # # Stores compressed, indexed pod logs shipped by Promtail. Queried by the # platform-engineer Hermes agent via the HTTP API (LogQL) and by Grafana. # # Storage: 20 GiB local PVC, 1-week retention enforced by the compactor. # Service: loki.monitoring:3100 (ClusterIP, no auth — homelab). --- apiVersion: v1 kind: ConfigMap metadata: name: loki-config namespace: monitoring data: loki.yaml: | auth_enabled: false server: http_listen_port: 3100 grpc_listen_port: 9096 common: path_prefix: /loki replication_factor: 1 ring: instance_addr: 127.0.0.1 kvstore: store: inmemory schema_config: configs: - from: 2024-01-01 store: tsdb object_store: filesystem schema: v13 index: prefix: index_ period: 24h storage_config: filesystem: directory: /loki/chunks tsdb_shipper: active_index_directory: /loki/tsdb-index cache_location: /loki/tsdb-cache limits_config: retention_period: 168h # 1 week max_query_series: 10000 reject_old_samples: true reject_old_samples_max_age: 168h allow_structured_metadata: false # tsdb v13 compat compactor: working_directory: /loki/compactor compaction_interval: 10m retention_enabled: true retention_delete_delay: 2h retention_delete_worker_count: 50 delete_request_store: filesystem analytics: reporting_enabled: false --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: loki-data namespace: monitoring spec: accessModes: - ReadWriteOnce resources: requests: storage: 20Gi --- apiVersion: apps/v1 kind: Deployment metadata: name: loki namespace: monitoring labels: app: loki spec: replicas: 1 strategy: type: Recreate # single-writer storage selector: matchLabels: app: loki template: metadata: labels: app: loki spec: nodeSelector: kubernetes.io/arch: amd64 # Loki image; runs on the NUC containers: - name: loki image: grafana/loki:3.4.4 args: - -config.file=/etc/loki/loki.yaml ports: - name: http containerPort: 3100 volumeMounts: - name: config mountPath: /etc/loki readOnly: true - name: data mountPath: /loki resources: requests: memory: "512Mi" cpu: "250m" limits: memory: "1Gi" cpu: "1000m" readinessProbe: httpGet: path: /ready port: 3100 initialDelaySeconds: 30 periodSeconds: 10 failureThreshold: 5 livenessProbe: httpGet: path: /ready port: 3100 initialDelaySeconds: 60 periodSeconds: 30 failureThreshold: 5 volumes: - name: config configMap: name: loki-config - name: data persistentVolumeClaim: claimName: loki-data --- apiVersion: v1 kind: Service metadata: name: loki namespace: monitoring spec: type: ClusterIP selector: app: loki ports: - name: http port: 3100 targetPort: 3100