Skip to main content

k8s-loki-Promtail收集日志

在Kubernetes(K8s)环境中,Promtail通常通过DaemonSet部署以自动为集群中的每个节点上的Pod捕获日志。以下是一个针对部署在K8s中的Java应用的日志捕获配置示例:

promtail-config.yaml

server:
http_listen_port: 9080

positions:
filename: /tmp/promtail_positions.yaml

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

scrape_configs:
- job_name: kubernetes-pods
kubernetes_sd_configs:
- role: pod # 从Kubernetes获取Pods的信息
relabel_configs:
- source_labels: [__meta_kubernetes_pod_annotation_promtail_io_scrape] # 检查是否有标注为promtail.io/scrape=true的注解
action: keep
regex: true
- source_labels: [__meta_kubernetes_pod_annotation_promtail_io_path] # 获取指定的日志路径注解
target_label: __path__
replacement: /var/log/pods/${__meta_kubernetes_pod_name}/${__meta_kubernetes_pod_container_name}/stderr.log # 替换为默认的日志文件路径
action: replace
- source_labels: [__meta_kubernetes_pod_name, __meta_kubernetes_pod_namespace] # 添加labels以便在Loki中区分来源
separator: /
target_label: k8s_app
- source_labels: [__meta_kubernetes_pod_container_name]
target_label: container
pipeline_stages:
- match:
selector: '{container="java"}' # 如果是Java应用的日志容器
stages:
- regex:
expression: '^(\w+\s+\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2},\d{3})\s+(.+)$' # 解析Java应用典型的日志格式
fields: ['timestamp', 'message'] # 匹配时间和消息字段

在这个配置中:

Promtail通过Kubernetes服务发现(kubernetes_sd_configs)自动找到集群中的Pod。

relabel_configs 部分用于筛选那些具有promtail.io/scrape: "true"注解的Pod,并从Pod的日志路径读取日志。

pipeline_stages 是一个可选配置,用于在发送日志到Loki前对其进行预处理,如正则表达式解析,这里举例的是针对常见的Java应用日志格式。

在实际部署时,需要确保在Kubernetes Pod的模板(Deployment、StatefulSet等)中添加适当的注解来指示Promtail抓取其日志,例如:

apiVersion: apps/v1
kind: Deployment
metadata:
name: my-java-app
spec:
template:
metadata:
annotations:
promtail.io/scrape: "true"
promtail.io/path: "/logs/my-java-app.log" # 如果Java应用的日志不是默认路径,则在此指定

最后,将Promtail通过DaemonSet部署到Kubernetes集群,并挂载配置文件和必要的日志目录:

apiVersion: apps/v1
kind: DaemonSet
metadata:
name: promtail
spec:
selector:
matchLabels:
app: promtail
template:
metadata:
labels:
app: promtail
spec:
serviceAccountName: promtail # 需要有足够的权限读取Pod日志
containers:
- name: promtail
image: grafana/promtail:vX.Y.Z # 使用适当的Promtail镜像版本
volumeMounts:
- name: config-volume
mountPath: /etc/promtail/
readOnly: true
- name: varlog
mountPath: /var/log
- name: varlibdockercontainers
mountPath: /var/lib/docker/containers
readOnly: true
volumes:
- name: config-volume
configMap:
name: promtail-config
- name: varlog
hostPath:
path: /var/log
- name: varlibdockercontainers
hostPath:
path: /var/lib/docker/containers

请确保替换以上示例中的实际镜像版本号 (vX.Y.Z) 以及适配您实际环境的日志路径和注解。同时,需要创建一个名为 promtail-config 的ConfigMap来包含Promtail的配置文件。