温馨提示×

Kubernetes在Debian上的日志管理如何操作

小樊
36
2026-01-09 12:50:46
栏目: 智能运维

Kubernetes 在 Debian 上的日志管理实操指南

一 日志类型与总体架构

  • 日志类型
    • 应用日志:容器 stdout/stderr,由 kubelet 写入节点日志目录。
    • 集群组件日志:如 kube-apiserver、kube-scheduler、kube-controller-manager、kubelet、etcd 等,运行在节点上,由 systemd-journald 管理。
    • 审计日志:Kubernetes 审计事件,写入 /var/log/kubernetes/audit.log(需开启审计策略)。
  • 采集与存储
    • 采集侧:在节点以 DaemonSet 部署 Fluentd/Filebeat,或使用 Sidecar 模式;轻量方案可选 Grafana Loki
    • 存储侧:Elasticsearch 集中索引与检索;可视化用 KibanaGrafana
  • 关键实践
    • 为节点与容器日志配置日志轮转保留策略,避免磁盘被占满。
    • 为敏感日志启用访问控制与加密;生产环境合理设置日志级别减少噪音。

二 本地查看与常用命令

  • 查看 Pod 日志
    • 基本:kubectl logs <pod>
    • 指定容器:kubectl logs <pod> -c <container>
    • 实时跟踪:kubectl logs <pod> -f
    • 时间范围:kubectl logs <pod> --since=5m--since-time=2023-11-22T10:00:00Z
    • 最近 N 行:kubectl logs <pod> --tail=10
    • 指定命名空间:kubectl logs <pod> -n <ns>
    • 标签选择:kubectl logs -l app=myapp -c web
    • 其他:--previous(上一个实例)、--timestamps--limit-bytes
  • 查看节点组件日志(Debian 使用 systemd)
    • 查看 kubelet:sudo journalctl -u kubelet -f
    • 查看 apiserver/scheduler/controller-manager(若以静态 Pod 运行):sudo journalctl -u kubelet | grep -i apiserver
  • 查看审计日志
    • 路径示例:sudo tail -f /var/log/kubernetes/audit.log(需事先配置审计策略并挂载日志目录)。

三 集中式日志方案 EFK 部署步骤

  • 准备命名空间
    • kubectl create ns kube-logging
  • 部署 Elasticsearch(示例为单副本,生产建议 StatefulSet 3 节点
    • 示例(Deployment,仅演示):
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: elasticsearch
        namespace: kube-logging
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: elasticsearch
        template:
          metadata:
            labels:
              app: elasticsearch
          spec:
            containers:
            - name: elasticsearch
              image: docker.elastic.co/elasticsearch/elasticsearch:7.15.0
              ports:
              - containerPort: 9200
              - containerPort: 9300
              env:
              - name: discovery.type
                value: single-node
      ---
      apiVersion: v1
      kind: Service
      metadata:
        name: elasticsearch
        namespace: kube-logging
      spec:
        selector:
          app: elasticsearch
        ports:
        - port: 9200
          targetPort: 9200
      
  • 部署 Fluentd(DaemonSet,收集节点与容器日志)
    • 示例要点(挂载节点日志目录,输出到 ES):
      apiVersion: apps/v1
      kind: DaemonSet
      metadata:
        name: fluentd
        namespace: kube-logging
        labels:
          k8s-app: fluentd-logging
      spec:
        selector:
          matchLabels:
            name: fluentd
        template:
          metadata:
            labels:
              name: fluentd
          spec:
            containers:
            - name: fluentd
              image: fluent/fluentd-kubernetes-daemonset:v1.12.0-debian-elasticsearch
              env:
              - name: FLUENT_ELASTICSEARCH_HOST
                value: "elasticsearch.kube-logging.svc.cluster.local"
              - name: FLUENT_ELASTICSEARCH_PORT
                value: "9200"
              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
      
    • 提示:若容器运行时为 containerd,请将容器内日志路径调整为 /var/log/pods/var/log/containers(符号链接到 containerd 的日志)。
  • 部署 Kibana
    • 示例:
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: kibana
        namespace: kube-logging
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: kibana
        template:
          metadata:
            labels:
              app: kibana
          spec:
            containers:
            - name: kibana
              image: docker.elastic.co/kibana/kibana:7.15.0
              ports:
              - containerPort: 5601
      ---
      apiVersion: v1
      kind: Service
      metadata:
        name: kibana
        namespace: kube-logging
      spec:
        type: NodePort
        selector:
          app: kibana
        ports:
        - port: 5601
          targetPort: 5601
          nodePort: 30601
      
  • 验证
    • 访问 Kibana:NodeIP:30601,在 Kibana 配置 Index Pattern(如 fluentd-*),开始检索日志。

四 轻量替代方案 Grafana Loki

  • 适用场景:资源受限或希望更轻量的日志聚合与查询。
  • 基本思路:以 DaemonSet 部署 Promtail(采集节点与容器日志),将日志推送到 Loki;用 Grafana 进行查询与可视化。
  • 优势:部署与运维复杂度低、存储与查询成本更可控,适合与 Prometheus/Grafana 统一监控体系融合。

五 日志轮转与运维最佳实践

  • 节点与容器日志轮转
    • 使用 logrotate 管理 /var/log/containers/*.log/var/log/pods/ 等日志文件,设置合理的 size/rotate/compress/missingok 策略,避免磁盘被占满。
  • 审计日志
    • 启用 Kubernetes 审计,将审计事件写入 /var/log/kubernetes/audit.log,并由 Fluentd/Loki 统一采集与归档。
  • 资源与高可用
    • Elasticsearch 生产建议 3 节点以上并配置内存与存储资源;FluentdDaemonSet 保证每个节点都有采集器;为 ES 与 Kibana 配置 Service 与健康检查。
  • 安全
    • Elasticsearch/Kibana/Fluentd 启用 RBACTLS 加密访问控制;对敏感字段进行脱敏或隔离存储。

0