CentOS上K8s日志收集方案设计与实施
在CentOS系统上部署Kubernetes(K8s)集群时,日志收集是保障应用可观测性的核心环节。K8s的日志主要来自三个层面:容器内部日志(应用通过stdout/stderr输出的日志)、K8s组件日志(kubelet、kube-apiserver等系统组件的日志)、节点操作系统日志(宿主机系统日志)。针对这些日志来源,需采用合适的工具链实现集中化收集、存储、分析与可视化。
EFK是K8s官方推荐的经典日志方案,适合需要复杂日志解析、大规模存储及可视化分析的场景。
/var/log/containers/*.log(容器日志)、/var/log/kube-apiserver.log(K8s组件日志)等日志文件,通过过滤插件(如解析JSON格式、提取时间戳)处理日志,并转发至Elasticsearch。Loki是Grafana Labs推出的轻量级日志聚合系统,专注于高吞吐、低存储成本,适合云原生环境;搭配Fluent Bit(轻量级日志收集器)可实现高效日志收集。
/var/log/containers/*.log),通过解析插件(如提取日志中的level、message字段)处理日志,转发至Loki。namespace、pod_name、container_name),而非全文索引,大幅降低存储开销;支持与Grafana集成,实现日志的快速查询(如{namespace="default", pod_name="my-app"})。Filebeat是Elastic公司推出的轻量级日志收集器,适合资源受限的环境(如边缘节点),或已有Elasticsearch基础架构的场景。
/var/log/containers/*.log文件的变化,将日志转发至Elasticsearch(或通过Logstash进行预处理)。curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
使用Helm部署Elasticsearch(单节点模式,生产环境建议使用StatefulSet+多副本):
helm repo add elastic https://helm.elastic.co
helm install elasticsearch elastic/elasticsearch \
--namespace logging \
--set replicas=1 \
--set resources.requests.cpu="500m" \
--set resources.requests.memory="2Gi"
使用Helm部署Fluentd DaemonSet(收集节点日志并转发至Elasticsearch):
helm repo add fluent https://fluent.github.io/helm-charts
helm install fluentd fluent/fluentd \
--namespace logging \
--set daemonset.enabled=true \
--set elasticsearch.host="elasticsearch.logging.svc.cluster.local" \
--set elasticsearch.port=9200
使用Helm部署Kibana(连接Elasticsearch并实现可视化):
helm install kibana elastic/kibana \
--namespace logging \
--set elasticsearch.hosts=["elasticsearch.logging.svc.cluster.local:9200"] \
--set service.type=LoadBalancer
kubectl get svc -n logging kibana获取外部IP),进入Discover页面,选择kubernetes.*索引模式,即可查看容器日志。kubectl logs命令验证单个Pod日志:kubectl logs -f <pod-name> -n <namespace>
使用logrotate工具防止日志文件无限增长(如Docker容器日志),配置示例(/etc/logrotate.d/docker):
/var/lib/docker/containers/*/*.log {
daily
rotate 7
compress
missingok
notifempty
copytruncate
}
该配置表示:每天轮转日志,保留7天,压缩旧日志,清空原日志文件(不影响应用运行)。
应用日志建议采用JSON格式输出(如Spring Boot应用配置logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n),便于Fluentd/Elasticsearch解析(提取timestamp、level、message等字段),提高日志查询效率。
在Fluentd配置中添加过滤插件,屏蔽日志中的敏感信息(如密码、API密钥):
<filter kubernetes.**>
@type record_transformer
enable_ruby true
<record>
message ${(record["message"] || "").gsub(/password=[^&]*/, "password=****")}
</record>
</filter>
根据日志级别(ERROR、WARN、INFO)将日志存储至不同索引(如Elasticsearch中创建k8s-error-logs-*、k8s-warn-logs-*索引),减少不必要的存储开销(如ERROR日志保留30天,INFO日志保留7天)。
使用Prometheus监控Elasticsearch、Fluentd的集群状态(如节点健康、磁盘使用率),并通过Grafana设置告警规则(如Elasticsearch磁盘使用率超过80%时触发告警)。
通过以上方案与实践,可在CentOS系统上实现K8s集群的高效日志收集与管理,为应用运维、故障排查提供有力支持。