Kubernetes 日志收集
目录
简介
一、哪些日志需要收集?
二、主流日志采集工具对比
1. ELK 与 EFK:传统日志平台的容器化演进
2. Filebeat:轻量级日志采集器
3. Loki:Kubernetes 原生轻量日志方案
三、案例:EFK 收集控制台日志
1. 环境准备
2. 部署步骤
(1)下载部署文件
(2)创建专用命名空间
(3)部署 Elasticsearch 集群
(4)部署 Kibana
(5)部署 Fluentd(日志采集)
3. 验证日志采集
(1)部署测试应用
(2)生成日志并查看
四、案例:Filebeat 收集自定义文件日志
1. 环境准备
2. 部署步骤
(1)安装 Helm
(2)部署 Kafka 和 Logstash
(3)部署应用与 Filebeat Sidecar
(4)验证日志流程
五、案例:Loki 日志系统
1. 部署步骤
(1)添加 Helm 仓库并下载 Chart
(2)部署 Loki Stack
(3)访问 Grafana 并查看日志
六、总结
简介
在 Kubernetes 集群中,日志是系统运行状态的 “晴雨表”,无论是故障排查、性能监控还是安全审计,都离不开高效的日志收集与分析能力。本文将介绍 Kubernetes 环境下的日志收集方案,从日志类型、工具选型到实战部署,助你构建完善的日志管理体系。
一、哪些日志需要收集?
在 Kubernetes 集群中,需重点收集的日志包括以下几类:
- 服务器系统日志:记录服务器硬件、操作系统(如 CPU、内存、磁盘)的运行状态,是排查底层问题的基础。
- Kubernetes 组件日志:如 kube-apiserver、kube-controller-manager 等核心组件的日志,反映集群控制平面的运行状态。
- 应用程序日志:容器化应用输出的业务日志,包括访问记录、错误信息等,是业务问题排查的关键。
此外,网关日志、服务调用链日志等也可能根据业务需求纳入采集范围。
二、主流日志采集工具对比
日志采集工具众多,选择时需结合资源消耗、功能适配性和运维复杂度综合考量。以下是主流工具的核心特性:
1. ELK 与 EFK:传统日志平台的容器化演进
- ELK(Elasticsearch+Logstash+Kibana)
- 组成:Logstash 负责日志采集与解析,Elasticsearch 存储,Kibana 可视化。
- 优势:成熟稳定,适用于传统架构。
- 缺陷:Logstash 资源消耗高(CPU / 内存占用大),配置复杂,不适合容器化环境。
- EFK(Elasticsearch+Fluentd+Kibana)
- 改进:用 Fluentd 替代 Logstash,轻量且配置简单,可直接采集控制台日志并输出到 Elasticsearch。
- 局限:仅支持控制台日志采集,无法直接处理容器内的文件日志(需通过 Sidecar 容器转发,操作繁琐)。
2. Filebeat:轻量级日志采集器
- 特性:基于 Go 语言开发,资源消耗极低(CPU / 内存可忽略),支持多种部署模式。
- 适用场景:
- 以 Sidecar 模式与应用部署在同一 Pod 中,通过 Volume 共享日志文件,采集自定义文件日志。
- 以 DaemonSet 模式部署在集群节点,采集系统日志或控制台日志。
- 架构优化:通常与 Kafka(缓冲日志)、Logstash(日志处理)配合,减轻 Elasticsearch 压力。
3. Loki:Kubernetes 原生轻量日志方案
- 核心优势:
- 不做全文索引,仅索引日志元数据(如 Pod 标签、命名空间),大幅降低存储和资源消耗。
- 与 Prometheus 类似的服务发现机制,天然适配 Kubernetes,支持水平扩展和多租户。
- 组成:
- Loki:日志存储与查询服务。
- Promtail:日志采集代理,自动添加 Kubernetes 元数据(如 Pod 名、命名空间)。
- Grafana:日志可视化界面(与 Loki 深度集成)。
三、案例:EFK 收集控制台日志
EFK 是 Kubernetes 官方推荐的控制台日志解决方案,以下是部署步骤及命令解析。
1. 环境准备
- 前提:已安装 Kubernetes 集群(1.23+),节点可访问互联网(或使用离线包)。
- 目标:部署 Elasticsearch 集群、Fluentd(日志采集)、Kibana(可视化),并验证日志采集功能。
2. 部署步骤
(1)下载部署文件
# 克隆GitHub仓库获取部署清单(离线环境可跳过,直接使用本地文件)
[root@k8s-master ~]# git clone https://github.com/dotbalo/k8s.git
解释:该仓库包含 EFK 部署所需的 YAML 配置文件,简化手动编写流程。
(2)创建专用命名空间
# 进入EFK配置目录
[root@k8s-master ~]# cd k8s/efk-7.10.2/
# 创建日志采集专用命名空间(隔离资源,便于管理)
[root@k8s-master efk-7.10.2]# kubectl create -f create-logging-namespace.yaml
namespace/logging created
解释:命名空间logging
用于隔离日志相关组件(如 Elasticsearch、Fluentd),避免与业务资源冲突。
(3)部署 Elasticsearch 集群
# 创建Elasticsearch服务(暴露9200端口供Fluentd写入,9300端口供节点间通信)
[root@k8s-master efk-7.10.2]# kubectl create -f es-service.yaml
service/elasticsearch-logging created# 部署Elasticsearch StatefulSet(有状态应用,保证集群稳定性)
[root@k8s-master efk-7.10.2]# kubectl create -f es-statefulset.yaml
statefulset.apps/elasticsearch-logging created
验证:检查 Pod 状态(Running
表示部署成功):
[root@k8s-master efk-7.10.2]# kubectl get pod -n logging
NAME READY STATUS RESTARTS AGE
elasticsearch-logging-0 1/1 Running 0 5m
端口说明:
- 9200:HTTP API 端口,供 Fluentd、Kibana 访问。
- 9300:节点间通信端口,用于集群选举、分片同步等。
(4)部署 Kibana
# 部署Kibana Deployment和Service(NodePort类型,便于外部访问)
[root@k8s-master efk-7.10.2]# kubectl create -f kibana-deployment.yaml -f kibana-service.yaml
验证:查看服务端口(Kibana 默认端口 5601,通过 NodePort 暴露):
[root@k8s-master efk-7.10.2]# kubectl get svc -n logging
NAME TYPE PORT(S) AGE
kibana-logging NodePort 5601:32734/TCP 34m
访问方式:通过节点 IP + 暴露的端口(如http://192.168.10.101:32734
)访问 Kibana 界面。
(5)部署 Fluentd(日志采集)
# 修改Fluentd部署文件,通过NodeSelector指定采集节点
[root@k8s-master efk-7.10.2]# grep "nodeSelector" fluentd-es-ds.yaml -A3
nodeSelector:fluentd: "true" # 仅部署在标记为fluentd=true的节点# 为目标节点添加标签
[root@k8s-master efk-7.10.2]# kubectl label node k8s-node01 fluentd=true
node/k8s-node01 labeled# 部署Fluentd DaemonSet(每个目标节点运行一个实例)
[root@k8s-master efk-7.10.2]# kubectl create -f fluentd-es-ds.yaml -f fluentd-es-configmap.yaml
解释:
- NodeSelector 用于限制 Fluentd 部署范围,避免资源浪费。
- ConfigMap 定义 Fluentd 配置,默认将日志输出到 Elasticsearch(通过
elasticsearch-logging
服务访问)。
3. 验证日志采集
(1)部署测试应用
# 创建Nginx Deployment和Service(生成访问日志)
[root@k8s-master efk-7.10.2]# cat <<EOF > nginx-service.yaml
apiVersion: v1
kind: Service
metadata:name: mynginxnamespace: default
spec:type: LoadBalancerports:- port: 80targetPort: 80selector:app: mynginx
---
apiVersion: apps/v1
kind: Deployment
metadata:name: mynginx-deployment
spec:replicas: 2selector:matchLabels:app: mynginxtemplate:metadata:labels:app: mynginxspec:containers:- name: mynginximage: nginx:1.15.2ports:- containerPort: 80
EOF# 部署应用
[root@k8s-master efk-7.10.2]# kubectl create -f nginx-service.yaml
(2)生成日志并查看
# 访问Nginx服务,触发日志输出
[root@k8s-master efk-7.10.2]# curl 192.168.10.101:32019 # 32019为Service暴露的端口
在 Kibana 中通过索引模式(如logstash-*
)查看日志,验证采集结果。
四、案例:Filebeat 收集自定义文件日志
对于输出到文件的非云原生应用,需通过 Filebeat Sidecar 模式采集日志。以下是结合 Kafka 和 Logstash 的优化方案。
1. 环境准备
- 工具:Helm(Kubernetes 包管理工具,简化 Zookeeper/Kafka 部署)。
- 架构:Filebeat → Kafka(缓冲) → Logstash(处理) → Elasticsearch。
2. 部署步骤
(1)安装 Helm
# 下载并安装Helm客户端
[root@k8s-master ~]# wget https://get.helm.sh/helm-v3.6.2-linux-amd64.tar.gz
[root@k8s-master ~]# tar zxvf helm-v3.6.2-linux-amd64.tar.gz
[root@k8s-master ~]# mv linux-amd64/helm /usr/local/bin/
(2)部署 Kafka 和 Logstash
# 部署Zookeeper(Kafka依赖)
[root@k8s-master ~]# cd /root/efk-7.10.2/filebeat/
[root@k8s-master filebeat]# helm install zookeeper zookeeper/ -n logging# 部署Kafka
[root@k8s-master filebeat]# helm install kafka kafka/ -n logging# 部署Logstash(从Kafka消费日志并转发到Elasticsearch)
[root@k8s-master filebeat]# kubectl create -f logstash-service.yaml -f logstash-cm.yaml -f logstash.yaml -n logging
(3)部署应用与 Filebeat Sidecar
# 创建应用和Filebeat配置(通过Volume共享日志目录)
[root@k8s-master filebeat]# kubectl create -f filebeat-cm.yaml -f app-filebeat.yaml -n logging
关键配置说明:
- 应用容器将日志写入
/opt/date.log
,通过emptyDir
与 Filebeat 共享该目录。 - Filebeat 配置从
/opt/date.log
读取日志,并输出到 Kafka。
(4)验证日志流程
# 查看应用日志文件内容
[root@k8s-master filebeat]# kubectl exec -it <app-pod-name> -n logging -- tail /opt/date.log# 在Kibana中查看经过Logstash处理后的日志
五、案例:Loki 日志系统
Loki 适合追求轻量、低资源消耗的场景,以下是基于 Helm 的快速部署流程。
1. 部署步骤
(1)添加 Helm 仓库并下载 Chart
# 添加Grafana仓库(包含Loki相关Chart)
[root@k8s-master ~]# helm repo add grafana https://grafana.github.io/helm-charts
[root@k8s-master ~]# helm repo update# 下载Loki Stack Chart
[root@k8s-master ~]# helm pull grafana/loki-stack --version 2.8.3
(2)部署 Loki Stack
# 创建命名空间
[root@k8s-master ~]# kubectl create ns loki# 部署Loki、Promtail和Grafana(启用Grafana并暴露NodePort)
[root@k8s-master ~]# helm upgrade --install loki loki-stack \--set grafana.enabled=true \--set grafana.service.type=NodePort \-n loki
(3)访问 Grafana 并查看日志
# 查看Grafana服务端口
[root@k8s-master ~]# kubectl get svc -n loki
NAME TYPE PORT(S) AGE
loki-grafana NodePort 80:32734/TCP 2m40s# 获取Grafana管理员密码(base64解码)
[root@k8s-master ~]# kubectl get secret loki-grafana -n loki -o jsonpath="{.data.admin-password}" | base64 --decode && echo# 访问Grafana:http://<节点IP>:32734,登录后添加Loki数据源,使用查询语句过滤日志
# 示例:查询default命名空间下特定Pod的日志
{namespace="default", pod="mynginx-deployment-xxx"}
六、总结
Kubernetes 日志收集需根据场景选择工具:
- 控制台日志优先选 EFK,配置简单但功能有限;
- 文件日志推荐 Filebeat+Kafka+Logstash,兼顾轻量与扩展性;
- 轻量、低成本需求首选 Loki,原生适配 Kubernetes 且资源消耗低。
日志系统的核心价值在于 “可观测性”,部署后需结合业务需求持续优化索引策略和存储方案,确保高效排查问题。