Ubuntu Kubernetes日志管理技巧
Ubuntu环境下Kubernetes日志管理需覆盖收集→存储→查看/分析→轮转/清理→监控告警全链路,确保日志高效采集、安全存储及快速定位问题。
通过DaemonSet在每个Ubuntu节点上运行1个日志收集器实例(如Fluentd),收集节点上/var/log/containers/*.log(容器标准输出/错误)、/var/log/kubelet.log(kubelet日志)等文件,转发至后端存储(如Elasticsearch)。此方式对应用无侵入,且一个节点仅需一个agent,资源占用低。
示例Fluentd 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
若应用日志需特殊处理(如格式转换、过滤),可在Pod中添加Sidecar容器(如Filebeat),与业务容器共享卷(emptyDir),收集业务容器日志并转发至后端。此方式适合需要细粒度控制的场景,但会增加资源占用。
示例Sidecar配置(Filebeat):
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
在业务容器中额外运行日志收集进程(如Fluent Bit),将日志发送至后端。此方式会增加容器复杂度,仅在特殊场景下使用。
分布式搜索和分析引擎,支持全文检索、日志聚合及复杂查询,适合需要深度分析日志的场景。需配置索引生命周期管理(ILM),自动清理旧日志(如保留30天)。
示例Elasticsearch配置(关键参数):
cluster.name: k8s-logs
node.name: elasticsearch-node-1
network.host: 0.0.0.0
discovery.seed_hosts: ["elasticsearch-node-1", "elasticsearch-node-2"]
cluster.initial_master_nodes: ["elasticsearch-node-1"]
专为Kubernetes设计的日志聚合系统,资源消耗低,与Prometheus集成好,适合日志+监控统一管理的场景。无需复杂的索引配置,直接通过标签(如namespace、pod_name)查询日志。
如S3、MinIO,将日志长期存储,成本低,但无法实时检索。适合合规性要求高的场景(如保留1年以上日志)。
通过Kibana创建索引模式(如kubernetes-logs-*),使用Discover查看实时日志,Dashboard构建可视化面板(如错误日志趋势、Pod日志量排名)。支持日志过滤(如namespace=prod)、聚合(如按Pod分组统计日志量)。
若使用Loki,可通过Grafana的Explore功能查询日志,支持标签过滤(如level=error)和时间范围选择。可与Prometheus联动,实现日志与监控数据的关联分析。
kubectl logs:查看Pod日志(示例:kubectl logs -f payment-service-abcde -n prod 实时查看);kubectl logs --previous:查看容器重启前的日志;kubectl logs -c <container-name>:查看多容器Pod中指定容器的日志。通过logrotate配置日志轮转规则,限制日志文件大小(如max-size: 100M)和保留天数(如rotate 7),避免/var/log/containers目录占用过多磁盘空间。
示例/etc/logrotate.d/kubernetes-containers配置:
/var/lib/docker/containers/*/*.log {
rotate 7
daily
compress
missingok
notifempty
sharedscripts
postrotate
systemctl restart docker # 重启Docker以重新生成日志文件
endscript
}
结合Prometheus+Alertmanager实现日志监控与告警:
elasticsearch_indices_docs_count、错误日志数rate(elasticsearch_indices_indexing_slowlog_total[5m]));groups:
- name: k8s-log-alerts
rules:
- alert: HighErrorLogs
expr: rate(elasticsearch_indices_indexing_slowlog_total[5m]) > 100
for: 5m
labels:
severity: critical
annotations:
summary: "K8s集群错误日志过多 (instance {{ $labels.instance }})"
description: "5分钟内错误日志数超过100条,需立即排查"
/var/log/containers/*.log);