4、Promtail 基础部署:二进制部署、Docker 部署、Kubernetes DaemonSet 部署,最小化配置示例

Promtail 是 Loki 官方的日志采集 Agent,负责从各类目标(日志文件、Systemd Journal、Docker 控制台等)抓取日志流,添加标签后推送至 Loki。本章围绕三种主流部署方式——二进制、Docker 容器、Kubernetes DaemonSet——给出最小化配置示例,并对比其适用场景与资源特征。

4.1 部署方式对比总览

部署方式 适用环境 资源开销(基准) 配置复杂度 日志源类型
二进制 物理机 / 虚拟机 / 边缘节点 ~15–30 MB 内存 低(单文件配置) 本地文件、Journal
Docker 容器 单机容器化环境 / 测试验证 ~20–40 MB 内存 中(需挂载卷) 宿主机文件、容器 stdout
K8s DaemonSet Kubernetes 集群(生产推荐) ~30–60 MB 内存 / 节点 中高(RBAC + ConfigMap) Pod 日志、节点文件
选型建议:生产 K8s 环境优先使用 DaemonSet 模式,确保每个节点一个 Agent 实例,自动发现 Pod 日志;非容器化环境使用二进制部署;临时测试或边缘场景使用 Docker 部署。

4.2 二进制部署(最小化配置)

二进制部署适合直接运行在 Linux 主机上,无需容器运行时依赖。下载对应平台的 Promtail 二进制文件后,只需一个 YAML 配置文件即可启动。

4.2.1 下载与启动

# 下载 Promtail(以 v2.9.x 为例)
wget https://github.com/grafana/loki/releases/download/v2.9.0/promtail-linux-amd64.zip
unzip promtail-linux-amd64.zip

# 赋予执行权限
chmod +x promtail-linux-amd64

# 启动(指定配置文件)
./promtail-linux-amd64 -config.file=promtail-local.yaml

4.2.2 最小化配置示例

# promtail-local.yaml
server:
  http_listen_port: 9080
  grpc_listen_port: 0

positions:
  filename: /tmp/positions.yaml

clients:
  - url: http://localhost:3100/loki/api/v1/push

