一、使用Filebeat收集容器内的日志

有些程序在设计时,并没有符合云原生设计,也就是把程序的日志直接输出到了本地文件,此时如果也需要收集日志,可以在程序的 Pod 内,启动一个 Filebeat 的容器,用于收集日志。

1、创建存放目录

[root@k8s-master01 ~]# cd /root/eck/
[root@k8s-master01 eck]# mkdir sidecar

2、创建相关文件

创建app.yaml文件

[root@k8s-master01 ~]# cd /root/eck/sidecar/
[root@k8s-master01 sidecar]# vim app.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: app
  labels:
    app: app
    env: release
spec:
  selector:
    matchLabels:
      app: app
  replicas: 1
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 0
      maxSurge: 1
  # minReadySeconds: 30
  template:
    metadata:
      labels:
        app: app
    spec:
      containers:
        - name: app
          image: registry.cn-hangzhou.aliyuncs.com/abroad_images/alpine:3.6 
          imagePullPolicy: IfNotPresent
          volumeMounts:
          - name: logpath
            mountPath: /opt/
          env:
            - name: TZ
              value: "Asia/Shanghai"
            - name: LANG
              value: C.UTF-8
            - name: LC_ALL
              value: C.UTF-8
          command:
            - sh
            - -c
            - while true; do date >> /opt/date.log; sleep 2;  done  
      volumes:
        - name: logpath
          emptyDir: {}

# 应用
[root@k8s-master01 sidecar]# kaf app.yaml 

# 查看pod
[root@k8s-master01 sidecar]# kgp | grep app
app-7cb6869459-tzcxs   1/1     Running   0          2m8s

# 该pod无法通过logs -f查看日志文件
[root@k8s-master01 sidecar]# k logs -f app-7cb6869459-tzcxs

# 该pod只能通过进入容器后查看日志文件
[root@k8s-master01 sidecar]# k exec -it app-7cb6869459-tzcxs  -- sh 
/ # tail -f /opt/date.log 
Thu Apr 24 02:00:43 UTC 2025
Thu Apr 24 02:00:45 UTC 2025
Thu Apr 24 02:00:47 UTC 2025
Thu Apr 24 02:00:49 UTC 2025
Thu Apr 24 02:00:51 UTC 2025
Thu Apr 24 02:00:53 UTC 2025
Thu Apr 24 02:00:55 UTC 2025
Thu Apr 24 02:00:57 UTC 2025
Thu Apr 24 02:00:59 UTC 2025
Thu Apr 24 02:01:01 UTC 2025
Thu Apr 24 02:01:03 UTC 2025

创建filebeat-cm.yaml文件

[root@k8s-master01 ~]# cd /root/eck/sidecar/
[root@k8s-master01 sidecar]# vim filebeat-cm.yaml 
apiVersion: v1
kind: ConfigMap
metadata:
  name: filebeatconf
data:
  filebeat.yml: |-
    filebeat.inputs:
    - input_type: log
      paths:
        - /data/log/*/*.log
      tail_files: true
      fields:
        pod_name: '${podName}'
        pod_ip: '${podIp}'
        pod_deploy_name: '${podDeployName}'
        pod_namespace: '${podNamespace}'
      fields_under_root: true
    output.kafka:
      hosts: ["kafka.logging:9092"]
      topic: "k8spodlogs"
      codec.json:
        pretty: false
      keep_alive: 30s

# 应用
[root@k8s-master01 sidecar]# kaf filebeat-cm.yaml 

创建app-filebeat.yaml文件

[root@k8s-master01 ~]# cd /root/eck/sidecar/
[root@k8s-master01 sidecar]# vim app-filebeat.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: app
  labels:
    app: app
    env: release
spec:
  selector:
    matchLabels:
      app: app
  replicas: 1
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 0
      maxSurge: 1
  # minReadySeconds: 30
  template:
    metadata:
      labels:
        app: app
    spec:
      containers:
        - name: filebeat                        
          image: registry.cn-hangzhou.aliyuncs.com/github_images1024/filebeat:8.17.0 
          args:
          - -e
          - -c
          - /mnt/filebeat.yml
          resources:
            requests:
              memory: "100Mi"
              cpu: "10m"
            limits:
              cpu: "200m"
              memory: "300Mi"
          imagePullPolicy: IfNotPresent
          env:
            - name: podIp
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: status.podIP
            - name: podName
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: metadata.name
            - name: podNamespace
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: metadata.namespace
            - name: podDeployName
              value: app
            - name: NODE_NAME
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: spec.nodeName
            - name: TZ
              value: "Asia/Shanghai"
          securityContext:
            runAsUser: 0
          volumeMounts:
            - name: logpath
              mountPath: /data/log/app/
            - name: filebeatconf
              mountPath: /mnt/ 
        - name: app
          image: registry.cn-hangzhou.aliyuncs.com/abroad_images/alpine:3.6 
          imagePullPolicy: IfNotPresent
          volumeMounts:
            - name: logpath
              mountPath: /opt/
          env:
            - name: TZ
              value: "Asia/Shanghai"
            - name: LANG
              value: C.UTF-8
            - name: LC_ALL
              value: C.UTF-8
          command:
            - sh
            - -c
            - while true; do date >> /opt/date.log; sleep 2;  done 
      volumes:
        - name: logpath
          emptyDir: {}
        - name: filebeatconf
          configMap:
            name: filebeatconf
            items:
              - key: filebeat.yml
                path: filebeat.yml 

# 应用
[root@k8s-master01 sidecar]# k replace -f  app-filebeat.yaml 

# 查看pod
[root@k8s-master01 sidecar]# kgp 
NAME                   READY   STATUS    RESTARTS   AGE
app-5ffb6486f6-jwwts   2/2     Running   0          9m15s

3、在搜索框中搜索message,选择message后,点击后面的【+】

image-20250424103705592

4、观察到message信息输出日志信息

image-20250424104509252

3.7 环境清理

1、卸载 sidecar

[root@k8s-master01 ~]# cd /root/eck/sidecar/
[root@k8s-master01 sidecar]# kubectl delete -f app-filebeat.yaml -f app.yaml -f filebeat-cm.yaml

2、卸载 ECK

[root@k8s-master01 ~]# cd /root/eck/
[root@k8s-master01 eck]# kubectl delete -f filebeat.yaml -f filebeat-rbac.yaml -f logstash.yaml -f kibana.yaml -f es-cluster.yaml -n logging

3、卸载 CRD

[root@k8s-master01 eck]# kubectl delete -f crds.yaml -f operator.yaml 

4、卸载kafka和zk

[root@k8s-master01 eck]# helm delete kafka zookeeper -n logging
[root@k8s-master01 eck]# k delete po kafka-client -n logging