温馨提示×

centos部署k8s的日志管理怎么做

小樊
59
2025-10-05 06:31:50
栏目: 智能运维

CentOS部署K8s的日志管理实践指南

在CentOS上部署Kubernetes(K8s)集群后,日志管理是保障系统稳定性、快速排查问题的核心环节。以下是完整的日志管理方案,涵盖工具选择、部署步骤及最佳实践:

一、日志来源梳理

K8s集群的日志主要分为三类,需全面覆盖:

  1. 容器内部日志:应用通过stdout/stderr输出的日志(K8s默认采集);
  2. K8s组件日志:kubelet、kube-apiserver、kube-controller-manager等系统组件的日志;
  3. 节点操作系统日志:宿主机的系统日志(如/var/log/messages/var/log/syslog)。

二、常用日志收集方案

1. EFK Stack(官方推荐)

EFK(Elasticsearch + Fluentd + Kibana)是K8s生态中最成熟的日志解决方案,适合需要全文检索、复杂分析的场景。

  • Elasticsearch:分布式搜索引擎,用于存储和索引日志数据;
  • Fluentd:日志收集器(DaemonSet部署,每个节点一个实例),负责从容器、节点收集日志并转发至Elasticsearch;
  • Kibana:可视化工具,通过Dashboard展示日志趋势、查询异常信息。

部署步骤

  • Elasticsearch:通过Helm安装(helm repo add elastic https://helm.elastic.co && helm install elasticsearch elastic/elasticsearch),配置资源限制(如内存500Mi以上)以避免OOM;
  • Fluentd:使用官方DaemonSet配置(参考Fluentd Kubernetes DaemonSet),设置FLUENT_ELASTICSEARCH_HOST(指向Elasticsearch服务地址)、FLUENT_ELASTICSEARCH_PORT(默认9200);
  • Kibana:通过Helm安装(helm install kibana elastic/kibana),配置elasticsearch.hosts指向Elasticsearch服务,访问http://<k8s-master-ip>:5601进入可视化界面。

2. Loki + Promtail(轻量级替代)

Loki是Grafana Labs推出的轻量级日志聚合系统,适合大规模集群、低成本存储场景(无需索引,通过标签组织日志)。

  • Loki:日志存储服务,支持压缩和归档;
  • Promtail:日志收集器(DaemonSet部署),收集节点日志并发送至Loki;
  • Grafana:可视化工具,集成Loki实现日志查询和Dashboard展示。

部署步骤

  • Loki:通过Helm安装(helm repo add grafana https://grafana.github.io/helm-charts && helm install loki grafana/loki-stack),配置config.loki.persistence.enabled=true开启持久化;
  • Promtail:使用Helm安装(helm install promtail grafana/loki-stack --set promtail.enabled=true),配置server.filesystem.paths=["/var/log/containers/*.log"]指向容器日志路径;
  • Grafana:访问http://<k8s-master-ip>:3000,添加Loki数据源(URL指向Loki服务),创建Dashboard展示日志。

3. Filebeat(轻量级单容器收集)

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是关键参数,用于在不重启容器的情况下截断日志文件(适用于无法修改应用日志配置的场景)。

四、日常日志操作命令

  1. 查看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小时的日志)。
  2. 导出日志到文件

    kubectl logs <pod-name> > pod.log 2>&1
    

    用于将日志保存到本地进行分析(如提交给开发人员排查问题)。

五、日志管理最佳实践

  1. 日志分类与标记

    • 在日志中添加namespacepod_namedeployment_name等标签(通过Fluentd或Filebeat的fields配置),便于后续过滤和分析;
    • 示例(Fluentd配置):
      <record>
        kubernetes_namespace "#{ENV['KUBERNETES_NAMESPACE']}"
        kubernetes_pod_name "#{ENV['KUBERNETES_POD_NAME']}"
      </record>
      
  2. 敏感信息过滤

    • 使用Fluentd或Filebeat的filter插件过滤敏感数据(如银行卡号、密码),避免日志泄露;
    • 示例(Fluentd过滤银行卡号):
      <filter kubernetes.**>
        @type grep
        exclude1 /^(?=.*\d{4}[- ]?\d{4}[- ]?\d{4}[- ]?\d{4}).*$/
      </filter>
      
  3. 日志保留策略

    • 根据日志重要性设置保留时间(如业务日志保留7天,系统日志保留30天);
    • 结合Elasticsearch的ILM(Index Lifecycle Management)策略自动删除旧索引,或使用Loki的retention_period参数设置保留时间。
  4. 监控与告警

    • 使用Prometheus监控日志系统的关键指标(如Fluentd的内存使用率、Elasticsearch的索引速率);
    • 设置告警规则(如“Elasticsearch磁盘空间剩余<20%”触发告警),及时扩容或清理日志。

通过以上方案,可在CentOS上构建高效、可靠的K8s日志管理系统,满足日常运维、故障排查及审计需求。根据集群规模(如节点数量、日志量)和业务需求(如是否需要全文检索),选择合适的工具组合(EFK适合复杂分析,Loki适合轻量级场景)即可。

0