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 三种部署方式架构对比
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 接收端地址正确且负载均衡健康
✅ 设置合理的
✅ DaemonSet 中配置
✅ 使用
✅ 开启 Promtail 的
✅ 确认 Loki 接收端地址正确且负载均衡健康
✅ 设置合理的
positions.filename 持久化路径✅ DaemonSet 中配置
resources.requests 避免 OOMKill✅ 使用
relabel_configs 添加 namespace / pod / container 标签✅ 开启 Promtail 的
/metrics 端点接入监控告警