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集群的高效日志收集與管理,為應用運維、故障排查提供有力支持。