Kubernetes中如何将Promtail部署为Sidecar读取自定义路径日志
Promtail 采集Kubernetes Pod自定义路径日志方案
Sidecar 部署方案原理与示例
运行原理
Sidecar模式无需修改集群全局配置,只需在业务Pod中新增一个Promtail容器,通过共享存储卷实现日志访问:
- 业务容器将日志写入
/var/log/myapp目录,该目录通过emptyDir或共用持久卷挂载 - 同Pod内的Promtail容器同步挂载该存储卷,直接读取目录下的日志文件,经过过滤、打标签后推送至Loki
配置示例
- 首先创建Promtail配置ConfigMap:
apiVersion: v1 kind: ConfigMap metadata: name: promtail-sidecar-config data: promtail.yaml: | server: http_listen_port: 9080 grpc_listen_port: 0 positions: filename: /tmp/positions.yaml clients: - url: http://loki:3100/loki/api/v1/push scrape_configs: - job_name: myapp-log static_configs: - targets: - localhost labels: job: myapp __path__: /var/log/myapp/*.log
- 业务Deployment中加入Sidecar配置:
apiVersion: apps/v1 kind: Deployment metadata: name: myapp spec: replicas: 1 selector: matchLabels: app: myapp template: metadata: labels: app: myapp spec: containers: # 业务容器 - name: myapp image: myapp:v1 volumeMounts: - name: log-volume mountPath: /var/log/myapp # Promtail Sidecar容器 - name: promtail image: grafana/promtail:2.8.2 args: - -config.file=/etc/promtail/promtail.yaml volumeMounts: - name: log-volume mountPath: /var/log/myapp - name: promtail-config mountPath: /etc/promtail volumes: - name: log-volume emptyDir: {} - name: promtail-config configMap: name: promtail-sidecar-config
DaemonSet 部署方案说明
Promtail 不是必须部署为Sidecar,DaemonSet是更通用的集群级采集方案,适合业务日志路径相对统一的场景。
运行原理
- Promtail以DaemonSet形式运行在集群每个节点上,默认挂载节点的
/var/log/pods、/var/lib/docker/containers等日志目录 - 针对自定义路径的日志,只需将业务Pod的日志目录通过
hostPath挂载到节点固定路径,或者配置Promtail的Kubernetes服务发现规则,自动识别Pod的日志挂载路径即可完成采集
核心配置片段
Promtail 采集配置中增加自定义路径的抓取规则:
scrape_configs: - job_name: kubernetes-pods-custom-log kubernetes_sd_configs: - role: pod relabel_configs: - action: keep regex: true source_labels: - __meta_kubernetes_pod_annotation_promtail_io_scrape - action: replace regex: (.*) source_labels: - __meta_kubernetes_pod_annotation_promtail_io_path target_label: __path__ - action: replace source_labels: - __meta_kubernetes_namespace target_label: namespace - action: replace source_labels: - __meta_kubernetes_pod_name target_label: pod
给业务Pod加上对应的注解即可自动被采集:
annotations: promtail.io/scrape: "true" promtail.io/path: "/var/log/myapp/*.log"
方案选型建议
- 若不同业务的日志采集规则差异大、需要高度自定义,优先选Sidecar方案
- 若集群业务规模大、日志路径统一,优先选DaemonSet方案,资源开销更低、运维更简单
内容的提问来源于stack exchange,提问作者FestiveHydra235
相关产品推荐
相关产品推荐