scrape_configs:
  - job_name: system
    static_configs:
      - targets: [localhost]
        labels:
          job: varlogs
          __path__: /var/log/*.log
关键字段说明:
positions.filename:记录已读取的日志偏移量,防止重复推送。
clients[0].url:Loki 接收地址,生产环境应替换为负载均衡器地址。
scrape_configs[0].static_configs[0].labels.__path__:日志文件通配路径,支持 glob 模式。

4.3 Docker 部署(最小化配置)

Docker 部署将 Promtail 运行在容器内,通过卷挂载访问宿主机日志文件。适用于已有 Docker 环境的单机或测试场景。

4.3.1 启动命令

docker run -d \
  --name promtail \
  -v /var/log:/var/log:ro \
  -v /etc/promtail:/etc/promtail:ro \
  -p 9080:9080 \
  grafana/promtail:2.9.0 \
  -config.file=/etc/promtail/promtail-docker.yaml

4.3.2 最小化配置示例

# promtail-docker.yaml
server:
  http_listen_port: 9080
  grpc_listen_port: 0

positions:
  filename: /run/promtail/positions.yaml

clients:
  - url: http://loki:3100/loki/api/v1/push

scrape_configs:
  - job_name: docker-logs
    static_configs:
      - targets: [localhost]
        labels:
          job: docker
          __path__: /var/log/*.log
注意:Docker 部署时,positions.yaml 文件必须写入容器内可写路径(如 /run/promtail/),否则容器重启后会丢失偏移量,导致日志重复推送。

4.4 Kubernetes DaemonSet 部署(最小化配置)

K8s DaemonSet 是生产环境推荐方式,确保每个 Node 运行一个 Promtail Pod,自动采集所有 Pod 的标准输出日志。需要配置 ServiceAccount、ClusterRole 和 ConfigMap。

4.4.1 最小化 YAML 清单

# promtail-daemonset.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: promtail
  namespace: loki
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: promtail
rules:
  - apiGroups: [""]
    resources: ["nodes", "nodes/proxy", "services", "endpoints", "pods"]
    verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: promtail
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: promtail
subjects:
  - kind: ServiceAccount
    name: promtail
    namespace: loki
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: promtail-config
  namespace: loki
data:
  promtail.yaml: |
    server:
      http_listen_port: 9080
      grpc_listen_port: 0
    positions:
      filename: /run/promtail/positions.yaml
    clients:
      - url: http://loki-gateway.loki.svc.cluster.local:3100/loki/api/v1/push
    scrape_configs:
      - job_name: kubernetes-pods
        kubernetes_sd_configs:
          - role: pod
        relabel_configs:
          - source_labels: [__meta_kubernetes_pod_label_app]
            target_label: app
          - source_labels: [__meta_kubernetes_namespace]
            target_label: namespace
          - source_labels: [__meta_kubernetes_pod_name]
            target_label: pod
          - source_labels: [__meta_kubernetes_pod_container_name]
            target_label: container
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: promtail
  namespace: loki
spec:
  selector:
    matchLabels:
      app: promtail
  template:
    metadata:
      labels:
        app: promtail
    spec:
      serviceAccountName: promtail
      containers:
        - name: promtail
          image: grafana/promtail:2.9.0
          args:
            - -config.file=/etc/promtail/promtail.yaml
          volumeMounts:
            - name: config
              mountPath: /etc/promtail
            - name: run
              mountPath: /run/promtail
            - name: pod-logs
              mountPath: /var/log/pods
              readOnly: true
          resources:
            requests:
              memory: "32Mi"
              cpu: "50m"
            limits:
              memory: "128Mi"
              cpu: "200m"
      volumes:
        - name: config
          configMap:
            name: promtail-config
        - name: run
          emptyDir: {}
        - name: pod-logs
          hostPath:
            path: /var/log/pods
资源优化提示:DaemonSet 配置中已设置 requests.memory: 32Mi,这是经过生产验证的最小稳定值。如果集群节点日志量极大(>100 MB/s),建议将 limits.memory 提升至 256Mi 并配合下文第 5 章的 Pipeline 过滤策略。

4.5 三种部署方式架构对比

Promtail 三种部署方式架构对比 二进制部署 • 直接运行在宿主机 • 读取 /var/log/*.log • 内存开销 ~15–30 MB 适用:物理机 / 虚拟机 / 边缘 Docker 容器部署 • 容器内运行 • 挂载宿主机 /var/log • 内存开销 ~20–40 MB 适用:单机容器 / 测试验证 K8s DaemonSet 部署 • 每个 Node 一个 Pod • 自动发现 Pod 日志 • 内存开销 ~30–60 MB 适用:K8s 集群(生产推荐) 核心差异总结 1. 二进制:最轻量,适合非容器化环境,配置简单。 2. Docker:隔离性好,适合快速验证,需注意挂载路径。 3. DaemonSet:生产首选,自动发现 + 标签丰富,资源开销略高但可控。

4.6 部署验证与常见问题

4.6.1 验证日志是否成功推送

# 查看 Promtail 自身日志(二进制 / Docker)
tail -f /var/log/promtail.log

# 查看 Promtail 指标端点(所有部署方式)
curl http://localhost:9080/metrics | grep promtail_read_bytes_total

# 在 Loki 中查询刚推送的日志(使用 LogCLI)
logcli query '{job="varlogs"}' --limit=5

4.6.2 常见问题排查

现象 可能原因 解决措施
日志未推送 Loki 地址不可达 / 防火墙拦截 检查 clients.url 连通性;查看 Promtail 日志中的 HTTP 错误码
日志重复推送 positions.yaml 丢失或权限不足 确保 positions 文件写入持久化路径;DaemonSet 使用 emptyDir 需注意重启行为
内存持续增长 日志量过大且未配置 Pipeline 过滤 添加 drop 或 regex 阶段过滤无用行;参考第 5 章优化策略
DaemonSet Pod 启动失败 RBAC 权限不足 / ConfigMap 挂载错误 检查 ServiceAccount 绑定;确认 ConfigMap 名称与 volume 引用一致
生产部署检查清单:
✅ 确认 Loki 接收端地址正确且负载均衡健康
✅ 设置合理的 positions.filename 持久化路径
✅ DaemonSet 中配置 resources.requests 避免 OOMKill
✅ 使用 relabel_configs 添加 namespace / pod / container 标签
✅ 开启 Promtail 的 /metrics 端点接入监控告警