k8s使用ELK收集Pod日志

k8s使用ELK收集Pod日志

本次配置基于已经搭建好ELK,目的是将k8s运行pod的日志用ELK环境进行收集
使用k8s来收集日志有两种方式
– 一种是使用DaemonSet,pod将日志存储到一个地方(挂载等),DaemonSet去读取
– 一种是在pod中部署filebeat容器,通过数据卷直接在pod中收集日志

本次配置采用第二种方式,第一种感觉局限比较大,第二种耗费资源应该更多
《k8s使用ELK收集Pod日志》

1、创建ConfigMap配置filebeat

cat > filebeatMap.yml <<EOF
apiVersion: v1
kind: ConfigMap
metadata:
  name: filebeat-nginx-config
data:
  filebeat.yml: |
      filebeat.inputs:
      - type: log
        enable: true
        paths:
          - /var/log/nginx/access.log   # filebeat中日志文件位置
        fields: # 给日志文件的标签
          app: nginx
          type: nginx-access
      - type: log
        enable: true
        paths:
          - /var/log/nginx/error.log
        fields: # 给日志文件的标签
          app: nginx
          type: nginx-error
      output.logstash:
        hosts: ['192.168.126.21:5044']
EOF
kubectl apply -f filebeatMap.yml

2、创建pod部署应用

创建一个pod包含两个容器,一个nginx,一个filebeat

cat >nginx-filebeat-deploy.yaml<<EOF
apiVersion: v1
kind: Service
metadata:
  name: nginx-test-service
spec:
  type: NodePort
  ports:
  - name: http
    port: 80
    protocol: TCP
  selector:
    app: nginx
    type: nginx-demo
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-demo
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
      type: nginx-demo
  template:
    metadata:
      labels:
        app: nginx
        type: nginx-demo
    spec:
      containers:
      - name: nginx
        image: docker.io/nginx
        imagePullPolicy: IfNotPresent
        volumeMounts:
        - name: nginx-logs
          mountPath: /var/log/nginx
      - name: filebeat
        image: docker.io/elastic/filebeat:7.15.0
        imagePullPolicy: IfNotPresent
        args: [
          "-c", "/etc/filebeat.yml",
          "-e",
        ]
        volumeMounts:
        - name: filebeat-config
          mountPath: /etc/filebeat.yml
          subPath: filebeat.yml
        - name: nginx-logs
          mountPath: /var/log/nginx
      volumes:
      - name: nginx-logs # 通过临时数据卷,将nginx容器中日志挂在到filebeat容器中
        emptyDir: {}
      - name: filebeat-config
        configMap:
          name: filebeat-nginx-config
EOF
kubectl apply -f nginx-filebeat-deploy.yaml

镜像拉不下来,手动导入仓库

docker pull elastic/filebeat:7.15.0
docker save -o filebeat:7.15.0.tar elastic/filebeat:7.15.0
ctr -n=k8s.io images import filebeat:7.15.0.tar

《k8s使用ELK收集Pod日志》

《k8s使用ELK收集Pod日志》

《k8s使用ELK收集Pod日志》

3、修改logstash配置

修改/etc/logstash/pipelines.yml,添加管道配置

- pipeline.id: k8s-filebeat
  path.config: "/etc/logstash/pipeconf.d/k8s-filebeat.conf"
cat > /etc/logstash/pipeconf.d/k8s-filebeat.conf <<EOF
input {
  beats {
    port => 5044
  }
}

output {
      elasticsearch {
        hosts => ["http://192.168.126.22:9200"]
        index => "k8s-nginx-log-%{+YYYY.MM.dd}"
      }
}

EOF

systemctl restart logstash.service
《k8s使用ELK收集Pod日志》

4、查看数据是否收集到

刷新nginx页面后

elasticsearch-head查看
《k8s使用ELK收集Pod日志》

kibana查看
《k8s使用ELK收集Pod日志》

问题及解决

1、pod无法启动,镜像拉不下来

原因外网问题,手动导入仓库

2、filebeat启动后无法将数据传输给elasticsearch

原因1:需要删除或者修改其他filebeat在logstash的配置,两者端口相同会导致冲突,或者配置规则用同一个管道也行

原因2:配置错误,由于参考的配置直接拿过来使用,对nginx日志的挂载位置出错导致失败,修正即可,拿来主义要不得,还是要仔细看

3、莫名其妙registry.k8s.io/pause:3.6消失了

pause:3.6消失了导致pod起不来
原因是磁盘使用率达到了80%以上,kubnet开始清理磁盘删除镜像,设置重启即可
vim /var/lib/kubelet/config.yaml

imageGCHighThresholdPercent: 99
imageGCLowThresholdPercent: 80

参考

kubernetes中使用ELK进行日志收集

点赞

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注