Kubernetes 模块编辑

作为 Kubernetes 监控提供的关键组件之一,该模块能够从多个组件获取指标

其中一些组件运行在每个 Kubernetes 节点上(例如 kubeletproxy),而其他组件则提供单个集群范围的端点。这对于确定模块中包含的不同指标集的最佳配置和运行策略至关重要。

有关如何在 Kubernetes 上配置和运行此模块作为 DaemonSetDeployment 的一部分的完整参考,请参见 在 Kubernetes 上运行 Metricbeat 文档中的完整示例清单。

Kubernetes 端点和指标集编辑

Kubernetes 模块有点复杂,因为它的内部指标集需要访问各种各样的端点。

本节重点介绍了具有类似端点访问需求的指标集组。有关指标集的更多详细信息,请参见下面的 配置示例指标集 部分。

容器/节点/Pod/系统/卷编辑

默认指标集 containernodepodsystemvolume 需要访问每个 Kubernetes 节点的 kubelet 端点,因此建议将它们作为 Metricbeat DaemonSet 或在主机上运行的独立 Metricbeat 的一部分包含在内。

根据 Kubernetes 节点的版本和配置,kubelet 可能会提供一个只读 http 端口(通常为 10255),这在某些配置示例中使用。但总的来说,最近,此端点需要 SSL (https) 访问(默认情况下为端口 10250)和基于令牌的身份验证。

state_* 和事件编辑

所有以 state_ 为前缀的指标集都需要 hosts 字段指向集群内的 kube-state-metrics 服务。由于该服务提供集群范围的指标,因此无需在每个节点上获取它们,因此建议将这些指标集作为只有一个副本的 Metricbeat Deployment 的一部分运行。

注意:Kube-state-metrics 在 Kubernetes 中默认情况下不会部署。对于这些情况,其部署说明可在 此处 获得。通常,kube-state-metrics 运行一个 Deployment,可以通过 kube-system 命名空间中的名为 kube-state-metrics 的服务访问,该服务将是我们配置中要使用的服务。

apiserver编辑

apiserver 指标集需要访问 Kubernetes API,该 API 应该在所有 Kubernetes 环境中轻松可用。根据 Kubernetes 配置,API 访问可能需要 SSL (https) 和基于令牌的身份验证。

为了访问 API 服务的 /metrics 路径,某些 Kubernetes 环境可能需要将以下权限添加到 ClusterRole 中。

rules:
- nonResourceURLs:
  - /metrics
  verbs:
  - get

proxy编辑

proxy 指标集需要访问每个 Kubernetes 节点的代理端点,因此建议将其配置为 Metricbeat DaemonSet 的一部分。

调度程序和控制器管理器编辑

这些指标集需要访问 Kubernetes 的 controller-managerscheduler 端点。默认情况下,这些 Pod 仅运行在主节点上,并且不会通过服务公开,但有不同的策略可用于配置它们

  • 创建 Kubernetes 服务 以使 kube-controller-managerkube-scheduler 可用,并将指标集配置为指向这些服务,作为 Metricbeat Deployment 的一部分。
  • 使用 自动发现 功能作为 Metricbeat DaemonSet 的一部分,并将指标集包含在应用于特定 Pod 的条件模板中。

注意:在某些“作为服务”的 Kubernetes 实现中,例如 GKE,主节点甚至在主节点上运行的 Pod 将不可见。在这种情况下,将无法使用 schedulercontrollermanager 指标集。

Kubernetes RBAC编辑

Metricbeat 需要某些集群级特权才能获取指标。以下示例创建了一个名为 metricbeatServiceAcount,它具有运行模块中所有指标集所需的必要权限。为此目的创建了 ClusterRoleClusterRoleBinding

apiVersion: v1
kind: ServiceAccount
metadata:
  name: metricbeat
  namespace: kube-system
  labels:
    k8s-app: metricbeat
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: metricbeat
  labels:
    k8s-app: metricbeat
