使用filebeat采集TKE容器日志

使用filebeat采集TKE容器日志

背景

当业务使用腾讯云容器服务TKE进行部署时,可以通过filebeat来采集TKE中各个pod的日志,写入到下游的Elasticsearch集群中,然后在kibana上进行日志的查询与分析。本文介绍如何使用filebeat daemonset的方式采集容器中的日志。

实战过程

下面以采用运行containerd的TKE容器集群,以采集nginx日志为例,介绍使用filebeat采集nginx pod上的日志并写入到es。

部署nginx daemonset

首先使用了一个Docker Hub中的nginx镜像,部署了一个名为nginx的daemonset:


image

部署filebeat daemonset

1.创建ConfigMap

filebeat以filebeat.yml文件为主配置文件,首先创建一个filebeat.yml配置的ConfigMap,


image

新建的ConfigMap中的变量名为filebeat.yml, 内容为具体的配置信息,以下是一个最简单的filebeat.yml配置

filebeat.inputs:
- type: log 
  symlinks: true
  paths:
    - /var/log/containers/*.log

output.elasticsearch:
  hosts: ['x.x.x.x:9200']
  username: "elastic"
  password: "x.x.x.x"

2.使用公有镜像库中的filebeat镜像,部署filebeat daemonset:


image

3.配置数据卷

image

4.配置运行参数


image

5.配置挂载点

image

数据卷和挂载点说明:

(1)使用ConfigMap数据卷,使得filebeat pod可以读取到自定义的filebeat.yml配置

(2) 使用主机路径/var/log/containers, 使得filebeat pod可以读取到其它pod的日志,因为其它pod的日志都会打印在宿主机的/var/log/containers路径下

(3)因为主机路径/var/log/containers下的pod日志,都是使用软链接,链接到/var/log/pods目录下的各个pod的日志文件,因为也需要把主机路径/var/log/containers挂载到filebeat pod上,这也是为什么在filebeat.yml中要定义symlinks: true的原因,因为默认情况下,filebeat不对读取链接文件

6.在kibana中查看日志

进入到filebeat.yml中定义的es集群对应的kibana中,查看对应索引是否生成,是否可以正常查看nginx日志:


image

通过以上步骤,可以看到,nginx的日志可以正常被采集到。但是上述配置采集的是宿主机上所有pod的日志,有时需要只采集固定的某几个pod的日志,该怎么实现呢?

通过YML配置部署一个可以获取到Pod元信息的filebeat demonset

在实际的业务场景中,通常需要通过filebeat采集部署在相同host上的多个pod的日志,往往也需要获取到采集到的pod的元信息,比如命令空间、pod名称、标签等信息,以方便进行过滤或者检索。获取到pod的元信息需要调用k8s的API, filebeat内部也实现了这个功能,因此可以直接使用filebeat的container input以及add_kubernetes_metadata processors来实现。

在TKE控制台上,点击”YML创建资源“按钮,直接使用如下yml配置创建filebeat demonset:

---
apiVersion: v1
kind: ConfigMap
metadata:
  name: filebeat-config
  namespace: default
  labels:
    k8s-app: filebeat
data:
  filebeat.yml: |-
    filebeat.inputs:
    - type: container
      paths:
        - /var/log/containers/*.log
      processors:
        - add_kubernetes_metadata:
            host: ${NODE_NAME}
            matchers:
            - logs_path:
                logs_path: "/var/log/containers/"
   
    processors:
      - add_cloud_metadata:
      - add_host_metadata:
    output.elasticsearch:
      hosts: ['${ELASTICSEARCH_HOST:elasticsearch}:${ELASTICSEARCH_PORT:9200}']
      username: ${ELASTICSEARCH_USERNAME}
      password: ${ELASTICSEARCH_PASSWORD}
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: filebeat
  namespace: default
  labels:
    k8s-app: filebeat
spec:
  selector:
    matchLabels:
      k8s-app: filebeat
  template:
    metadata:
      labels:
        k8s-app: filebeat
    spec:
      serviceAccountName: filebeat
      terminationGracePeriodSeconds: 30
      containers:
      - name: filebeat
        image: ccr.ccs.tencentyun.com/tke-market/filebeat:7.10.1
        args: [
          "-c", "/etc/filebeat.yml",
          "-e",
        ]
        env:
        - name: ELASTICSEARCH_HOST
          value: x.x.x.x
        - name: ELASTICSEARCH_PORT
          value: "9200"
        - name: ELASTICSEARCH_USERNAME
          value: elastic
        - name: ELASTICSEARCH_PASSWORD
          value: Elastic123
        - name: NODE_NAME
          valueFrom:
            fieldRef:
              fieldPath: spec.nodeName
        securityContext:
          runAsUser: 0
          # If using Red Hat OpenShift uncomment this:
          #privileged: true
        resources:
          limits:
            memory: 200Mi
          requests:
            cpu: 100m
            memory: 100Mi
        volumeMounts:
        - name: config
          mountPath: /etc/filebeat.yml
          readOnly: true
          subPath: filebeat.yml
        - name: varlibdockercontainers
          mountPath: /var/lib/docker/containers
          readOnly: true
        - name: varlog
          mountPath: /var/log
          readOnly: true
        - name: varpods
          mountPath: /var/log/pods
          readOnly: true
      volumes:
      - name: config
        configMap:
          defaultMode: 0640
          name: filebeat-config
      - name: varlibdockercontainers
        hostPath:
          path: /var/lib/docker/containers
      - name: varlog
        hostPath:
          path: /var/log
      - name: varpods
        hostPath:
          path: /var/log/pods
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: filebeat
subjects:
- kind: ServiceAccount
  name: filebeat
  namespace: default
roleRef:
  kind: ClusterRole
  name: filebeat
  apiGroup: rbac.authorization.k8s.io
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: filebeat
  namespace: default
subjects:
  - kind: ServiceAccount
    name: filebeat
    namespace: default
roleRef:
  kind: Role
  name: filebeat
  apiGroup: rbac.authorization.k8s.io
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: filebeat-kubeadm-config
  namespace: default
subjects:
  - kind: ServiceAccount
    name: filebeat
    namespace: default
roleRef:
  kind: Role
  name: filebeat-kubeadm-config
  apiGroup: rbac.authorization.k8s.io
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: filebeat
  labels:
    k8s-app: filebeat
rules:
- apiGroups: [""] # "" indicates the core API group
  resources:
  - namespaces
  - pods
  - nodes
  verbs:
  - get
  - watch
  - list
- apiGroups: ["apps"]
  resources:
    - replicasets
  verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: filebeat
  # should be the namespace where filebeat is running
  namespace: default
  labels:
    k8s-app: filebeat
rules:
  - apiGroups:
      - coordination.k8s.io
    resources:
      - leases
    verbs: ["get", "create", "update"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: filebeat-kubeadm-config
  namespace: default
  labels:
    k8s-app: filebeat
rules:
  - apiGroups: [""]
    resources:
      - configmaps
    resourceNames:
      - kubeadm-config
    verbs: ["get"]
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: filebeat
  namespace: default
  labels:
    k8s-app: filebeat
---

配置说明:

  1. 命令空间为default,根据需要也可以直接替换
  2. 创建了名为filebeat的服务账号,并且授予获取pods列表、获取pod详情等接口的权限,filebeat会使用该账号获取到pods的元信息
  3. 通过container input采集/var/log/containers/目录下的日志, container input可采集容器的stdout和stderr。

在kibana中查看日志, 可以看到每条日志中都包含有kubernetes字段:


image

上述配置通过container input直接采集到了filebeat pod所在的node上的所有pod的日志,当然,也包括了filebeat自身的日志,在真实的业务场景中,往往只需要采集业务关心的pod的日志即可,此时一种方式是通过在filebeat.yml中定义processor, 对采集到的所有日志event进行过滤,过滤掉不关心的日志event即可(比如通过drop event processor过滤掉某些不关心的namespace和pod的日志);另外一种解决办法是通过Autodiscover定义新的filebeat.yml配置文件,通过定义模板只采集固定pod的日志,下面是一个简单的Autodiscover配置,该配置只采集容器名称为nginx的pod的日志:

filebeat.autodiscover:
      providers:
        - type: kubernetes
          templates:
            - condition:
                equals:
                  kubernetes.container.name: nginx
              config:
                 - type: container
                   paths:
                    - /var/log/containers/${data.kubernetes.pod.name}_*.log
                     
processors:
      - add_cloud_metadata:
      - add_host_metadata:
output.elasticsearch:
      hosts: ['${ELASTICSEARCH_HOST:elasticsearch}:${ELASTICSEARCH_PORT:9200}']
      username: ${ELASTICSEARCH_USERNAME}
      password: ${ELASTICSEARCH_PASSWORD}


通过修改名为filebeat-config的ConfigMap, 并重新部署pod,使得新配置生效,在kibana中查看日志,可以看到只有nginx pod的日志被采集到了:


image
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容