Ubuntu上Kubernetes日志管理指南
在Ubuntu上部署的Kubernetes集群中,日志管理是保障系统稳定性、快速定位问题的核心环节。需覆盖收集→存储→查看/分析→轮转/清理→监控告警全链路,以下是具体实施方案:
日志收集是将分散在节点、容器中的日志汇总的关键步骤,需根据集群规模、资源预算选择方案:
EFK由**Fluentd(收集/转发)、Elasticsearch(存储/索引)、Kibana(可视化)**组成,适合需要全文检索、复杂日志分析的场景。
/var/log/containers/*.log)、kubelet日志(/var/log/kubelet.log)等,并转发至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(轻量级日志收集器)替代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地址)
可在Pod配置中指定日志驱动(如json-file),限制日志文件大小和数量:
apiVersion: v1
kind: Pod
metadata:
name: my-ubuntu-pod
spec:
containers:
- name: my-ubuntu-container
image: ubuntu:latest
logging:
driver: "json-file"
options:
max-size: "10m" # 单个日志文件最大10MB
max-file: "3" # 保留3个日志文件
日志需长期保存,常见存储方案根据需求选择:
Elasticsearch是分布式搜索和分析引擎,适合需要全文检索、复杂日志分析的场景(如错误日志趋势、Pod日志量排名)。需配置索引生命周期管理(ILM),自动清理旧日志(如保留30天),避免存储膨胀。
Loki是专为Kubernetes设计的轻量级日志聚合系统,资源消耗低,与Prometheus集成好,适合不需要全文检索但需要日志与监控数据关联的场景(如查看某个指标对应的日志)。
对象存储(如S3、MinIO)适合长期归档日志,成本低,但无法实时检索。可将旧日志(如超过30天的)自动归档至对象存储,节省Elasticsearch/Loki的存储空间。
通过Kibana创建索引模式(如k8s-logs-*),使用Discover查看实时日志,Dashboard构建可视化面板(如错误日志趋势、Pod日志量排名、按命名空间/Pod分组的日志量),快速定位问题。
若使用Loki,可通过Grafana的Explore功能查询日志,支持标签过滤(如namespace=prod、pod_name=payment-service)、时间范围选择,结合Prometheus指标实现日志与监控数据的关联分析。
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 {
rotate 7 # 保留7个日志文件
daily # 每天轮转
missingok # 文件不存在时不报错
notifempty # 文件为空时不轮转
compress # 压缩旧日志
delaycompress # 延迟压缩(避免压缩正在写入的日志)
sharedscripts # 所有日志轮转完成后执行脚本
postrotate
if [ -f /var/run/docker.sock ]; then
docker restart $(docker ps -q) # 重启Docker服务,重新打开日志文件
fi
endscript
}
结合Prometheus+Alertmanager实现日志监控与告警:
/var/log/containers/*.log),避免越权访问。cert-manager颁发证书),防止日志在传输过程中被篡改或泄露。record_transformer插件或Filebeat的processors模块,过滤日志中的敏感信息(如密码、API密钥),替换为****。{"timestamp":"2025-11-02T10:00:00Z","level":"ERROR","message":"Database connection failed","request_id":"12345"})。