首页 > 其他分享 >EFK采集k8s日志

EFK采集k8s日志

时间:2025-01-13 12:04:18浏览次数:3  
标签:filebeat name kind EFK elasticsearch 日志 k8s metadata

     在 Kubernetes 集群中,需要全面了解各个 pod 应用运行状态、故障排查和性能分析。但由于 Pod 是动态创建和销毁的,其日志分散且存储不持久,因此需要通过集中式日志采集方案,将日志收集到统一的平台并配置日志可视化分析和监控告警,以实现日志的可追溯性、实时监控和高效分析,从而提升运维效率和系统可靠性。

官网地址:日志架构 | Kubernetes

1.日志采集方案

方案一:ds控制器

每个节点有且仅有一个日志采集的Pod。并不需要注入原有的Pod。DaemonSet + nodeSelector调度到指定节点。DaemonSet 相对资源占用要小很多,但扩展性、租户隔离性受限,比较适用于功能单一或业务不是很多的集群。

优点:节省资源

缺点:需要配置RBAC权限

方案二:sidecar

每个pod再起一个容器,安装filebeat采集数据,使用emptyDir共享pod中日志。Sidecar 相对资源占用较多,但灵活性以及多租户隔离性较强,建议大型的 K8s 集群或作为 PaaS 平台为多个业务方服务的集群使用该方式。

优点:可以直接和业务容器共享存储和网络,将日志采集到目的端。

缺点: 如果一个节点有五十个pod,那就要注入五十个filebeat采集,造成资源浪费

方案三:开发自实现

让程序本身支持日志采集功能。

优点:无需运维接入,只需配置对应目标接口

缺点:跨部门沟通,费时间

总结:

    1. DaemonSet一般在中小型集群中使用

    2. Sidecar推荐在超大型的集群中使用

    3. 业务直写推荐在日志量极大的场景中使用

三种方案优缺点: 

因为方案一在业界使用更为广泛,并且官方也更为推荐,所以我们基于方案一来做k8s的日志采集。

2.创建单节点elasticsearch的yaml文件

apiVersion: v1
kind: Namespace
metadata:
  name: efk

---

apiVersion: apps/v1
kind: Deployment
metadata:
  name: elasticsearch
  namespace: efk
  labels:
    k8s-app: elasticsearch
spec:
  replicas: 1
  selector:
    matchLabels:
      k8s-app: elasticsearch
  template:
    metadata:
      labels:
        k8s-app: elasticsearch
    spec:
      containers:
      # 指定需要安装的ES版本号
      - image: docker.elastic.co/elasticsearch/elasticsearch:7.17.22
        name: elasticsearch
        resources:
          limits:
            cpu: 2
            memory: 3Gi
          requests:
            cpu: 0.5 
            memory: 500Mi
        env:
          # 配置集群部署模式,此处我由于是实验,配置的是单点
          - name: "discovery.type"
            value: "single-node"
          - name: ES_JAVA_OPTS
            value: "-Xms256m -Xmx256m" 
        ports:
        - containerPort: 9200
          name: db
          protocol: TCP
        volumeMounts:
        - name: elasticsearch-data
          mountPath: /usr/share/elasticsearch/data
      volumes:
      - name: elasticsearch-data
        persistentVolumeClaim:
          claimName: es-pvc

---

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: es-pvc
  namespace: efk
spec:
  storageClassName: "nfs-sc"
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 10Gi

---

apiVersion: v1
kind: Service
metadata:
  name: elasticsearch
  namespace: efk
spec:
  ports:
  - port: 9200
    protocol: TCP
    targetPort: 9200
  selector:
    k8s-app: elasticsearch

3.创建kibana的yaml文件

apiVersion: apps/v1
kind: Deployment
metadata:
  name: kibana
  namespace: efk
