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

相关推荐
虎头金猫2 天前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
分布式存储与RustFS2 天前
MinIO 官方 Docker 镜像被移除:依赖它的项目该怎么办
docker·云原生·devops·对象存储·minio·分布式存储
codeejun2 天前
每日一Go·MySQL-5、锁机制全解析
云原生·golang
赵文宇(温玉)2 天前
CoreDNS的hosts插件的缺行配置导致k8s集群异常
容器·kubernetes·rancher
guo_wen_qiang2 天前
上传本地镜像到harbor中
docker·容器·持续部署
张洛闻Eren2 天前
k8s云原生【第十课】:水平 Pod 自动扩缩容
运维·数据库·云原生·kubernetes·github
忆~遂愿2 天前
本地片库怎么在外面打开?Plex + cpolar 搭一套可远程访问的私人影音库
docker·容器
Thneonl2 天前
你的 Pod 为什么 Pending:调度器两阶段
后端·kubernetes
不吃香菜kkk、2 天前
CI/CD(GitOps)学习与部署手册
运维·云原生·容器·kubernetes·云计算·jenkins·argocd
ChaITSimpleLove2 天前
云原生性能对决:JDK21虚拟线程+GraalVM vs .NET10/11 技术栈深度对比
微服务·云原生·serverless·graalvm native·native aot·runtime async·.net11/java21