rules:
- apiGroups: [""]
  resources:
  - nodes
  - namespaces
  - events
  - pods
  verbs: ["get", "list", "watch"]
- apiGroups: ["batch"]
  resources:
  - jobs
  verbs: ["get", "list", "watch"]
- apiGroups: ["extensions"]
  resources:
  - replicasets
  verbs: ["get", "list", "watch"]
- apiGroups: ["apps"]
  resources:
  - statefulsets
  - deployments
  - replicasets
  verbs: ["get", "list", "watch"]
- apiGroups:
  - ""
  resources:
  - nodes/stats
  verbs:
  - get
- nonResourceURLs:
  - /metrics
  verbs:
  - get
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: metricbeat
subjects:
- kind: ServiceAccount
  name: metricbeat
  namespace: kube-system
roleRef:
  kind: ClusterRole
  name: metricbeat
  apiGroup: rbac.authorization.k8s.io

兼容性编辑

Kubernetes 模块已在以下版本的 Kubernetes 上进行了测试:1.26.x、1.27.x、1.28.x 和 1.29.x。

仪表盘编辑

Kubernetes 模块包含针对 集群概述apiservercontrollermanagerschedulerproxy 的默认仪表盘。

如果使用 HA 来运行这些组件,请注意,当从所有实例收集数据时,仪表盘通常会显示指标的平均值。对于这些场景,可以按主机或服务地址进行筛选。

针对 controllermanager schedulerproxy 的仪表盘与低于 7.2.0 版本的 Kibana 不兼容

集群概述 仪表盘中的集群选择器有助于区分和筛选从多个集群收集的指标。如果您想专注于 Kubernetes 集群的子集以监控特定场景,此集群选择器可能是一个方便的工具。请注意,此选择器会从 orchestrator.cluster.name 字段填充,该字段可能并不总是可用。此字段的值来自 kube_configkubeadm-config configMap 和 Google Cloud 的元 API(对于 GKE)等来源。如果上述来源未提供此值,metricbeat 不会报告它。但是,您可以始终使用 add_fields 处理器 来设置 orchestrator.cluster.name 字段并在 集群概述 仪表盘中使用它

processors:
  - add_fields:
      target: orchestrator.cluster
      fields:
        name: clusterName
        url: clusterURL

Kubernetes 集群概述示例

metricbeat kubernetes clusteroverview

如果将收集周期设置为大于 2m 的值,则需要增加“所需 Pod”、“可用 Pod”和“不可用 Pod”可视化效果的“间隔”(在面板选项中)。

Kubernetes 控制器管理器示例

metricbeat kubernetes controllermanager

Kubernetes 调度程序示例

metricbeat kubernetes scheduler

Kubernetes 代理示例

metricbeat kubernetes proxy

配置示例

Kubernetes 模块支持 模块 中描述的标准配置选项。以下是一个配置示例

metricbeat.modules:
# Node metrics, from kubelet:
- module: kubernetes
  metricsets:
    - container
    - node
    - pod
    - system
    - volume
  period: 10s
  enabled: true
  hosts: ["https://${NODE_NAME}:10250"]
  bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
  ssl.verification_mode: "none"
  #ssl.certificate_authorities:
  #  - /var/run/secrets/kubernetes.io/serviceaccount/service-ca.crt
  #ssl.certificate: "/etc/pki/client/cert.pem"
  #ssl.key: "/etc/pki/client/cert.key"

  # Enriching parameters:
  add_metadata: true
  # If kube_config is not set, KUBECONFIG environment variable will be checked
  # and if not present it will fall back to InCluster
  #kube_config: ~/.kube/config
  #include_labels: []
  #exclude_labels: []
  #include_annotations: []
  #labels.dedot: true
  #annotations.dedot: true

  # When used outside the cluster:
  #node: node_name

  # To configure additionally node and namespace metadata `add_resource_metadata` can be defined.
  # By default all labels will be included while annotations are not added by default.
  # add_resource_metadata:
  #   namespace:
  #     include_labels: ["namespacelabel1"]
  #   node:
  #     include_labels: ["nodelabel2"]
  #     include_annotations: ["nodeannotation1"]
  #   deployment: false
  #   cronjob: false
  # Kubernetes client QPS and burst can be configured additionally
  #kube_client_options:
  #  qps: 5
  #  burst: 10