spec:
  replicas: 1
  selector:
    matchLabels:
      k8s-app: kibana
  template:
    metadata:
      labels:
        k8s-app: kibana
    spec:
      containers:
      - name: kibana
        image: docker.elastic.co/kibana/kibana:7.17.22
        resources:
          limits:
            cpu: 2
            memory: 2Gi
          requests:
            cpu: 0.5 
            memory: 500Mi
        env:
          - name: ELASTICSEARCH_HOSTS
            value: http://elasticsearch.efk.svc.cherry.com:9200
          - name: I18N_LOCALE
            value: zh-CN
        ports:
        - containerPort: 5601
          name: ui
          protocol: TCP

---
apiVersion: v1
kind: Service
metadata:
  name: kibana
  namespace: efk
spec:
  type: NodePort
  ports:
  - port: 5601
    protocol: TCP
    targetPort: ui
    nodePort: 5601
  selector:
    k8s-app: kibana

4.以DaemonSet的方式创建filebeat的yaml文件

apiVersion: v1
kind: ConfigMap
metadata:
  name: filebeat-config
data:
  filebeat.yml: |-
    filebeat.config:
      inputs:
        path: ${path.config}/inputs.d/*.yml
        reload.enabled: false
      modules:
        path: ${path.config}/modules.d/*.yml
        reload.enabled: false
    output.elasticsearch:
      hosts: ['elasticsearch.efk.svc.cherry.com:9200']
      index: 'k8s-ds-%{+yyyy.MM.dd}'

    setup.ilm.enabled: false
    setup.template.name: "k8s-ds"
    setup.template.pattern: "k8s-ds*"
    setup.template.overwrite: false
    setup.template.settings:
      index.number_of_shards: 5
      index.number_of_replicas: 0
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: filebeat-inputs
data:
  kubernetes.yml: |-
    - type: container
      stream: all
      paths: 
        - '/var/lib/docker/containers/*/*.log'
      processors:
        - add_kubernetes_metadata:
            in_cluster: true

---

apiVersion: v1
kind: ServiceAccount
metadata:
  name: filebeat
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: filebeat
subjects:
- kind: ServiceAccount
  name: filebeat
  namespace: default
roleRef:
  kind: ClusterRole
  name: filebeat
  apiGroup: rbac.authorization.k8s.io
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: filebeat
  labels:
    k8s-app: filebeat
rules:
- apiGroups: [""]
  resources:
  - namespaces
  - pods
  - nodes
  verbs:
  - get
  - watch
  - list

---

apiVersion: apps/v1 
kind: DaemonSet
metadata:
  name: filebeat
spec:
  selector:
    matchLabels:
      k8s-app: filebeat
  template:
    metadata:
      labels:
        k8s-app: filebeat
    spec:
      tolerations:
      - key: node-role.kubernetes.io/master
        effect: NoSchedule
        operator: Exists
      serviceAccountName: filebeat
      terminationGracePeriodSeconds: 30
      containers:
      - name: filebeat
        image: docker.elastic.co/beats/filebeat:7.17.22
        args: [
          "-c", "/etc/filebeat.yml",
          "-e",
        ]
        securityContext:
          runAsUser: 0
        resources:
          limits:
            memory: 200Mi
          requests:
            cpu: 100m
            memory: 100Mi
        volumeMounts:
        - name: config
          mountPath: /etc/filebeat.yml
          readOnly: true
          subPath: filebeat.yml
        - name: inputs
          mountPath: /usr/share/filebeat/inputs.d
          readOnly: true
        - name: varlibdockercontainers
          mountPath: /var/lib/docker/containers
          readOnly: true
      volumes:
      - name: config
        configMap:
          defaultMode: 0600
          name: filebeat-config
      - name: varlibdockercontainers
        hostPath:
          path: /var/lib/docker/containers
      - name: inputs
        configMap:
          defaultMode: 0600
          name: filebeat-inputs

标签:filebeat,name,kind,EFK,elasticsearch,日志,k8s,metadata
From: https://blog.csdn.net/m0_69326428/article/details/145110880

