Debian上Kubernetes日志管理指南
在Debian系统上管理Kubernetes(K8s)日志,需围绕收集→存储→查看/分析→轮转/清理全链路设计,以下是具体实施方案及最佳实践:
日志收集是日志管理的基础,需根据集群规模、资源预算选择方案:
EFK Stack(官方推荐)
由Elasticsearch(存储/索引)、Fluentd(收集/转发)、Kibana(可视化)组成,适合需要全文检索、复杂分析的场景(如大规模集群)。
/var/log/containers/*.log(容器日志)、/var/log/kubelet.log(kubelet日志)等文件,并转发至Elasticsearch。示例DaemonSet配置(简化版):apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd-logging
namespace: kube-system
spec:
selector:
matchLabels:
app: fluentd
template:
metadata:
labels:
app: fluentd
spec:
containers:
- name: fluentd
image: fluent/fluentd-kubernetes-daemonset:v1.16
env:
- name: FLUENT_ELASTICSEARCH_HOST
value: "elasticsearch.kube-system.svc.cluster.local" # Elasticsearch服务地址
- name: FLUENT_ELASTICSEARCH_PORT
value: "9200"
resources:
limits:
memory: 500Mi
requests:
cpu: 100m
memory: 200Mi
volumeMounts:
- name: varlog
mountPath: /var/log
- name: varlibdockercontainers
mountPath: /var/lib/docker/containers
readOnly: true
volumes:
- name: varlog
hostPath:
path: /var/log
- name: varlibdockercontainers
hostPath:
path: /var/lib/docker/containers
应用配置后,Fluentd会自动收集节点上所有容器的日志并发送至Elasticsearch。Filebeat(轻量替代)
若集群资源有限,可使用Filebeat(轻量级日志收集器)替代Fluentd。Filebeat部署为Sidecar容器,与业务Pod共享卷,收集容器日志并转发至Elasticsearch。示例Pod配置:
apiVersion: v1
kind: Pod
metadata:
name: payment-service
spec:
containers:
- name: app
image: payment:v1.2
volumeMounts:
- name: logs
mountPath: /var/log/app
- name: filebeat
image: docker.elastic.co/beats/filebeat:8.9
volumeMounts:
- name: logs
mountPath: /var/log/app
- name: filebeat-config
mountPath: /usr/share/filebeat/filebeat.yml
subPath: filebeat.yml
volumes:
- name: logs
emptyDir: {}
- name: filebeat-config
configMap:
name: filebeat-config # 需提前创建ConfigMap配置Filebeat(指向Elasticsearch地址)
Loki(轻量级替代)
由Grafana Labs开发的轻量级日志聚合系统,专为Kubernetes设计,资源消耗低,与Prometheus集成好,适合日志+监控统一管理的场景。需搭配Promtail(日志收集代理)使用,Promtail收集日志并发送至Loki,通过Grafana查询日志。
日志需长期保存,常见存储方案:
namespace=prod、pod_name=payment-service)。k8s-logs-*),使用Discover查看实时日志(支持按时间、命名空间、Pod名称过滤),通过Dashboard构建可视化面板(如错误日志数量趋势、Pod日志量排名)。kubectl logs:查看Pod日志(示例:kubectl logs -f payment-service-abcde -n prod 实时查看;kubectl logs --previous 查看容器重启前的日志;kubectl logs -c <container-name> 查看多容器Pod中指定容器的日志);kubectl logs结合grep/awk可实现简单过滤(如kubectl logs -f payment-service-abcde | grep "ERROR")。容器日志默认存储在节点/var/log/containers目录,需通过logrotate配置轮转规则,避免日志文件过大占用磁盘空间。示例/etc/logrotate.d/kubernetes-containers配置:
/var/lib/docker/containers/*/*.log {
daily # 每天轮转
rotate 7 # 保留7天
compress # 压缩旧日志(节省空间)
delaycompress # 延迟压缩(避免压缩正在写入的日志)
missingok # 忽略缺失的日志文件
notifempty # 空日志文件不轮转
create 0640 root root # 创建新日志文件的权限
}
此配置会每天轮转容器日志,保留最近7天的压缩日志,避免日志文件无限增长。
{"timestamp":"2025-11-07T12:00:00Z","level":"ERROR","message":"Database connection failed"}),便于后续提取字段(如时间戳、日志级别)进行分析。{"timestamp":"2025-11-07T12:00:00Z","host":"node-1","pod":"payment-service-abcde","namespace":"prod","request_id":"12345","message":"Order created successfully"}),方便关联日志事件(如跟踪一个请求的完整生命周期)。DEBUG,生产环境用INFO或WARNING),避免不必要的日志噪音(如生产环境中DEBUG日志过多会影响性能,且难以筛选关键信息)。