CentOS部署K8s的日志管理实践指南
在CentOS上部署Kubernetes(K8s)集群后,日志管理是保障系统稳定性、快速排查问题的核心环节。以下是完整的日志管理方案,涵盖工具选择、部署步骤及最佳实践:
K8s集群的日志主要分为三类,需全面覆盖:
stdout/stderr输出的日志(K8s默认采集);/var/log/messages、/var/log/syslog)。EFK(Elasticsearch + Fluentd + Kibana)是K8s生态中最成熟的日志解决方案,适合需要全文检索、复杂分析的场景。
部署步骤:
helm repo add elastic https://helm.elastic.co && helm install elasticsearch elastic/elasticsearch),配置资源限制(如内存500Mi以上)以避免OOM;FLUENT_ELASTICSEARCH_HOST(指向Elasticsearch服务地址)、FLUENT_ELASTICSEARCH_PORT(默认9200);helm install kibana elastic/kibana),配置elasticsearch.hosts指向Elasticsearch服务,访问http://<k8s-master-ip>:5601进入可视化界面。Loki是Grafana Labs推出的轻量级日志聚合系统,适合大规模集群、低成本存储场景(无需索引,通过标签组织日志)。
部署步骤:
helm repo add grafana https://grafana.github.io/helm-charts && helm install loki grafana/loki-stack),配置config.loki.persistence.enabled=true开启持久化;helm install promtail grafana/loki-stack --set promtail.enabled=true),配置server.filesystem.paths=["/var/log/containers/*.log"]指向容器日志路径;http://<k8s-master-ip>:3000,添加Loki数据源(URL指向Loki服务),创建Dashboard展示日志。Filebeat是Elastic官方推出的轻量级日志收集器,适合资源受限的环境(如边缘节点),通常以Sidecar模式部署在Pod中(每个Pod运行一个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
readOnly: true
volumes:
- name: logs
emptyDir: {}
- name: filebeat-config
configMap:
name: filebeat-config
配置说明:通过ConfigMap定义filebeat.yml,设置filebeat.inputs指向容器日志路径(/var/log/app/*.log),输出至Elasticsearch或Logstash。
为避免日志文件无限增长占用磁盘空间,需使用logrotate工具进行自动轮转。以下是针对Docker容器日志的配置示例(保存为/etc/logrotate.d/docker):
/var/lib/docker/containers/*/*-json.log {
create 0644 root root
notifempty
missingok
copytruncate # 截断原日志文件,避免容器重启
rotate 7 # 保留7天日志
daily # 每天轮转一次
compress # 压缩旧日志
delaycompress # 延迟压缩(避免压缩当天日志)
}
说明:copytruncate是关键参数,用于在不重启容器的情况下截断日志文件(适用于无法修改应用日志配置的场景)。
查看Pod日志:
kubectl logs -f <pod-name> -c <container-name>(-f表示实时跟踪);kubectl logs --previous <pod-name> -c <container-name>(--previous查看前一个容器实例的日志);kubectl logs --since=1h <pod-name>(查看最近1小时的日志)。导出日志到文件:
kubectl logs <pod-name> > pod.log 2>&1
用于将日志保存到本地进行分析(如提交给开发人员排查问题)。
日志分类与标记:
namespace、pod_name、deployment_name等标签(通过Fluentd或Filebeat的fields配置),便于后续过滤和分析;<record>
kubernetes_namespace "#{ENV['KUBERNETES_NAMESPACE']}"
kubernetes_pod_name "#{ENV['KUBERNETES_POD_NAME']}"
</record>
敏感信息过滤:
filter插件过滤敏感数据(如银行卡号、密码),避免日志泄露;<filter kubernetes.**>
@type grep
exclude1 /^(?=.*\d{4}[- ]?\d{4}[- ]?\d{4}[- ]?\d{4}).*$/
</filter>
日志保留策略:
ILM(Index Lifecycle Management)策略自动删除旧索引,或使用Loki的retention_period参数设置保留时间。监控与告警:
通过以上方案,可在CentOS上构建高效、可靠的K8s日志管理系统,满足日常运维、故障排查及审计需求。根据集群规模(如节点数量、日志量)和业务需求(如是否需要全文检索),选择合适的工具组合(EFK适合复杂分析,Loki适合轻量级场景)即可。