温馨提示×

Kubernetes在Debian上的日志管理怎么做

小樊
41
2025-11-11 12:53:57
栏目: 智能运维

Kubernetes在Debian上的日志管理方案
在Debian系统上管理Kubernetes(K8s)集群日志,核心目标是实现日志收集、集中存储、可视化分析及长期可维护性。以下是具体实施方法及最佳实践:

一、基础日志查看工具

在搭建复杂日志系统前,可通过kubectl logs命令快速获取Pod日志,这是最基础的排查工具:

# 查看指定Pod的实时日志
kubectl logs <pod-name>

# 查看Pod中特定容器的日志(多容器Pod需指定容器名)
kubectl logs <pod-name> -c <container-name>

# 查看最近100行日志(结合tail命令)
kubectl logs <pod-name> | tail -n 100

若Pod已崩溃,可通过--previous参数查看上一个容器的日志:

kubectl logs <pod-name> --previous

二、常用日志管理工具组合

1. EFK Stack(Elasticsearch + Fluentd + Kibana)

EFK是K8s生态中最成熟的日志管理方案,适合需要全文检索、复杂分析的场景。

  • Fluentd部署(DaemonSet模式)
    Fluentd作为日志收集器,以DaemonSet形式运行在每个节点上,收集节点及Pod日志。创建fluentd-daemonset.yaml配置文件:

    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
      name: fluentd
      namespace: kube-system
    spec:
      selector:
        matchLabels:
          name: fluentd
      template:
        metadata:
          labels:
            name: fluentd
        spec:
          serviceAccountName: fluentd
          terminationGracePeriodSeconds: 30
          dnsPolicy: ClusterFirstWithHostNet
          containers:
          - name: fluentd
            image: fluent/fluentd-kubernetes-daemonset:v1-debian-elasticsearch
            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
    

    应用配置:kubectl apply -f fluentd-daemonset.yaml

  • Elasticsearch部署
    作为日志存储后端,需创建StatefulSet保证数据持久化。示例elasticsearch.yaml

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: elasticsearch
      namespace: kube-system
    spec:
      serviceName: "elasticsearch"
      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
            volumeMounts:
            - name: es-persistent-storage
              mountPath: /usr/share/elasticsearch/data
      volumeClaimTemplates:
      - metadata:
          name: es-persistent-storage
        spec:
          accessModes: ["ReadWriteOnce"]
          resources:
            requests:
              storage: 20Gi
    

    应用配置:kubectl apply -f elasticsearch.yaml

  • Kibana部署与配置
    作为可视化工具,需连接Elasticsearch并创建仪表板。示例kibana.yaml

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: kibana
      namespace: kube-system
    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:9200"
    

    应用配置后,通过kubectl port-forward暴露Kibana服务(如kubectl port-forward svc/kibana 5601:5601),访问http://localhost:5601即可查看日志。

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

若不需要复杂的全文检索,Loki是更轻量、资源消耗更低的选择,适合指标与日志关联场景(如Grafana生态)。

  • Loki部署
    通过Helm快速部署Loki(需提前安装Helm):

    helm repo add grafana https://grafana.github.io/helm-charts
    helm install loki grafana/loki-stack --namespace=logging --create-namespace --set promtail.enabled=true
    ```。  
    
    
  • Promtail配置
    Promtail作为日志收集器,需配置promtail.yaml收集K8s Pod日志:

    server:
      http_listen_port: 9080
      grpc_listen_port: 0
    
    positions:
      filename: /tmp/positions.yaml
    
    clients:
      - url: http://loki:3100/loki/api/v1/push
    
    scrape_configs:
    - job_name: kubernetes-pods
      kubernetes_sd_configs:
      - role: pod
      pipeline_stages:
      - cri: {}  # 解析容器日志格式
      - labeldrop:
        - filename
    

    部署Promtail:kubectl apply -f promtail.yaml

  • Grafana集成
    登录Grafana(默认地址http://<grafana-ip>:3000),添加Loki为数据源(配置地址为http://loki:3100),即可通过Explore功能查询日志。

三、日志轮转策略

为防止日志文件过大占用磁盘空间,需配置日志轮转

  • 容器内日志轮转
    使用Kubernetes的json-file日志驱动(默认),通过kubelet参数配置轮转大小和数量:
    编辑/etc/kubernetes/kubelet.conf(或通过kubeadm config view获取配置路径),添加:

    kubeletArguments:
      log-dir: ["/var/log/kubelet"]
      log-file-max-size: ["100Mi"]  # 单个日志文件最大100MB
      log-file-max-backups: ["5"]   # 保留5个备份
      log-file-max-age: ["7"]       # 保留7天
    

    重启kubelet使配置生效:systemctl restart kubelet

  • 系统日志轮转
    使用logrotate工具管理系统日志(如/var/log/syslog/var/log/kern.log),编辑/etc/logrotate.conf或创建自定义配置文件(如/etc/logrotate.d/k8s):

    /var/log/kubelet/*.log {
        daily
        rotate 7
        compress
        missingok
        notifempty
        create 0640 root root
    }
    

    手动测试轮转:logrotate -vf /etc/logrotate.d/k8s

四、日志管理最佳实践

  1. 日志级别优化
    生产环境中,避免将Kubernetes组件(如kube-apiserverkube-controller-manager)的日志级别设置为--v=0(默认),可根据需要调整为--v=2(记录警告和错误)或--v=4(记录详细信息),平衡日志量与排查效率。

  2. 敏感信息过滤
    使用Fluentd或Loki的parser功能过滤日志中的敏感信息(如密码、密钥)。例如,Fluentd配置中添加record_transformer插件移除敏感字段:

    <filter kube.**>
      @type record_transformer
      enable_ruby true
      <record>
        message ${(record["message"] || "").gsub(/password=[^& ]+/, "password=*****")}
      </record>
    </filter>
    ```。  
    
    
  3. 集中化存储
    务必将日志发送到集中化存储(如Elasticsearch、Loki),避免依赖单个节点的本地存储,确保日志持久性和可访问性。

  4. 监控与告警
    通过Prometheus监控日志系统的关键指标(如Elasticsearch的存储使用率、Fluentd的收集延迟),并设置告警规则(如日志量突增、存储空间不足),及时响应异常。

以上方案覆盖了Debian上K8s日志管理的核心需求,可根据团队规模、日志量及预算选择合适的工具组合。

0