在 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.16/deploy/kubernetes/filebeat-kubernetes.yaml
如果您使用的是 Kubernetes 1.7 或更早版本: Filebeat 使用 hostPath 卷来持久化内部数据。它位于 /var/lib/filebeat-data
下。清单使用文件夹自动创建 (DirectoryOrCreate
),该功能在 Kubernetes 1.8 中引入。您需要从清单中删除 type: DirectoryOrCreate
并自行创建主机文件夹。
设置
编辑默认情况下,如果存在,Filebeat 会将事件发送到现有的 Elasticsearch 部署。要指定其他目标,请更改清单文件中的以下参数
- 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)写入的日志并读取它们。
-
修改清单文件中的
DaemonSet
容器规范securityContext: runAsUser: 0 privileged: true
-
授予
filebeat
服务帐户对特权 SCC 的访问权限oc adm policy add-scc-to-user privileged system:serviceaccount:kube-system:filebeat
此命令使容器能够以 OpenShift 管理员的身份获得特权。
-
覆盖
kube-system
命名空间(或您的自定义命名空间)的默认节点选择器以允许在任何节点上调度oc patch namespace kube-system -p \ '{"metadata": {"annotations": {"openshift.io/node-selector": ""}}}'
此命令将项目的节点选择器设置为空字符串。如果您不运行此命令,则默认节点选择器将跳过控制平面节点。
为了支持具有 Openshift 的运行时环境(例如 CRI-O、containerd),您需要配置以下路径
如果需要启用自动发现,则需要配置相同的路径
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 日志的方法。我们将使用一个 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"}
-
使用带有模板的
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
-
使用带有提示的
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 的日志轮换最佳实践的更多信息