Kubernetes日志管理需覆盖收集→存储→查看/分析→轮转/清理→监控告警全链路,以下是具体操作步骤:
日志收集是基础,常见方案需根据集群规模、资源预算选择:
EFK由Elasticsearch(存储/索引)、Fluentd(收集/转发)、Kibana(可视化)组成,适合需要全文检索、复杂分析的场景。
/var/log/containers/*.log(容器日志)、/var/log/kubelet.log(kubelet日志)等文件,并转发至Elasticsearch。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地址)。
日志需长期保存,常见存储方案:
k8s-logs-*),使用Discover查看实时日志,Dashboard构建可视化面板(如错误日志趋势、Pod日志量排名)。namespace=prod、pod_name=payment-service)。kubectl logs:查看Pod日志(示例:kubectl logs -f payment-service-abcde -n prod 实时查看);kubectl logs --previous:查看容器重启前的日志;kubectl logs -c <container-name>:查看多容器Pod中指定容器的日志。容器日志默认存储在节点/var/log/containers目录,需通过logrotate配置轮转规则,避免日志文件过大。
示例/etc/logrotate.d/kubernetes-containers配置:
/var/lib/docker/containers/*/*.log { daily # 每天轮转 rotate 7 # 保留7天 compress # 压缩旧日志 delaycompress # 延迟压缩(避免压缩当天日志) missingok # 文件不存在不报错 notifempty # 空文件不轮转 copytruncate # 复制后截断原文件(不影响正在写入的日志) } 此配置会每天轮转Docker容器日志,保留最近7天的压缩日志,节省磁盘空间。
结合Prometheus+Alertmanager实现日志监控与告警:
groups: - name: k8s-log-alerts rules: - alert: HighErrorLogs expr: rate(elasticsearch_indices_indexing_slowlog_total[5m]) > 100 for: 5m labels: severity: critical annotations: summary: "K8s集群错误日志过多 (instance {{ $labels.instance }})" description: "5分钟内错误日志数超过100条,需立即排查" timestamp、level、message、pod_name等字段,便于后续检索和分析。DEBUG(调试)、INFO(常规)、WARN(警告)、ERROR(错误),设置不同保留策略(如ERROR日志保留30天,DEBUG日志保留7天)。grok、mutate)脱敏日志中的敏感信息(如银行卡号、密码)。resources.limits(如内存限制500Mi),避免因日志量过大导致节点OOM。通过以上步骤,可在CentOS环境的Kubernetes集群中实现高效的日志管理,满足故障排查、性能优化、安全审计等需求。