云原生技术与应用-Kubernetes日志收集
metadata: {name: logging},用于隔离日志相关组件。fluentd-es-configmap.yaml:Fluentd 配置,定义日志来源(/var/log/containers/*.log)和输出(发送到 Elasticsearch 的 9200 端口)。fluentd-es-ds.yaml:DaemonSet 配置,通过nodeSelector: {fluentd: "t
·
四、实战 2:Filebeat 收集自定义文件日志(适合传统应用)
一、日志收集基础:要收集哪些日志?
在 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,资源消耗低,适合中小集群。
更多推荐
所有评论(0)