温馨提示×

Kubernetes在Debian上的日志收集与分析

小樊
35
2025-12-19 02:12:43
栏目: 智能运维

整体架构与方案选型

  • Debian 节点上,Kubernetes 的日志通常分为三类:应用日志集群组件日志(如 kubelet、apiserver)、审计日志。采集方式以节点级 DaemonSet 为主,也可按应用选择 Sidecar 或宿主机直采。常见方案包括:
    • EFK(Elasticsearch + Fluentd + Kibana):适合需要强大检索与可视化的场景。
    • Loki + Grafana:更轻量,适合云原生与成本敏感场景。
    • Filebeat/Logstash + ES + Kibana:Beats 更轻量,Logstash 负责复杂处理。

快速落地 EFK 堆栈

  • 组件与版本建议
    • Elasticsearch 7.xFluentdKibana 7.x(示例采用 7.12.1,便于与示例镜像一致)。
  • 部署步骤
    1. 创建命名空间
      • kubectl create ns logging
    2. 部署 Elasticsearch
      • 示例 Service(elasticsearch/logging/svc.yaml)
        apiVersion: v1
        kind: Service
        metadata:
          name: elasticsearch
          namespace: logging
        spec:
          ports:
          - port: 9200
            clusterIP: None
          selector:
            app: elasticsearch
        
      • 示例 Deployment(elasticsearch/logging/deployment.yaml)
        apiVersion: apps/v1
        kind: Deployment
        metadata:
          name: elasticsearch
          namespace: logging
        spec:
          replicas: 1
          selector:
            matchLabels:
              app: elasticsearch
          template:
            metadata:
              labels:
                app: elasticsearch
            spec:
              containers:
              - name: elasticsearch
                image: docker.elastic.co/elasticsearch/elasticsearch:7.12.1
                ports:
                - containerPort: 9200
                - containerPort: 9300
        
      • 应用:kubectl apply -f elasticsearch/logging/svc.yaml -f elasticsearch/logging/deployment.yaml
    3. 部署 Fluentd DaemonSet(节点日志采集)
      • 示例(fluentd-ds.yaml)
        apiVersion: apps/v1
        kind: DaemonSet
        metadata:
          name: fluentd
          namespace: kube-system
        spec:
          selector:
            matchLabels:
              app: fluentd
          template:
            metadata:
              labels:
                app: fluentd
            spec:
              serviceAccountName: fluentd
              containers:
              - name: fluentd
                image: fluent/fluentd-kubernetes-daemonset:v1-debian-elasticsearch
                env:
                - name: FLUENT_ELASTICSEARCH_HOST
                  value: "elasticsearch.logging.svc.cluster.local"
                - name: FLUENT_ELASTICSEARCH_PORT
                  value: "9200"
        
      • 应用:kubectl apply -f fluentd-ds.yaml
    4. 部署 Kibana
      • 示例 Service(kibana/logging/svc.yaml,NodePort 便于访问)
        apiVersion: v1
        kind: Service
        metadata:
          name: kibana
          namespace: logging
        spec:
          type: NodePort
          ports:
          - port: 5601
            targetPort: 5601
            nodePort: 31000
          selector:
            app: kibana
        
      • 示例 Deployment(kibana/logging/deployment.yaml)
        apiVersion: apps/v1
        kind: Deployment
        metadata:
          name: kibana
          namespace: logging
        spec:
          replicas: 1
          selector:
            matchLabels:
              app: kibana
          template:
            metadata:
              labels:
                app: kibana
            spec:
              containers:
              - name: kibana
                image: docker.elastic.co/kibana/kibana:7.12.1
                ports:
                - containerPort: 5601
                env:
                - name: ELASTICSEARCH_HOSTS
                  value: "http://elasticsearch.logging.svc.cluster.local:9200"
        
      • 应用:kubectl apply -f kibana/logging/svc.yaml -f kibana/logging/deployment.yaml
    5. 访问与验证
      • 查看 Kibana:http://<任意节点IP>:31000
      • 在 Kibana 的 Discover 中创建索引模式(如 logstash-* 或 fluentd-*),开始检索日志。

替代方案 Loki + Grafana

  • 适用场景:希望更轻量、与 Kubernetes 标签/命名空间天然集成、成本更可控。
  • 核心思路:以 Promtail(DaemonSet)采集节点与容器日志,发送至 Loki;用 Grafana 进行查询与可视化。
  • 基本步骤
    • 部署 Loki(StatefulSet/Deployment + Service)
    • 部署 Promtail(DaemonSet,挂载 /var/log、/var/lib/docker/containers 等日志目录)
    • 部署 Grafana,添加 Loki 数据源,使用 LogQL 查询
  • 优点:资源占用更低、部署与维护更简单,适合中小规模或云原生环境。

日志轮换与节点侧维护

  • 容器运行时日志轮换
    • 若使用 Docker,确保 /etc/docker/daemon.json 启用日志驱动与轮换,例如:
      {
        "log-driver": "json-file",
        "log-opts": {
          "max-size": "100m",
          "max-file": "3"
        }
      }
      
    • 修改后重启 Docker:systemctl restart docker
  • 系统日志轮换
    • 使用 logrotate 管理 /var/log 下文件(如 messages、syslog、kubelet.log 等),控制单文件大小与保留份数,避免磁盘被占满。
  • 节点磁盘与资源监控
    • 监控 /var/log、/var/lib/docker 分区使用率,设置告警;为日志组件(ES、Fluentd)配置资源 requests/limits 与持久化。

安全与运维最佳实践

  • 访问控制与加密
    • Elasticsearch、Kibana、Fluentd 配置基于 RBAC 的最小权限;对外暴露服务时启用 TLS;敏感字段在传输与存储中加密。
  • 日志级别与噪声控制
    • 生产环境将应用与组件日志级别设为 WARN/ERROR 为主,必要时动态调高;在采集端做 去重/降噪采样
  • 持久化与容量规划
    • Elasticsearch 配置 PV/PVC 与合理副本数;定期评估索引生命周期(ILM)与冷热分层策略。
  • 审计与合规
    • 启用 Kubernetes 审计日志,将其单独采集与保留,避免与业务日志混流。
  • 可视化与告警
    • 使用 KibanaGrafana 建立关键指标与错误日志的 Dashboard,结合 告警规则 实现主动发现。

0