k8s-EFK

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配置(如仪表盘、索引模式),避免配置丢失

相关推荐
阿里云云原生9 小时前
AgentTeams 和 Claude Tag 都进入群聊模式,是新范式还是新叙事?
云原生·agent
阿里云云原生1 天前
Higress v2.2.3 发布:正式入驻 CNCF Sandbox,AI Gateway 与 Ingress 迁移能力双向加固
云原生
lichenyang4532 天前
Docker 学习笔记(四):Dockerfile,把项目打成自己的镜像
docker·容器
lichenyang4532 天前
Docker 学习笔记(三):Docker 网络、bridge、子网和容器互通
docker·容器
lichenyang4532 天前
Docker 学习笔记(二):docker run 的参数到底在控制什么?
docker·容器
阿里云云原生2 天前
香港站【企业 AI Agent 工程化实战专场】来啦,邀您7月9日见!
云原生·agent
阿里云云原生2 天前
研发域与运维域的“数字握手”:通过 Agentic Skills 实现 DevOps 全链路自动化
云原生
运维开发故事4 天前
基于 Arthas 的多集群在线诊断系统设计与实现
kubernetes
Patrick_Wilson6 天前
从「改个端口」到 502:Next.js on k8s 的容器端口、Service 映射与 env 覆盖
docker·kubernetes·next.js
阿里云云原生6 天前
AI 开发新常态:当 Cursor、Claude、Codex 并行,如何统一管理散落的 Skill 资产?
云原生·ai编程