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 集群中,需重点收集的日志包括以下几类:

  1. 服务器系统日志:记录服务器硬件、操作系统(如 CPU、内存、磁盘)的运行状态,是排查底层问题的基础。
  2. Kubernetes 组件日志:如 kube-apiserver、kube-controller-manager 等核心组件的日志,反映集群控制平面的运行状态。
  3. 应用程序日志:容器化应用输出的业务日志,包括访问记录、错误信息等,是业务问题排查的关键。

此外,网关日志、服务调用链日志等也可能根据业务需求纳入采集范围。

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

日志采集工具众多,选择时需结合资源消耗、功能适配性和运维复杂度综合考量。以下是主流工具的核心特性:

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: mynginx
  namespace: default
spec:
  type: LoadBalancer
  ports:
  - port: 80
    targetPort: 80
  selector:
    app: mynginx
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mynginx-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: mynginx
  template:
    metadata:
      labels:
        app: mynginx
    spec:
      containers:
      - name: mynginx
        image: nginx:1.15.2
        ports:
        - 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 且资源消耗低。

日志系统的核心价值在于 “可观测性”,部署后需结合业务需求持续优化索引策略和存储方案,确保高效排查问题。

Kubernetes 中配置日志轮转,主要依赖于 kubelet 的内置功能和容器运行时的日志管理机制。以下是一些关键的配置方式和注意事项: ### 1. **使用 stdout/stderr 输出日志** Kubernetes 原生支持将容器的标准输出(stdout)和标准错误输出(stderr)自动写入到节点上的日志文件中。推荐应用程序直接将日志输出到 stdout 和 stderr,而不是写入本地文件[^2]。这样可以避免额外的日志管理开销,并且 kubelet 会负责日志的轮转和保留。 默认情况下,kubelet 会将日志存储在 `/var/log/containers` 目录下,并根据 Pod 名称、容器名称和命名空间生成对应的日志文件。 --- ### 2. **配置日志轮转策略** Kubernetes 使用 Docker 或其他容器运行时作为底层引擎,因此日志轮转通常由容器运行时的配置控制。对于 Docker 来说,可以通过 `log-driver` 和 `log-opt` 参数来设置日志大小限制和轮转次数。 在节点上修改 Docker 的 daemon 配置文件(通常是 `/etc/docker/daemon.json`),添加如下内容: ```json { "log-driver": "json-file", "log-opts": { "max-size": "10m", "max-file": "3" } } ``` 此配置表示每个容器的日志文件最大为 10MB,最多保留 3 个历史日志文件。修改后需要重启 Docker 服务以应用更改。 --- ### 3. **通过边车容器实现日志轮转** 如果应用程序无法将日志输出到 stdout/stderr,或者需要更复杂的日志管理逻辑,可以考虑使用边车容器(sidecar container)。边车容器可以专门用于监控和处理主容器的日志文件,例如定期压缩或清理日志[^2]。 一个简单的例子是使用一个轻量级的容器运行 `logrotate` 工具,定期检查并轮转主容器的日志文件。这种方式适用于遗留系统或特定的日志格式需求。 --- ### 4. **使用 Fluentd 或 Logrotate 进行日志处理** Fluentd 是一种流行的日志收集工具,结合 `fluent-plugin-kubernetes_metadata_filter` 插件,可以自动为日志事件添加 Kubernetes 元数据,便于后续分析和过滤[^1]。Fluentd 可以部署为 DaemonSet,确保每个节点都有一个日志采集代理。 此外,也可以在容器内安装 `logrotate` 工具,配合 cron 定期执行日志轮转任务。需要注意的是,这种方案要求容器具备 root 权限,并且镜像中包含 `logrotate`。 --- ### 5. **日志性能优化** 不同日志驱动的性能差异较大,例如 syslog 日志驱动的吞吐量较低(约 14.9 MB/s),而 json-file 日志驱动的性能较高(约 37.9 MB/s)[^3]。因此,在选择日志驱动时,应根据实际需求评估性能瓶颈。 --- ### 示例:Docker Daemon 配置日志轮转 以下是一个完整的 Docker Daemon 配置示例,展示了如何启用日志轮转: ```json { "log-driver": "json-file", "log-opts": { "max-size": "10m", "max-file": "3" } } ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值