温馨提示×

Ubuntu Kubernetes日志管理技巧

小樊
40
2025-11-11 02:08:17
栏目: 智能运维

Ubuntu Kubernetes日志管理技巧

一、核心流程概述

Ubuntu环境下Kubernetes日志管理需覆盖收集→存储→查看/分析→轮转/清理→监控告警全链路,确保日志高效采集、安全存储及快速定位问题。

二、日志收集:选择合适的工具

1. DaemonSet模式(推荐)

通过DaemonSet在每个Ubuntu节点上运行1个日志收集器实例(如Fluentd),收集节点上/var/log/containers/*.log(容器标准输出/错误)、/var/log/kubelet.log(kubelet日志)等文件,转发至后端存储(如Elasticsearch)。此方式对应用无侵入,且一个节点仅需一个agent,资源占用低。
示例Fluentd DaemonSet配置(简化版):

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

2. Sidecar模式(适用于复杂日志处理)

若应用日志需特殊处理(如格式转换、过滤),可在Pod中添加Sidecar容器(如Filebeat),与业务容器共享卷(emptyDir),收集业务容器日志并转发至后端。此方式适合需要细粒度控制的场景,但会增加资源占用。
示例Sidecar配置(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
      subPath: filebeat.yml
  volumes:
  - name: logs
    emptyDir: {}
  - name: filebeat-config
    configMap:
      name: filebeat-config  # 需提前创建ConfigMap配置Filebeat

3. 应用内置日志收集(不推荐)

在业务容器中额外运行日志收集进程(如Fluent Bit),将日志发送至后端。此方式会增加容器复杂度,仅在特殊场景下使用。

三、日志存储:选择合适的后端

1. Elasticsearch(适合复杂分析)

分布式搜索和分析引擎,支持全文检索、日志聚合及复杂查询,适合需要深度分析日志的场景。需配置索引生命周期管理(ILM),自动清理旧日志(如保留30天)。
示例Elasticsearch配置(关键参数):

cluster.name: k8s-logs
node.name: elasticsearch-node-1
network.host: 0.0.0.0
discovery.seed_hosts: ["elasticsearch-node-1", "elasticsearch-node-2"]
cluster.initial_master_nodes: ["elasticsearch-node-1"]

2. Loki(轻量级替代)

专为Kubernetes设计的日志聚合系统,资源消耗低,与Prometheus集成好,适合日志+监控统一管理的场景。无需复杂的索引配置,直接通过标签(如namespacepod_name)查询日志。

3. 对象存储(适合长期归档)

如S3、MinIO,将日志长期存储,成本低,但无法实时检索。适合合规性要求高的场景(如保留1年以上日志)。

四、日志查看与分析:可视化工具

1. Kibana(EFK栈)

通过Kibana创建索引模式(如kubernetes-logs-*),使用Discover查看实时日志,Dashboard构建可视化面板(如错误日志趋势、Pod日志量排名)。支持日志过滤(如namespace=prod)、聚合(如按Pod分组统计日志量)。

2. Grafana(Loki栈)

若使用Loki,可通过Grafana的Explore功能查询日志,支持标签过滤(如level=error)和时间范围选择。可与Prometheus联动,实现日志与监控数据的关联分析。

3. 命令行工具

  • kubectl logs:查看Pod日志(示例:kubectl logs -f payment-service-abcde -n prod 实时查看);
  • kubectl logs --previous:查看容器重启前的日志;
  • kubectl logs -c <container-name>:查看多容器Pod中指定容器的日志。

五、日志轮转与清理:防止磁盘爆满

通过logrotate配置日志轮转规则,限制日志文件大小(如max-size: 100M)和保留天数(如rotate 7),避免/var/log/containers目录占用过多磁盘空间。
示例/etc/logrotate.d/kubernetes-containers配置:

/var/lib/docker/containers/*/*.log {
  rotate 7
  daily
  compress
  missingok
  notifempty
  sharedscripts
  postrotate
    systemctl restart docker  # 重启Docker以重新生成日志文件
  endscript
}

六、日志监控与告警:及时发现问题

结合Prometheus+Alertmanager实现日志监控与告警:

  • Prometheus采集Elasticsearch/Loki的日志指标(如日志量elasticsearch_indices_docs_count、错误日志数rate(elasticsearch_indices_indexing_slowlog_total[5m]));
  • Alertmanager设置告警规则(如“5分钟内错误日志数超过100条”),通过邮件、Slack等方式通知运维人员。
    示例Prometheus告警规则:
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条,需立即排查"

七、权限与安全:保障日志安全

  • 为Fluentd/Promtail配置专用的ServiceAccount,限制仅能读取必要日志(如/var/log/containers/*.log);
  • 启用Elasticsearch和Kibana的TLS加密,防止日志传输过程中被窃取;
  • 定期审计日志访问权限,避免未授权访问。

0