# State metrics from kube-state-metrics service:
- module: kubernetes
  enabled: true
  metricsets:
    - state_node
    - state_daemonset
    - state_deployment
    - state_replicaset
    - state_statefulset
    - state_pod
    - state_container
    - state_job
    - state_cronjob
    - state_resourcequota
    - state_service
    - state_persistentvolume
    - state_persistentvolumeclaim
    - state_storageclass
    # Uncomment this to get k8s events:
    #- event  period: 10s
  hosts: ["kube-state-metrics:8080"]

  # Enriching parameters:
  add_metadata: true
  # If kube_config is not set, KUBECONFIG environment variable will be checked
  # and if not present it will fall back to InCluster
  #kube_config: ~/.kube/config
  #include_labels: []
  #exclude_labels: []
  #include_annotations: []
  #labels.dedot: true
  #annotations.dedot: true

  # When used outside the cluster:
  #node: node_name

  # Set the namespace to watch for resources
  #namespace: staging

  # To configure additionally node and namespace metadata `add_resource_metadata` can be defined.
  # By default all labels will be included while annotations are not added by default.
  # add_resource_metadata:
  #   namespace:
  #     include_labels: ["namespacelabel1"]
  #   node:
  #     include_labels: ["nodelabel2"]
  #     include_annotations: ["nodeannotation1"]
  #   deployment: false
  #   cronjob: false
  # Kubernetes client QPS and burst can be configured additionally
  #kube_client_options:
  #  qps: 5
  #  burst: 10

# Kubernetes Events
- module: kubernetes
  enabled: true
  metricsets:
    - event
  period: 10s
  # Skip events older than Metricbeat's statup time is enabled by default.
  # Setting to false the skip_older setting will stop filtering older events.
  # This setting is also useful went Event's timestamps are not populated properly.
  #skip_older: false
  # If kube_config is not set, KUBECONFIG environment variable will be checked
  # and if not present it will fall back to InCluster
  #kube_config: ~/.kube/config
  # Set the namespace to watch for events
  #namespace: staging
  # Set the sync period of the watchers
  #sync_period: 10m
  # Kubernetes client QPS and burst can be configured additionally
  #kube_client_options:
  #  qps: 5
  #  burst: 10

# Kubernetes API server
# (when running metricbeat as a deployment)
- module: kubernetes
  enabled: true
  metricsets:
    - apiserver
  hosts: ["https://${KUBERNETES_SERVICE_HOST}:${KUBERNETES_SERVICE_PORT}"]
  bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
  ssl.certificate_authorities:
    - /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
  period: 30s

# Kubernetes proxy server
# (when running metricbeat locally at hosts or as a daemonset + host network)
- module: kubernetes
  enabled: true
  metricsets:
    - proxy
  hosts: ["localhost:10249"]
  period: 10s

# Kubernetes controller manager
# (URL and deployment method should be adapted to match the controller manager deployment / service / endpoint)
- module: kubernetes
  enabled: true
  metricsets:
    - controllermanager
  hosts: ["https://127.0.0.1:10252"]
  period: 10s

# Kubernetes scheduler
# (URL and deployment method should be adapted to match scheduler deployment / service / endpoint)
- module: kubernetes
  enabled: true
  metricsets:
    - scheduler
  hosts: ["localhost:10251"]
  period: 10s

此模块支持在使用 ssl 配置字段时使用 TLS 连接,如 SSL 中所述。它还支持 标准 HTTP 配置选项 中描述的选项。

指标集

提供以下指标集