前言:
前一篇文章《helm部署ELK及pod日志收集》从平台层面收集了k8s所有pod的日志(实际是汇集了每个节点上docker打印的所有容器日志),但是这仅限于容器前台输出的日志。对于服务自己打印到文件的分级日志则需要我们用其他方式收集。本章提供一个方案,收集服务打印到指定目录的所有日志。

1. 环境说明

ELK已部署如下:

[root@DoM01 ~]# kubectl get service -n elk
NAME                            TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)             AGE
elasticsearch                   NodePort    10.1.4.111     <none>        9200:30028/TCP      2d
elasticsearch-master            ClusterIP   10.1.104.188   <none>        9200/TCP,9300/TCP   30h
elasticsearch-master-headless   ClusterIP   None           <none>        9200/TCP,9300/TCP   30h
kibana-kibana                   NodePort    10.1.43.153    <none>        5601:30026/TCP      2d
logstash-logstash-headless      ClusterIP   None           <none>        9600/TCP            2d

2. 收集方案

2.1 方案说明

1)创建一个pod,其中包含两个容器,分别是主服务(以nginx为例)和filebeat
2)filebeat和nginx共享日志目录,nginx写入filebeat收集
3)将filebeat的配置文件挂载为configmap便于修改

2.2 方案示例

  • yml文件
apiVersion: v1
kind: Pod
metadata:
  name: nginx-filebeat
  namespace: test
spec:
  containers:
  - name: nginx
    image: harbocto.xxx.com.cn/public/nginx
    env:
      - name: TZ
        value: Asia/Shanghai
    volumeMounts:
    - mountPath: /var/log/nginx/
      name: nginxlog
  - name: filebeat
    image: harbocto.xxx.com.cn/public/filebeat:8.0.0-SNAPSHOT
    env:
      - name: TZ
        value: Asia/Shanghai
    volumeMounts:
    - mountPath: /var/log/nginx/
      name: nginxlog
    - mountPath: /usr/share/filebeat/filebeat.yml
      name: filebeatyml
      subPath: filebeat.yml
  volumes:
  - name: nginxlog
    persistentVolumeClaim:
      claimName:  nginxlog
  - name: filebeatyml
    configMap:
      name: filebeat
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: filebeat
  namespace: test
data:
  filebeat.yml: |
    filebeat.inputs:
    - type: log
      enabled: true
      paths:
        - /var/log/nginx/*.log
    setup.ilm.enabled: false
    setup.template.name: "nginx-dev"
    setup.template.pattern: "nginx-dev-*"
    output.elasticsearch:
      host: 'nginx_test'
      hosts: '${ELASTICSEARCH_HOSTS:elasticsearch-master.elk:9200}'
      index: "nginx-dev-%{+yyyy.MM.dd}"
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: nginxlog
  namespace: test
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi
  • 启动
[root@DoM01 ~]# kubectl create namespace test
[root@DoM01 ~]# kubectl create -f nginx-filebeat-test.yml
pod/nginx-filebeat created
configmap/filebeat created
[root@DoM01 ~]# kubectl get pod -n test
NAME             READY   STATUS    RESTARTS   AGE
nginx-filebeat   2/2     Running   0          35m

2.3 filebeat的配置文件

  • 上边comfigmap的说明
apiVersion: v1
kind: ConfigMap
metadata:
  name: filebeat
  namespace: test
data:
  # filebeat.yml是filebeat的配置文件名(关于key名参见《k8s对象-congmap》,此处不赘述)
  filebeat.yml: |
    filebeat.inputs:
    - type: log
      enabled: true
      # 指明收集日志的目录
      paths:
        - /var/log/nginx/*.log
    #索引生命管理必须关闭,否则忽略自定义索引
    setup.ilm.enabled: false
    #自定义索引模板
    setup.template.name: "nginx-dev"
    setup.template.pattern: "nginx-dev-*"
    output.elasticsearch:
      # 链接elasticsearch,前文环境说明里可以看到改url
      hosts: '${ELASTICSEARCH_HOSTS:elasticsearch-master.elk:9200}'
      #自定义索引
      index: "nginx-dev-%{+yyyy.MM.dd}"
      index: "filebeat-%{[agent.version]}-%{+yyyy.MM.dd}
  • 配置文件模板

进入filebeat容器,可以看到filebeat.reference.yml文件,该文件记录了目前可用的所有配置项。
image.png

3. 结果查看

  • web查看

如上图,可见自定义索引已经可以看到了

image.png

  • 查看收集到的日志
    创建一个index,然后随便往日志目录下写了写东西,可以看到日志收集到了
    image.png
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