溫馨提示×

centos k8s部署后如何進行日志管理

小樊
52
2025-10-01 01:05:43
欄目: 智能運維

CentOS上Kubernetes集群日志管理指南

一、日志收集方案選擇

Kubernetes日志收集需根據場景選擇合適方案,常見工具及特點如下:

  • EFK Stack(Elasticsearch+Fluentd+Kibana):官方推薦的全鏈路日志方案,適合需要全文檢索、復雜分析、可視化的場景(如故障排查、業務指標監控)。Fluentd作為DaemonSet部署在每個節點,收集容器/系統日志并轉發至Elasticsearch,Kibana提供Web界面展示。
  • Loki+Promtail+Grafana:輕量級云原生方案,適合大規模集群、低成本存儲(如S3、OSS)。Promtail作為Sidecar或DaemonSet收集日志,Loki存儲并索引,Grafana實現可視化,集成Prometheus可實現日志與指標聯動。
  • Filebeat+Elasticsearch+Kibana:簡化版ELK,Filebeat作為輕量級收集器(資源占用低),適合資源受限的環境(如小型集群)。需配合DaemonSet部署,收集/var/log/containers/*.log中的容器日志。

二、EFK Stack部署步驟(以DaemonSet為例)

1. 部署Elasticsearch

Elasticsearch需持久化存儲(如NFS、云盤),配置資源限制(避免OOM):

# elasticsearch-statefulset.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: elasticsearch
spec:
  serviceName: "elasticsearch"
  replicas: 1
  selector:
    matchLabels:
      app: elasticsearch
  template:
    metadata:
      labels:
        app: elasticsearch
    spec:
      containers:
      - name: elasticsearch
        image: docker.elastic.co/elasticsearch/elasticsearch:8.12.0
        ports:
        - containerPort: 9200
        env:
        - name: discovery.type
          value: "single-node"
        - name: ES_JAVA_OPTS
          value: "-Xms512m -Xmx512m"
        volumeMounts:
        - name: elasticsearch-data
          mountPath: /usr/share/elasticsearch/data
  volumeClaimTemplates:
  - metadata:
      name: elasticsearch-data
    spec:
      accessModes: ["ReadWriteOnce"]
      storageClassName: nfs-client  # 替換為實際存儲類
      resources:
        requests:
          storage: 10Gi
2. 部署Fluentd(DaemonSet)

Fluentd收集節點上所有容器日志(路徑:/var/log/containers/*.log),轉發至Elasticsearch:

# fluentd-daemonset.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: fluentd
spec:
  selector:
    matchLabels:
      app: fluentd
  template:
    metadata:
      labels:
        app: fluentd
    spec:
      containers:
      - name: fluentd
        image: fluent/fluentd-kubernetes-daemonset:v1.16-es
        env:
        - name: FLUENT_ELASTICSEARCH_HOST
          value: "elasticsearch.default.svc.cluster.local"
        - 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
3. 部署Kibana

Kibana連接Elasticsearch,提供可視化界面:

kubectl apply -f https://raw.githubusercontent.com/elastic/cloud-on-k8s/2.16/deploy/kibana/kibana.yaml

訪問http://<KIBANA_IP>:5601,配置Elasticsearch連接(默認地址:elasticsearch.default.svc.cluster.local:9200)。

三、Loki+Promtail部署步驟(輕量級替代)

1. 部署Loki(StatefulSet)

Loki存儲日志,支持S3/OSS等外部存儲:

# loki-statefulset.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: loki
spec:
  serviceName: "loki"
  replicas: 1
  selector:
    matchLabels:
      app: loki
  template:
    metadata:
      labels:
        app: loki
    spec:
      containers:
      - name: loki
        image: grafana/loki:2.9.0
        ports:
        - containerPort: 3100
        args:
        - "--config.file=/etc/loki/config.yaml"
        volumeMounts:
        - name: loki-config
          mountPath: /etc/loki
  volumeClaimTemplates:
  - metadata:
      name: loki-storage
    spec:
      accessModes: ["ReadWriteOnce"]
      storageClassName: nfs-client
      resources:
        requests:
          storage: 20Gi
2. 部署Promtail(DaemonSet)

Promtail收集日志并發送至Loki:

# promtail-daemonset.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: promtail
spec:
  selector:
    matchLabels:
      app: promtail
  template:
    metadata:
      labels:
        app: promtail
    spec:
      containers:
      - name: promtail
        image: grafana/promtail:2.9.0
        args:
        - "-config.file=/etc/promtail/config.yaml"
        volumeMounts:
        - name: varlog
          mountPath: /var/log
        - name: varlibdockercontainers
          mountPath: /var/lib/docker/containers
          readOnly: true
        - name: promtail-config
          mountPath: /etc/promtail
  volumes:
  - name: varlog
    hostPath:
      path: /var/log
  - name: varlibdockercontainers
    hostPath:
      path: /var/lib/docker/containers
  - name: promtail-config
    configMap:
      name: promtail-config
3. 配置Grafana可視化

添加Loki數據源(地址:loki.default.svc.cluster.local:3100),創建Dashboard展示日志(如按命名空間、Pod篩選)。

四、日志輪轉與清理

使用logrotate避免日志文件無限增長,配置示例(/etc/logrotate.d/kubernetes):

/var/log/containers/*.log {
  daily
  rotate 7
  compress
  delaycompress
  missingok
  notifempty
  copytruncate
  sharedscripts
  postrotate
    /usr/bin/killall -HUP fluentd 2>/dev/null || true
  endscript
}

五、日志查看與分析

  • kubectl logs:查看指定Pod日志(kubectl logs <pod-name> -n <namespace>),支持-f實時跟蹤、--tail指定行數。
  • Kibana/Grafana:通過可視化界面查詢、過濾日志(如Kibana的“Discover”頁面,Grafana的“Explore”頁面)。
  • 第三方工具:如Kubetail(聚合多個Pod日志)、Stern(支持正則匹配Pod名稱)。

六、日志管理最佳實踐

  • 日志分類:按應用類型(如Java、Nginx)、環境(如prod、dev)分類存儲,便于快速定位。
  • 日志輸出優化:應用日志輸出到stdout/stderr(Kubernetes原生采集),避免寫入本地文件(減少維護成本)。
  • 資源限制:為日志收集器(如Fluentd、Filebeat)設置CPU/內存限制,避免占用過多節點資源。
  • 保留策略:根據日志重要性設置保留時間(如業務日志保留7天,審計日志保留30天),降低存儲成本。

0
亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女