相关文章

  • ELFK日志采集实战
    一、日志分析概述日志分析是运维工程师解决系统故障,发现问题的主要手段日志主要包括系统日志、应用程序日志和安全日志系统运维和开发人员可以通过日志了解服务器软硬件信息、检查配置过程中的错误及错误发生的原因经常分析日志可以了解服务器的负荷,性能安全性,从而及时......
  • k8s volcano + deepspeed多机训练 + RDMA ROCE+ 用户权限安全方案
    前提:nvidia、cuda、nvidia-fabricmanager等相关的组件已经在宿主机正确安装,如果没有安装可以参考我之前发的文章GPUA800A100系列NVIDIA环境和PyTorch2.0基础环境配置【建议收藏】_a800多卡运行环境配置-CSDN博客文章浏览阅读1.1k次,点赞8次,收藏16次。Ant系列GPU支持NvLink&N......
  • 在shell脚本中为日志添加颜色
    转自:https://www.cnblogs.com/ydswin/p/18667096在Shell脚本中,可以通过添加ANSI转义序列来为日志输出添加颜色。以下是一个完整的Shell脚本示例,包含日志颜色定义、日志函数封装以及使用示例:完整脚本:colored_logs.sh#!/bin/bash#定义颜色变量RED='\033[0;31m'GREEN='......
  • 在shell脚本中为日志添加颜色
    在Shell脚本中,可以通过添加ANSI转义序列来为日志输出添加颜色。以下是一个完整的Shell脚本示例,包含日志颜色定义、日志函数封装以及使用示例:完整脚本:colored_logs.sh#!/bin/bash#定义颜色变量RED='\033[0;31m'GREEN='\033[0;32m'YELLOW='\033[0;33m'BLUE='\033[0;3......
  • Kafka 是一个分布式流式平台,主要用于处理大规模、高吞吐量的消息传递、日志收集和实时
    Kafka集群是什么?Kafka是一个分布式流式平台,主要用于处理大规模、高吞吐量的消息传递、日志收集和实时数据流。Kafka集群是由多个Kafka服务器(称为Broker)组成的,它们共同工作以实现消息的高可用性、可靠性、可扩展性和容错性。Kafka集群的目的是确保消息的持久化和高效传输,同......
  • 如何在网站中实现数据库修改的日志记录?(确保网站数据库修改安全性的日志记录最佳实践)
    在企业网站运营过程中,数据库的每一次修改都可能影响到系统的稳定性和数据的一致性。因此,建立一个完善的日志记录系统至关重要。本问题旨在探讨如何有效地记录数据库修改日志,以确保数据的安全性和可追溯性。答案:为了确保网站数据库修改的安全性和可追溯性,建议采取以下步骤来实现......
  • 如何定期清理IIS的错误记录日志文件以防止磁盘空间不足?
    随着IIS组件的长期使用,错误日志文件会逐渐增大,可能导致磁盘空间被占满,进而影响服务器性能和网站正常运行。因此,定期清理IIS的错误记录日志文件非常重要。以下是详细的清理步骤和注意事项,帮助您有效管理日志文件,确保系统稳定运行:了解日志文件位置:IIS的错误日志文件通常存储在以......
  • ASP.NET Core - 日志记录系统(二)
    本篇接着上一篇[ASP.NETCore-日志记录系统(一)]往下讲,所以目录不是从1开始的。2.4日志提供程序2.4.1内置日志提供程序ASP.NETCore包括以下日志记录提供程序作为共享框架的一部分:ConsoleDebugEventSourceEventLog除此之外,还有一些微软官方提供的,但是没有和......
  • 寒假训练日志
    1.12CF49ECodeForcesLinkDifficulty:2300Tag:区间DP#include<bits/stdc++.h>usingnamespacestd;constintN=60;strings1,s2;booldp1[N][N][30],dp2[N][N][30];intdp[N][N];map<int,vector<pair<int,int>>>mp;intn,len1,len2;in......
  • k8s如何进行版本回滚
    在Kubernetes(k8s)中,版本回滚通常指的是将Deployment、DaemonSet或StatefulSet等资源回滚到之前的版本。Kubernetes通过记录资源的修订历史(revisionhistory)来支持回滚操作。以下是回滚操作的步骤:1.查看历史版本首先,你需要查看资源的修订历史,确定要回滚到的版本。kube......