在 Kubernetes 上运行 Metricbeat

编辑

您可以使用 Metricbeat 的 Docker 镜像 在 Kubernetes 上检索集群指标。

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

Kubernetes 部署清单

编辑

您将 Metricbeat 部署为 DaemonSet,以确保在集群的每个节点上都有一个正在运行的实例。这些实例用于从主机检索大多数指标,例如系统指标、Docker 统计信息以及在 Kubernetes 之上运行的所有服务的指标。

此外,DaemonSet 中的一个 Pod 将持续持有 *leader lock*,使其负责处理集群范围的监控。此实例用于检索对整个集群唯一的指标,例如 Kubernetes 事件或 kube-state-metrics。您可以在 自动发现 中找到有关领导者选举配置选项的更多信息。

注意:如果您正在从旧版本升级,请确保没有旧清单遗留下来的冗余部分。部署规范及其 ConfigMap 可能是这种情况。

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

要下载清单文件,请运行

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

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

设置

编辑

默认情况下,如果存在,Metricbeat 会将事件发送到现有的 Elasticsearch 部署。要指定不同的目标,请更改清单文件中的以下参数

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

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

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

如果您使用的是 Red Hat OpenShift,则需要在清单文件中指定其他设置,并授予 metricbeat 服务帐户对特权 SCC 的访问权限

  1. 在清单文件中,编辑 metricbeat-daemonset-modules ConfigMap,并在 data 部分的 kubernetes.yml 下指定以下设置

      kubernetes.yml: |-
        - module: kubernetes
          metricsets:
            - node
            - system
            - pod
            - container
            - volume
          period: 10s
          host: ${NODE_NAME}
          hosts: ["https://${NODE_NAME}:10250"]
          bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
          ssl.certificate_authorities:
            - /path/to/kubelet-service-ca.crt
        - module: kubernetes
          metricsets:
            - proxy
          period: 10s
          host: ${NODE_NAME}
          hosts: ["localhost:29101"]

    kubelet-service-ca.crt 可以是包含 Kubelet API 中使用的证书颁发者的任何 CA 捆绑包。根据 OpenShift 的具体安装情况,这可以在 secretsconfigmaps 中找到。在某些安装中,它可以作为服务帐户密钥的一部分提供,位于 /var/run/secrets/kubernetes.io/serviceaccount/service-ca.crt。如果使用 Openshift 安装程序 用于 GCP,则可以将以下 configmap 挂载到 Metricbeat Pod 中,并在 ssl.certificate_authorities 中使用 ca-bundle.crt

    Name:         kubelet-serving-ca
    Namespace:    openshift-kube-apiserver
    Labels:       <none>
    Annotations:  <none>
    
    Data
    ====
    ca-bundle.crt:
  2. 如果使用 https 访问 kube-state-metrics,请将以下设置添加到 metricbeat-daemonset-config ConfigMap 中,用于 state_* metricsets 的 Kubernetes 自动发现配置下

      bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
      ssl.certificate_authorities:
        - /var/run/secrets/kubernetes.io/serviceaccount/service-ca.crt
  3. 授予 metricbeat 服务帐户对特权 SCC 的访问权限

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

    此命令使容器能够作为 OpenShift 的管理员获得特权。

  4. 如果 elastic-agent 运行的命名空间设置了 "openshift.io/node-selector" 注解,则 elastic-agent 可能无法在所有节点上运行。在这种情况下,请考虑覆盖命名空间的节点选择器以允许在任何节点上调度

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

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

对于 4.x 版本之前的 OpenShift 版本,您还需要修改清单文件中的 DaemonSet 容器规范以启用容器作为特权运行

  securityContext:
    runAsUser: 0
    privileged: true

加载 Kibana 仪表盘

编辑

Metricbeat 附带各种预构建的 Kibana 仪表盘,您可以使用这些仪表盘来可视化有关 Kubernetes 环境的指标。

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

如果您使用的是 Elasticsearch 以外的其他输出,例如 Logstash,则需要 手动加载索引模板加载 Kibana 仪表盘

部署

编辑

Metricbeat 从 kube-state-metrics 获取一些指标。如果 kube-state-metrics 尚未运行,请立即部署它(请参阅 Kubernetes 部署 文档)。

要将 Metricbeat 部署到 Kubernetes,请运行

kubectl create -f metricbeat-kubernetes.yaml

要检查状态,请运行

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

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

指标应开始流向 Elasticsearch。

在大型集群中部署 Metricbeat 以收集集群级指标

编辑

Kubernetes 集群的大小和节点数量有时可能相当大,在这种情况下,收集集群级指标的 Pod 可能会由于资源限制而面临性能问题。在这种情况下,用户可以考虑避免使用领导者选举策略,而是除了 DaemonSet 之外,还使用 Deployment 运行一个专用的、独立的 Metricbeat 实例。