K8s通过SidecarSet进行日志收集

avatar 2023年8月3日18:44:26 评论 458 次浏览

日志做了等级分类,日志就会有多个文件,以前写了一个日志收集的方法主要是针对日志输出到stout然后通过filebate利用Daemonset在每个节点上起一个容器,然后收集写到宿主机上的日志内容,这种方式针对资源的使用相对较小,但是使用SidecarSet进行日志收集是在每个pod里加入一个初始化容器,针对资源的使用相对较高,不过因为日志较多,也不得不选择。下面看一下sidecarset的使用方式吧,可以参考官网:https://openkruise.io/zh/docs/

安装这里就不说了,使用可以看官网,但是官网针对写入多一些例子有一些异常,不过不太重要,也就格式的问题,如果不喜欢的话,可以看看我的,首先,我这里已经安装好了,我需要做一个demo,这里我使用标签的方式进行日志收集,先看一下我的demo。

 cat nginx.yml
 apiVersion: apps/v1
 kind: Deployment
 metadata:
   labels:
     app: nginx
   name: nginx
 spec:
   replicas: 1
   selector:
     matchLabels:
       app: nginx
   template:
     metadata:
       labels:
         app: nginx
         # 注入 filebeat sidecar 容器的label
         kruise.io/inject-filebeat: "true"
     spec:
       containers:
       - name: nginx
         image: nginx:latest
         volumeMounts:
         # 通过 volumeMounts 与filebeat sidecar容器共享 log 目录
         - mountPath: /var/log/nginx
           name: log
       volumes:
       - name: log
         emptyDir: {}
 ---
 apiVersion: v1
 kind: Service
 metadata:
   labels:
     app: nginx
   name: nginx
 spec:
   ports:
   - name: nginx
     port: 80
     protocol: TCP
     targetPort: 80
   selector:
     app: nginx
     release: prod
   type: ClusterIP

这里有两个注意事项,第一个是我在spec.template.metadata.labels下加了一个标签“kruise.io/inject-filebeat: "true"”这个是我需要在SidecarSet定义好我的日志收集方式的,只要我把我的模版里添加这个标签,后期有其他服务发布就会自动添加日志收集功能,另外一个是需要定义日志收集的目录。我需要把nginx的日志目录共享给filebeate,然后filebate才能读取日志内容,为了不占有磁盘空间,我这里就选择临时目录。spec.template.spec.containers这里定义了两个目录,分别是nginx的目录和共享给filebate的目录。

下面是设置filebeate,日志共享给filebeate了,filebate需要收集日志内容,在filebeate里有一个配置文件,可以根据自己的环境选择不通的收集方式,我这里选择的是kafaka,我需要在filebate里定义日志收集的方式。

 cat filebeat-config.yml
 apiVersion: v1
 data:
   filebeat.yml: |
     filebeat.inputs:
     - type: log
       paths:
       - /var/log/*
     output.kafka:
       hosts: ["173.32.48.92:9092","173.33.214.42:9092","173.32.48.91:9092"]
       topic: "test"
       version: 0.11.0.0
       compression: gzip
       max_message_bytes: 1000000
       partition.round_robin:
       reachable_only: true
       required_acks: 1
 kind: ConfigMap
 metadata:
   name: filebeat-config

定义好kafka的topic,然后写入到kafka里最后通过logstash过滤,最后写入到es里,我这里就先不说后面的过程里,直接贴一下filebate的yml文件。

 cat filebeat-sidecarset.yml
 apiVersion: apps.kruise.io/v1alpha1
 kind: SidecarSet
 metadata:
   name: filebeat-sidecarset
 spec:
   selector:
     # 需要注入 sidecar 容器的 pod labels
     matchLabels:
       kruise.io/inject-filebeat: "true"
   #namespace: default
   updateStrategy:
     type: RollingUpdate
     maxUnavailable: 1
   containers:
   - args:
     - -e
     - -E
     - http.enabled=true
     image: elastic/filebeat:8.6.2
     name: filebeat
     resources:
       limits:
         cpu: "1"
         memory: 200Mi
       requests:
         cpu: 100m
         memory: 100Mi
     podInjectPolicy: AfterAppContainer
     volumeMounts:
     - mountPath: /usr/share/filebeat/filebeat.yml
       readOnly: true
       subPath: filebeat.yml
       name: filebeat-config
     - mountPath: /var/log
       name: log
     podInjectPolicy: AfterAppContainer
   volumes:
   - configMap:
       name: filebeat-config
     name: filebeat-config
   - name: log
     emptyDir: {}
   - name: host-time
     hostPath:
       path: /etc/localtime

上面已经说过了,只要定义了filebate相通的标签,在启动服务的时候自动会初始化filebate,,另外就是定义的日志收集,这里要说明一下,定义目录后原本nginx的stout输出将不能在继续使用,不过已经写到容器的目录文件中了,下面创建filebeat。

 [wolf@wulaoer.org 🔥🔥🔥🔥 ~ ]$ kubectl apply -f filebeat-config.yml
 [wolf@wulaoer.org 🔥🔥🔥🔥 ~ ]$ kubectl apply -f filebeat-sidecarset.yml
 [wolf@wulaoer.org 🔥🔥🔥🔥 ~ ]$ kubectl apply -f nginx.yml

创建完成之后,如果你直接写到es里就可以在es集群中看看,如果写到是kafka在kafka中,本文中是发送到kafka中,在kafka中是否有数据,如果没有数据看一下是否有test这个topic,如果没有就创建一下。另外需要注意,如果你一个namespace下有前端有后端,那就需要通过正则进行匹配,前端是通过ip开头后端是通过时间开头,可以参考:https://www.wulaoer.org/?p=1360

另为就是上下文的问题,如果你的日志内容中有分行,建议在采集的时候就进行通过正则进行采集,

 cat filebeat-config.yml
 apiVersion: v1
 data:
   filebeat.yml: |
     filebeat.inputs:
     - type: log
       paths:
       - /var/log/*
       multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}\ [0-9]{2}:[0-9]{2}:[0-9]{2}|(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)'
   multiline.negate: true
   multiline.match: after
     output.kafka:
       hosts: ["173.32.48.92:9092","173.33.214.42:9092","173.32.48.91:9092"]
       topic: "test"
       version: 0.11.0.0
       compression: gzip
       max_message_bytes: 1000000
       partition.round_robin:
       reachable_only: true
       required_acks: 1
 kind: ConfigMap
 metadata:
   name: filebeat-config

这样在采集的时候就通过正则,然后在过滤的时候也使用这个正则即可,没有了,看看其他的吧。

avatar

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: