目录

一、日志收集基础:要收集哪些日志?

二、主流日志收集工具对比

三、实战 1:EFK 收集控制台日志(适合云原生应用)

1. 部署步骤

(1)准备工作:创建命名空间

(2)部署 Elasticsearch(日志存储)

(3)部署 Kibana(日志展示)

(4)部署 Fluentd(日志收集)

2. 验证 EFK 是否生效

(1)部署测试应用(生成日志)

(2)在 Kibana 中查看日志

四、实战 2:Filebeat 收集自定义文件日志(适合传统应用)

1. 架构说明

2. 部署步骤

(1)安装 Helm(包管理工具,简化部署)

(2)部署 Zookeeper 和 Kafka(消息队列)

(3)部署 Logstash(日志处理)

(4)部署应用 + Filebeat Sidecar

(5)在 Kibana 中查看文件日志

五、实战 3:Loki 日志工具(轻量云原生方案)

1. 部署步骤

(1)用 Helm 部署 Loki Stack

(2)获取 Grafana 访问信息

2. 在 Grafana 中查看日志

六、工具选择建议

一、日志收集基础:要收集哪些日志?
  在 K8s 集群中,有 3 类核心日志需要重点关注

  日志类型    包含内容    重要性
  服务器系统日志    节点的操作系统日志(如内核、磁盘、网络)    排查节点级故障
  K8s 组件日志    apiserver、scheduler、kubelet 等组件日志    排查集群调度、通信问题
  应用程序日志    容器内应用输出的日志(控制台或文件)    排查业务逻辑问题

二、主流日志收集工具对比
 选择工具前,先搞清楚各工具的特点和适用场景:

 工具 / 方案    组件组成    优点    缺点    适用场景
 ELK    Elasticsearch+Logstash+Kibana    成熟稳定,功能全面(全文检索、分析)    Logstash 资源消耗大,配置复杂    已有 ELK 平台,需复杂日志分析
 EFK    Elasticsearch+Fluentd+Kibana    Fluentd 轻量,适合收集控制台日志    仅支持控制台日志,无法直接收文件日志    云原生应用(日志输出到控制台)
 Filebeat    Filebeat(+Kafka+Logstash)    超轻量,支持收集文件日志,适合 sidecar 模式    单独使用功能弱,需配合 Kafka/Logstash    需收集容器内自定义日志文件
 Loki    Loki+Promtail+Grafana    专为 K8s 设计,轻量,资源消耗低    不支持全文检索,功能较简单    轻量化需求,快速部署,K8s 原生环境

三、实战 1:EFK 收集控制台日志(适合云原生应用)
 EFK 是 K8s 官方推荐的方案,用 Fluentd 收集控制台日志,Elasticsearch 存储,Kibana 展示。

1. 部署步骤
(1)准备工作:创建命名空间
# 创建专门的日志命名空间(隔离资源)
kubectl create -f create-logging-namespace.yaml
# 查看命名空间(确认创建成功)
kubectl get ns logging
解析:create-logging-namespace.yaml内容为apiVersion: v1; kind: Namespace; metadata: {name: logging},用于隔离日志相关组件。

(2)部署 Elasticsearch(日志存储)
# 部署Elasticsearch服务(提供访问入口)
kubectl create -f es-service.yaml
# 部署Elasticsearch集群(StatefulSet确保稳定)
kubectl create -f es-statefulset.yaml
es-service.yaml:定义 ClusterIP 服务,暴露 9200(HTTP API)和 9300(节点间通信)端口,供 Fluentd 和 Kibana 访问。
es-statefulset.yaml:用 StatefulSet 部署 Elasticsearch,保证 Pod 名称和存储稳定,适合有状态应用。
验证:

# 查看Elasticsearch Pod状态(Running表示成功)
kubectl get pod -n logging | grep elasticsearch
(3)部署 Kibana(日志展示)
# 部署Kibana Deployment和Service
kubectl create -f kibana-deployment.yaml -f kibana-service.yaml
kibana-deployment.yaml:部署 Kibana 容器,连接 Elasticsearch(通过es-service的 DNS 名elasticsearch-logging)。
kibana-service.yaml:用 NodePort 暴露 5601 端口,方便外部访问 Kibana 界面。
验证:

