在 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.17/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 的示例,其中包含 2 个容器,其中只有一个容器以 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 日志轮换最佳实践的更多信息。