K8s日志收集核心原理
K8s集群中,Pod的日志默认存储在所在节点的/var/log/containers/目录下(每个Pod对应一个日志文件),但这些日志分散在各个节点,无法直接集中查询。日志收集的核心流程分为3步
1. 日志收集:通过日志收集组件(Fluentd或Logstash),采集集群中所有Pod的日志(包括容器日志、应用日志);
2. 日志存储:将收集到的日志,统一存储到Elasticsearch(分布式搜索引擎,支持高效检索);
3. 日志可视化:通过Kibana(可视化工具),对存储在Elasticsearch中的日志进行查询、筛选、分析、可视化,方便运维人员快速定位故障。
EFK与ELK的核心区别
EFK和ELK都是K8s日志收集的主流方案,三层架构基本一致,核心区别仅在于"日志收集组件"不同
|---------|--------------|-----------------------------------|----------------------------------|
| 方案 | 日志收集组件 | 核心优势 | 适用场景 |
| ELK | Logstash | 功能强大,支持复杂的日志过滤、转换;生态完善,集成多种插件 | 日志量大、需要复杂日志处理(如格式转换、过滤)的场景 |
| EFK | Fluentd | 轻量、资源占用低;配置简单,易于部署;对K8s兼容性更好 | 中小型集群、资源有限、追求简单部署的场景(生产环境首选) |
EFK由Elasticsearch(存储)、Fluentd(收集)、Kibana(可视化)三个组件组成,部署顺序为:Elasticsearch → Fluentd → Kibana
创建nfs存储访问
启动master节点的nfs服务
创建/data/v1
kubectl create -f serviceaccount.yaml
kubectl create -f rbac.yaml
修改deployment.yaml
kubectl create -f deployment.yaml
kubectl create -f class.yaml
构建es集群
kubectl apply -f kube-logging.yaml
kubectl create -f elasticsearch-statefulset.yaml
kubectl create -f elasticsearch_svc.yaml
安装socat
yum install -y socat
端口转发,回环地址
kubectl port-forward es-cluster-0 9200:9200 --namespace=kube-logging
特定地址
kubectl port-forward --address 192.168.166.128 es-cluster-0 9200:9200 --namespace=kube-logging
部署kibana
bash
apiVersion: v1
kind: Service
metadata:
name: kibana
namespace: kube-logging
labels:
app: kibana
spec:
type: NodePort
ports:
- port: 5601
selector:
app: kibana
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: kibana
namespace: kube-logging
labels:
app: kibana
spec:
replicas: 1
selector:
matchLabels:
app: kibana
template:
metadata:
labels:
app: kibana
spec:
containers:
- name: kibana
image: docker.elastic.co/kibana/kibana:7.2.0
imagePullPolicy: IfNotPresent
resources:
limits:
cpu: 1000m
requests:
cpu: 100m
env:
- name: ELASTICSEARCH_URL
value: http://elasticsearch.kube-logging.svc.cluster.local:9200
ports:
- containerPort: 5601
volumeMounts:
- name: kibana-config
mountPath: /usr/share/kibana/config/
volumes:
- name: kibana-config
configMap:
name: kibana-configmap
####汉化kibana
kubectl -n kube-logging create configmap kibana-configmap --from-file=kibana.yml=./kibana.yml
###kibana.yml
#
# ** THIS IS AN AUTO-GENERATED FILE **
#
# Default Kibana configuration for docker target
server.name: kibana
server.host: "0"
elasticsearch.hosts: [ "http://elasticsearch:9200" ]
xpack.monitoring.ui.container.elasticsearch.enabled: true
i18n.locale: "zh-CN"
kubectl apply -f kibana.yaml
kubectl get pods -n kube-logging
kubectl get svc -n kube-logging
志过滤规则,过滤无用日志(如kube-system命名空间的组件日志),减少存储压力。
Kibana:
配置登录认证(如使用LDAP、用户名密码),避免未授权访问;
创建不同角色的用户(如管理员、运维人员),分配不同的权限(如查询权限、编辑权限);
定期备份Kibana配置(如仪表盘、索引模式),避免配置丢失
日志收集最佳实践
日志格式统一:所有应用采用统一的日志格式(如JSON格式),便于Kibana解析和筛选;
按应用/命名空间分类:将不同应用、不同命名空间的日志存储到不同的索引中,便于分类查询和管理;
日志级别规范:应用日志需包含级别(info、warn、error、fatal),便于快速筛选故障日志;
避免收集敏感日志:过滤掉密码、token等敏感信息,确保日志安全
组件部署最佳实践
Elasticsearch:
生产环境建议部署3节点集群(高可用),避免单节点故障导致日志丢失;
开启持久化存储(PV/PVC),选择高性能存储(如SSD),确保日志存储稳定;
配置资源限制(至少2核4Gi内存),避免资源不足导致Elasticsearch崩溃;
定期清理日志(配置索引生命周期管理ILM),避免日志过多占用存储空间。
日志收集组件(Fluentd/Logstash):
优先选择Fluentd(轻量、资源占用低,对K8s兼容性更好);
以DaemonSet方式部署,确保每个节点都能采集日志,避免遗漏;
配置日志过滤规则,过滤无用日志(如kube-system命名空间的组件日志),减少存储压力。
Kibana:
配置登录认证(如使用LDAP、用户名密码),避免未授权访问;
创建不同角色的用户(如管理员、运维人员),分配不同的权限(如查询权限、编辑权限);
定期备份Kibana配置(如仪表盘、索引模式),避免配置丢失