Loki · 集群日志聚合后端
Loki 是集群的日志聚合栈:一个单副本 grafana/loki Deployment 接收并存储日志,配套的 promtail DaemonSet 在每个节点上采集 Pod 日志并推送给 Loki,最终由 Grafana 作为数据源查询。
整套组件位于独立的 loki 命名空间,采用本地 filesystem 单体(single-binary)模式部署,auth_enabled: false、replication_factor: 1、ring 使用 inmemory kvstore——这是单实例非 HA 的最简形态,适合 homelab 规模。manifest 全部在 applications/observability/loki/,infrastructure/loki 与 security/loki 目录均为空。
部署形态
Loki 本体是 Deployment,Promtail 是覆盖每个节点的 DaemonSet,两者同处 loki 命名空间。
- Name
- 命名空间
- Description
- loki
- Name
- 工作负载
- Description
- loki:Deployment(replicas 1,RollingUpdate maxSurge/maxUnavailable 25%);promtail:DaemonSet(每节点一个,updateStrategy maxUnavailable 1 / maxSurge 0)
- Name
- 镜像
- Description
- grafana/loki:3.7.2;grafana/promtail:3.6.11
- Name
- 调度
- Description
- loki 用 nodeSelector workload: infra(实际落在 worker3,即唯一的 infra 节点);promtail DaemonSet 无 nodeSelector,覆盖全部节点
- Name
- 端口
- Description
- loki 容器端口 3100(http);promtail http_listen_port 9080
- Name
- 存储
- Description
- PVC loki-data,50Gi,storageClass nfs-client,accessMode ReadWriteMany,挂载到 /loki
- Name
- 资源
- Description
- loki requests 500m/1Gi,limits 1000m/2Gi;promtail requests 50m/128Mi,limits 200m/256Mi
命名空间还带 ResourceQuota(hard:limits.cpu 5 / limits.memory 8Gi / pods 12 / PVC 3)和 LimitRange(容器默认 request 150m/256Mi、default limit 500m/512Mi),约束整个 loki 命名空间的资源占用。
配置与依赖
Loki 配置由 ConfigMap loki-config(挂载到 /etc/loki/loki.yaml)提供,全部走本地存储,不依赖对象存储或外部数据库。
- schema:
tsdbstore +filesystemobject_store,schema v13,index 周期 24h;chunks 落在/loki/chunks,tsdb index/cache 落在/loki/tsdb-index与/loki/tsdb-cache。 - 限流(limits_config):
ingestion_rate_mb: 16、ingestion_burst_size_mb: 32,reject_old_samples: true且reject_old_samples_max_age: 168h。 - 保留:
retention_period: 720h(30 天);compactor 开启retention_enabled,compaction_interval: 10m、retention_delete_delay: 2h、retention_delete_worker_count: 150,并设delete_request_store: filesystem(Loki 3.x 启用保留时必需)。
Promtail 配置见 ConfigMap(promtail-config-collectors.yaml 内的 promtail.yaml),推送目标为 http://loki.loki.svc:3100/loki/api/v1/push,batchwait 1s、batchsize 1MiB、最多重试 10 次。采集逻辑通过 hostPath 挂载节点日志:/var/log(含 /var/log/pods)只读,以及 k3s containerd 日志目录 /var/lib/rancher/k3s/agent/containerd(挂到容器内 /var/lib/docker/containers,只读)。pipeline 从文件路径正则提取 namespace/pod/container 作为标签,做多行堆栈合并、日志 level 提取与 JSON 解析。Promtail 使用专用 ServiceAccount promtail。
本组件不使用 ExternalSecret,无 Vault 密钥依赖。
访问与监控
Service loki 为 ClusterIP,端口 3100(targetPort 3100),仅集群内访问,无 Ingress——对外查询入口是 Grafana。
NetworkPolicy 控制谁能访问 loki 命名空间内的 Pod(默认拒绝其余 Ingress):
| 策略 | 允许来源 | 用途 |
|---|---|---|
| allow-ingress | 同命名空间 podSelector + namespace grafana | Promtail 推日志、Grafana 查询 |
| allow-from-argo-workflows | namespace argo-workflows | Argo Workflows 访问 |
可用性方面:PodDisruptionBudget loki(maxUnavailable 1,匹配 app: loki);VPA loki-vpa(updateMode Recreate,minAllowed 100m/128Mi、maxAllowed 2 CPU/4Gi)。
仓库内还带一份 Grafana dashboard ConfigMap(configmaps-loki-dashboard.yaml)。当前目录下没有 ServiceMonitor、PrometheusRule 或 HPA。
返回 observability 总览