Kubernetes集群的日志主要分为三类,需全面覆盖以确保可观测性:
stdout/stderr输出的日志(K8s默认采集,存储于节点/var/log/containers/*.log);/var/log/kube-*目录);/var/log/messages、/var/log/syslog,记录节点级别的事件)。根据集群规模、存储成本及功能需求,选择合适的日志管理方案:
适用场景:中大型集群、需要全文检索、复杂分析(如日志关键词搜索、聚合统计)及可视化。
组件职责:
DaemonSet形式部署在每个节点,收集节点上的容器日志、K8s组件日志及操作系统日志,通过过滤插件(如kubernetes_metadata)添加元数据(命名空间、Pod名、容器名),再转发至Elasticsearch;kubernetes.namespace: "default" AND log_level: "ERROR")。/var/log目录,确保访问所有日志文件;适用场景:中小规模集群、大规模日志量、低成本存储(无需索引,通过标签组织日志)。
组件职责:
DaemonSet形式部署,收集节点日志(/var/log/containers/*.log),通过解析插件(如提取level、message字段)处理日志,转发至Loki;namespace、pod_name、container_name)分类存储日志,而非全文索引,大幅降低存储开销;{namespace="default", pod_name="my-app"})及 dashboard 展示。适用场景:资源受限环境(如边缘节点)、已有Elasticsearch基础架构。
组件职责:
/var/log/containers/*.log文件变化,将日志转发至Elasticsearch(或通过Logstash预处理);1. 准备工作
kubeadm部署)且运行正常;curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
2. 部署Elasticsearch
使用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"
3. 部署Fluentd
使用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
4. 部署Kibana
使用Helm部署Kibana(连接Elasticsearch并实现可视化):
helm install kibana elastic/kibana \
--namespace logging \
--set elasticsearch.hosts=["elasticsearch.logging.svc.cluster.local:9200"] \
--set service.type=LoadBalancer
获取Kibana的外部IP(kubectl get svc -n logging kibana),通过浏览器访问http://<IP>:5601进入可视化界面。
5. 验证日志收集
kubernetes.*索引模式,即可查看容器日志;kubectl logs命令验证单个Pod日志:kubectl logs -f <pod-name> -n <namespace>
{"timestamp":"2025-10-24T12:00:00Z","level":"INFO","message":"User logged in"}),便于Fluentd/Elasticsearch解析;logrotate工具防止日志文件无限增长(如Docker容器日志配置示例):/var/lib/docker/containers/*/*.log {
daily
rotate 7
compress
missingok
notifempty
copytruncate
}