Loki · 集群日志聚合后端

Loki 是集群的日志聚合栈:一个单副本 grafana/loki Deployment 接收并存储日志,配套的 promtail DaemonSet 在每个节点上采集 Pod 日志并推送给 Loki,最终由 Grafana 作为数据源查询。

整套组件位于独立的 loki 命名空间,采用本地 filesystem 单体(single-binary)模式部署,auth_enabled: falsereplication_factor: 1、ring 使用 inmemory kvstore——这是单实例非 HA 的最简形态,适合 homelab 规模。manifest 全部在 applications/observability/loki/infrastructure/lokisecurity/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:tsdb store + filesystem object_store,schema v13,index 周期 24h;chunks 落在 /loki/chunks,tsdb index/cache 落在 /loki/tsdb-index/loki/tsdb-cache
  • 限流(limits_config):ingestion_rate_mb: 16ingestion_burst_size_mb: 32reject_old_samples: truereject_old_samples_max_age: 168h
  • 保留:retention_period: 720h(30 天);compactor 开启 retention_enabledcompaction_interval: 10mretention_delete_delay: 2hretention_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 grafanaPromtail 推日志、Grafana 查询
allow-from-argo-workflowsnamespace argo-workflowsArgo 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 总览

评论