filebeat 采集k8s 中nginx deployment 日志

一、背景

在k8s集群中,已经部署了nginx应用,需要使用elk来收集日志。

注意:elk并没有放在k8s集群中,使用单独的服务器进行安装。不推荐elk放在k8s集群中!

其中filebeat,使用DaemonSet方式部署,这样就可以自动收集了。

二、环境说明

操作系统:centos 7.6

k8s版本:1.18.1

ip地址:10.212.82.63

配置:2核4g

主机名:k8s-master

操作系统:centos 7.6

k8s版本:1.18.1

ip地址:10.212.82.65

配置:2核4g

主机名:k8s-node01

日志说明

nginx容器,默认的日志路径为:/var/log/nginx,所以在部署时,我会将此目录映射到宿主机的/opt/log/nginx目录(日志格式需要为json)

部署filebeat时,需要将/opt/log/nginx目录挂载到filebeat容器中,这样才能读取nginx日志。

elk

本文使用elk版本,统一采用7.5.1

由于资源紧张,我这里演示效果,在 k8s-node01 部署elk。在实际生产环境中,请单独部署。

关于elasticsearch和head插件安装,请参考链接:

https://www.cnblogs.com/xiao987334176/p/13565468.html

关于logstash安装,请参考链接:

https://www.cnblogs.com/xiao987334176/p/13565790.html

关于kibana安装,请参考链接:

https://www.cnblogs.com/xiao987334176/p/13570301.html

请确保elk工作正常,kibana能看到 logstash收集到的/var/log/messages日志信息。

nginx

登录到主机k8s-node01,创建日志目录

  1. mkdir -p /opt/log/nginx

登录到主机k8s-master,部署nginx

新建文件 nginx-deployment.yaml,内容如下:                  

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: nginx-1
  5. spec:
  6. selector:
  7. matchLabels:
  8. run: nginx-1
  9. replicas: 1
  10. template:
  11. metadata:
  12. labels:
  13. run: nginx-1
  14. spec:
  15. containers:
  16. - name: nginx-1
  17. image: nginx:stable-alpine
  18. ports:
  19. - containerPort: 80
  20. volumeMounts:
  21. - mountPath: /var/log/nginx
  22. name: nginx-log
  23. restartPolicy: Always
  24. volumes:
  25. - name: nginx-log
  26. hostPath:
  27. path: /opt/log/nginx    

新建文件 nginx-service.yaml,内容如下: 

  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4. name: nginx-1
  5. labels:
  6. run: nginx-1
  7. spec:
  8. type: NodePort
  9. ports:
  10. - port: 80
  11. name: nginx-port
  12. targetPort: 80
  13. protocol: TCP
  14. nodePort: 30008
  15. selector:
  16. run: nginx-1

开始正式部署

  1. kubectl apply -f nginx-service.yaml
  2. kubectl apply -f nginx-deployment.yaml

 

filebeat

filebeat的镜像,需要在官方的基础上,做一次封装。因为配置文件,需要调整一下。由于资源紧张,这里并没有使用私有仓库harbor或者云产商的私有仓库,直接使用本地存储。

登录到主机k8s-node01,新建目录,并创建dockerfile

  1. mkdir -p /opt/filebeat
  2. cd /opt/filebeat
  3. vi dockerfile

内容如下:

  1. FROM elastic/filebeat:7.5.1
  2. ADD filebeat.yml /usr/share/filebeat/filebeat.yml

 

新建文件filebeat.yml,内容如下:

  1. # 收集系统日志
  2. filebeat.inputs:
  3. - type: log
  4. enabled: true
  5. paths:
  6. - /opt/log/nginx/access.log
  7. fields:
  8. log_source: nginx-access
  9. - type: log
  10. enabled: true
  11. paths:
  12. - /opt/log/nginx/error.log
  13. fields:
  14. log_source: nginx-error
  15. filebeat.config:
  16. modules:
  17. path: ${path.config}/modules.d/*.yml
  18. reload.enabled: false
  19. processors:
  20. - add_cloud_metadata: ~
  21. - add_docker_metadata: ~
  22. output.elasticsearch:
  23. hosts: '10.212.82.65:9200'
  24. indices:
  25. - index: "filebeat-nginx-%{+yyyy.MM.dd}"

 

说明:

这里是读取2个日志文件,分别是access.log和error.log。然后将内容输出到elasticsearch

请根据实际情况修改!

生成镜像

  1. docker build -t my-filebeat:v1 .

登录主机k8s-master,新建filebeat.yaml,内容如下:

  1. apiVersion: apps/v1
  2. kind: DaemonSet
  3. metadata:
  4. name: filebeat-1
  5. spec:
  6. selector:
  7. matchLabels:
  8. run: filebeat-1
  9. template:
  10. metadata:
  11. labels:
  12. run: filebeat-1
  13. spec:
  14. containers:
  15. - name: filebeat-1
  16. image: my-filebeat:v1
  17. imagePullPolicy: IfNotPresent
  18. volumeMounts:
  19. - mountPath: /opt/log
  20. name: log
  21. restartPolicy: Always
  22. volumes:
  23. - name: log
  24. hostPath:
  25. path: /opt/log

 

 

注意:这里采用DaemonSet方式部署,必须挂载目录/opt/log,否则无法读取。

正式部署

 
  

    • kubectl apply -f filebeat.yaml

 访问elasticsearch head插件,查看filebeat索引是否存在

filebeat 采集k8s 中nginx deployment 日志_第1张图片

 登录kibana,新建索引filebeat

filebeat 采集k8s 中nginx deployment 日志_第2张图片

索引名称为:filebeat-nginx-*

filebeat 采集k8s 中nginx deployment 日志_第3张图片 

 

添加索引之后,返回主页面

点击change,切换索引到filebeat-nginx-*,然后刷新几遍nginx访问页面,效果如下:

filebeat 采集k8s 中nginx deployment 日志_第4张图片

 

你可能感兴趣的:(kubernetes,nginx,java)