# 查看Kibana服务端口(如32734)
kubectl get svc -n logging | grep kibana
# 输出示例:kibana-logging   NodePort   10.104.162.209   <none>   5601:32734/TCP
(4)部署 Fluentd(日志收集)
Fluentd 以 DaemonSet 形式部署(每个节点 1 个 Pod),收集节点上的容器控制台日志。

# 为需要收集日志的节点打标签(只在这些节点部署Fluentd)
kubectl label node k8s-node01 fluentd=true
kubectl label node k8s-node02 fluentd=true
 
# 部署Fluentd(DaemonSet)和配置(ConfigMap)
kubectl create -f fluentd-es-ds.yaml -f fluentd-es-configmap.yaml
fluentd-es-ds.yaml:DaemonSet 配置,通过nodeSelector: {fluentd: "true"}指定部署节点,挂载节点的/var/log(容器日志目录)。
fluentd-es-configmap.yaml:Fluentd 配置,定义日志来源(/var/log/containers/*.log)和输出(发送到 Elasticsearch 的 9200 端口)。

2. 验证 EFK 是否生效
(1)部署测试应用(生成日志)
# nginx-service.yaml(包含Service和Deployment)
apiVersion: v1
kind: Service
metadata:
  name: mynginx
  namespace: default
spec:
  type: LoadBalancer
  ports:
  - port: 80
    targetPort: 80
  selector:
    app: mynginx
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mynginx-deployment
  namespace: default
spec:
  replicas: 2
  selector:
    matchLabels:
      app: mynginx
  template:
    metadata:
      labels:
        app: mynginx
    spec:
      containers:
      - name: mynginx
        image: nginx:1.15.2
        ports:
        - containerPort: 80

部署并访问生成日志:

kubectl create -f nginx-service.yaml
# 访问Nginx生成日志(多次执行)
curl 192.168.10.101:32019  # 32019是Service暴露的NodePort
(2)在 Kibana 中查看日志
访问 Kibana:http://节点IP:32734(32734 是 kibana-service 的 NodePort)。
首次使用需创建索引模式:
点击 “Management”→“Index Patterns”→输入logstash-*(Fluentd 默认索引格式)→选择时间字段→创建。
查看日志:点击 “Discover”,即可看到 Nginx 的访问日志(包含请求 IP、时间、状态码等)。

四、实战 2:Filebeat 收集自定义文件日志(适合传统应用)
很多传统应用会把日志输出到文件(而非控制台),此时用 Filebeat(轻量)以 sidecar 模式和应用部署在同一 Pod,共享日志文件并收集。

1. 架构说明
为减轻 Elasticsearch 压力,引入 Kafka 缓存日志,Logstash 处理后再存入 ES:
应用容器(输出日志到文件)→ Filebeat(sidecar,读文件)→ Kafka → Logstash → Elasticsearch → Kibana

2. 部署步骤
(1)安装 Helm(包管理工具,简化部署)
# 下载Helm
wget https://get.helm.sh/helm-v3.6.2-linux-amd64.tar.gz
# 解压并安装
tar zxvf helm-v3.6.2-linux-amd64.tar.gz
mv linux-amd64/helm /usr/local/bin/
# 验证
helm version  # 输出版本信息表示成功
(2)部署 Zookeeper 和 Kafka(消息队列)
# 进入Filebeat部署目录
cd /root/efk-7.10.2/filebeat/
# 用Helm部署Zookeeper(Kafka依赖)
helm install zookeeper zookeeper/ -n logging
# 用Helm部署Kafka
helm install kafka kafka/ -n logging
验证:

# 查看Zookeeper和Kafka Pod(Running表示成功)
kubectl get pod -n logging -l app.kubernetes.io/name=zookeeper
kubectl get pod -n logging -l app.kubernetes.io/component=kafka
(3)部署 Logstash(日志处理)
# 部署Logstash配置(ConfigMap)、Deployment和Service
kubectl create -f logstash-cm.yaml -f logstash.yaml -f logstash-service.yaml -n logging
logstash-cm.yaml:配置 Logstash 从 Kafka 读日志,简单处理(如过滤、格式化)后输出到 Elasticsearch。
logstash.yaml:部署 Logstash 容器,挂载配置文件。
(4)部署应用 + Filebeat Sidecar
# app-filebeat.yaml(应用容器+Filebeat sidecar)
apiVersion: apps/v1
kind: Deployment
metadata:
  name: app-with-filebeat
  namespace: logging
spec:
  replicas: 1
  selector:
    matchLabels:
      app: test-app
  template:
    metadata:
      labels:
        app: test-app
    spec:
      containers:
      - name: test-app  # 应用容器(生成日志到/opt/date.log)
        image: busybox
        command: ["/bin/sh", "-c", "while true; do echo $(date) >> /opt/date.log; sleep 1; done"]
        volumeMounts:
        - name: log-volume  # 挂载共享目录存日志
          mountPath: /opt
      - name: filebeat  # Filebeat sidecar(收集日志)
        image: elastic/filebeat:7.10.2
        volumeMounts:
        - name: log-volume  # 共享日志目录
          mountPath: /opt
        - name: filebeat-config  # 挂载Filebeat配置
          mountPath: /usr/share/filebeat/filebeat.yml
          subPath: filebeat.yml
      volumes:
      - name: log-volume  # 空目录卷,共享日志
        emptyDir: {}
      - name: filebeat-config  # Filebeat配置(从ConfigMap获取)
        configMap:
          name: filebeat-cm

部署并验证:

# 先创建Filebeat配置ConfigMap
kubectl create -f filebeat-cm.yaml -n logging
# 部署应用+Filebeat
kubectl create -f app-filebeat.yaml -n logging
 
# 查看日志文件内容(确认应用生成日志)
kubectl exec -it <app-pod-name> -n logging -c test-app -- cat /opt/date.log
filebeat-cm.yaml:配置 Filebeat 监控/opt/date.log,输出到 Kafka 的指定主题。
(5)在 Kibana 中查看文件日志
同 EFK 步骤,创建索引模式(Filebeat 默认索引为filebeat-*),即可看到date.log中的时间日志。

五、实战 3:Loki 日志工具(轻量云原生方案)
Loki 是 Grafana 推出的轻量日志方案,不做全文索引(只索引元数据),资源消耗低,适合 K8s 环境。

1. 部署步骤
(1)用 Helm 部署 Loki Stack
# 添加Grafana仓库
helm repo add grafana https://grafana.github.io/helm-charts
helm repo update
 
# 创建Loki命名空间
kubectl create ns loki
 
# 部署Loki+Promtail+Grafana(启用Grafana并暴露NodePort)
helm upgrade --install loki loki-stack \
  --set grafana.enabled=true \
  --set grafana.service.type=NodePort \
  -n loki

loki:日志存储和查询服务。
promtail:日志收集(DaemonSet 部署,类似 Fluentd)。
grafana:日志展示(集成 Loki 数据源)。
(2)获取 Grafana 访问信息
# 查看Grafana Pod和Service
kubectl get pod -n loki | grep grafana  # 确认Running
kubectl get svc -n loki | grep grafana  # 查看NodePort(如32734)
 
# 获取Grafana管理员密码(base64解码)
kubectl get secret loki-grafana -n loki -o jsonpath="{.data.admin-password}" | base64 --decode

2. 在 Grafana 中查看日志
访问 Grafana:http://节点IP:32734,用账号admin和上述密码登录。
添加 Loki 数据源:
点击 “Configuration”→“Data Sources”→“Add data source”→选择 “Loki”→URL 填http://loki:3100→保存。
查看日志:
点击 “Explore”→选择 Loki 数据源→用标签查询日志,例如:
查 default 命名空间的日志:{namespace="default"}
查特定 Pod 的日志:{pod="mynginx-deployment-xxx"}

六、工具选择建议
  已有 ELK 平台:优先用Filebeat收集 K8s 日志,输出到现有 ES。
  纯云原生应用(日志到控制台):选EFK,部署简单。
  需收集文件日志:用Filebeat+Kafka+Logstash架构。
  轻量化需求,不想维护 ES:选Loki,资源消耗低,适合中小集群。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