在 Kubernetes 上运行 Filebeat

编辑

在 Kubernetes 上运行 Filebeat编辑

您可以在 Kubernetes 上使用 Filebeat Docker 镜像 来检索和发送容器日志。

在 Kubernetes 上运行 Elastic Cloud?请参阅 在 ECK 上运行 Beats

Kubernetes 部署清单编辑

您可以将 Filebeat 部署为 DaemonSet,以确保在集群的每个节点上都有一个正在运行的实例。

容器日志主机文件夹 (/var/log/containers) 被挂载到 Filebeat 容器上。Filebeat 会为这些文件启动一个输入,并在它们出现在文件夹中后立即开始收集它们。

默认情况下,所有内容都部署在 kube-system 命名空间下。要更改命名空间,请修改清单文件。

要下载清单文件,请运行

curl -L -O https://raw.githubusercontent.com/elastic/beats/8.14/deploy/kubernetes/filebeat-kubernetes.yaml

如果您使用的是 Kubernetes 1.7 或更早版本: Filebeat 使用 hostPath 卷来持久化内部数据。它位于 /var/lib/filebeat-data 下。清单使用 Kubernetes 1.8 中引入的文件夹自动创建功能 (DirectoryOrCreate)。您需要从清单中删除 type: DirectoryOrCreate,并自己创建主机文件夹。

设置编辑

默认情况下,如果存在 Elasticsearch 部署,Filebeat 会将事件发送到该部署。要指定其他目标,请在清单文件中更改以下参数

- name: ELASTICSEARCH_HOST
  value: elasticsearch
- name: ELASTICSEARCH_PORT
  value: "9200"
- name: ELASTICSEARCH_USERNAME
  value: elastic
- name: ELASTICSEARCH_PASSWORD
  value: changeme
在控制平面节点上运行 Filebeat编辑

Kubernetes 控制平面节点可以使用 污点 来限制可以在其上运行的工作负载。要在控制平面节点上运行 Filebeat,您可能需要更新 Daemonset 规范以包含适当的容忍度

spec:
 tolerations:
 - key: node-role.kubernetes.io/control-plane
   effect: NoSchedule
Red Hat OpenShift 配置编辑

如果您使用的是 Red Hat OpenShift,则需要在清单文件中指定其他设置,并启用容器以特权模式运行。Filebeat 需要作为特权容器运行,才能挂载写入节点的日志 (hostPath) 并读取它们。

  1. 修改清单文件中的 DaemonSet 容器规范

      securityContext:
        runAsUser: 0
        privileged: true
  2. 授予 filebeat 服务帐户对特权 SCC 的访问权限

    oc adm policy add-scc-to-user privileged system:serviceaccount:kube-system:filebeat

    此命令允许容器作为 OpenShift 管理员以特权模式运行。

  3. 覆盖 kube-system 命名空间(或您的自定义命名空间)的默认节点选择器,以允许在任何节点上进行调度

    oc patch namespace kube-system -p \
    '{"metadata": {"annotations": {"openshift.io/node-selector": ""}}}'

    此命令将项目的节点选择器设置为空字符串。如果不运行此命令,则默认节点选择器将跳过控制平面节点。

为了支持使用 Openshift 的运行时环境(例如 CRI-O、containerd),您需要配置以下路径

filebeat.inputs:
- type: container
  paths: 
    - '/var/log/containers/*.log'

如果需要启用自动发现,则需要配置相同的路径

filebeat.autodiscover:
  providers:
    - type: kubernetes
      node: ${NODE_NAME}
      hints.enabled: true
      hints.default_config:
        type: container
        paths:
          - /var/log/containers/*.log

/var/log/containers/\*.log 通常是指向 /var/log/pods/*/*.log 的符号链接,因此可以相应地编辑上述路径

加载 Kibana 仪表板编辑

Filebeat 附带了各种预先构建的 Kibana 仪表板,您可以使用它们来可视化 Kubernetes 环境中的日志。

如果这些仪表板尚未加载到 Kibana 中,则必须在任何可以连接到 Elastic Stack 的系统上 安装 Filebeat,然后运行 setup 命令来加载仪表板。要了解如何操作,请参阅 加载 Kibana 仪表板

setup 命令不会加载用于解析日志行的摄取管道。默认情况下,在您第一次运行 Filebeat 并连接到 Elasticsearch 时,会自动设置摄取管道。

如果您使用的是 Elasticsearch 以外的其他输出,例如 Logstash,则需要

部署编辑

要将 Filebeat 部署到 Kubernetes,请运行

kubectl create -f filebeat-kubernetes.yaml

要检查状态,请运行

$ kubectl --namespace=kube-system get ds/filebeat

NAME       DESIRED   CURRENT   READY     UP-TO-DATE   AVAILABLE   NODE-SELECTOR   AGE
filebeat   32        32        0         32           0           <none>          1m

日志事件应开始流向 Elasticsearch。这些事件使用 add_kubernetes_metadata 处理器添加的元数据进行注释。

解析 JSON 日志编辑

在从 Kubernetes 上运行的工作负载收集日志时,这些应用程序通常以 JSON 格式记录日志。在这种情况下,可以应用特殊处理来正确解析这些 JSON 日志并将其解码为字段。下面提供了两种不同的方法来配置 Filebeat 的自动发现,以便识别和解析 JSON 日志。我们将使用一个包含 2 个容器的 Pod 示例,其中只有一个容器以 JSON 格式记录日志。

示例日志

{"type":"log","@timestamp":"2020-11-16T14:30:13+00:00","tags":["warning","plugins","licensing"],"pid":7,"message":"License information could not be obtained from Elasticsearch due to Error: No Living connections error"}
  1. json.* 选项与模板一起使用

    filebeat.autodiscover:
      providers:
          - type: kubernetes
            node: ${NODE_NAME}
            templates:
              - condition:
                  contains:
                    kubernetes.container.name: "no-json-logging"
                config:
                  - type: container
                    paths:
                      - "/var/log/containers/*-${data.kubernetes.container.id}.log"
              - condition:
                  contains:
                    kubernetes.container.name: "json-logging"
                config:
                  - type: container
                    paths:
                      - "/var/log/containers/*-${data.kubernetes.container.id}.log"
                    json.keys_under_root: true
                    json.add_error_key: true
                    json.message_key: message
  2. json.* 选项与提示一起使用

    这里的关键是要正确注释 Pod,以便仅将正确容器的日志解析为 JSON 日志。在这种情况下,注释的构造方式如下

    co.elastic.logs.<container_name>/json.keys_under_root: "true"

    自动发现配置

    filebeat.autodiscover:
      providers:
        - type: kubernetes
          node: ${NODE_NAME}
          hints.enabled: true
          hints.default_config:
            type: container
            paths:
              - /var/log/containers/*${data.kubernetes.container.id}.log

    然后正确注释 Pod

    annotations:
        co.elastic.logs.json-logging/json.keys_under_root: "true"
        co.elastic.logs.json-logging/json.add_error_key: "true"
        co.elastic.logs.json-logging/json.message_key: "message"

日志轮转编辑

根据 Kubernetes 文档,*Kubernetes 不负责轮转日志,而应该由部署工具设置解决方案来解决该问题*。不同的日志轮转策略可能会导致问题,从而导致 Filebeat 丢失事件甚至重复事件。用户可以在 Filebeat 的 日志轮转特定文档 中找到有关 Filebeat 日志轮转最佳实践的更多信息