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_* 和 event

编辑

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

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

apiserver

编辑

apiserver 度量集需要访问 Kubernetes API,这应该在所有 Kubernetes 环境中都很容易获得。根据 Kubernetes 配置,API 访问可能需要 SSL (https) 和基于令牌的身份验证。

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

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

proxy

编辑

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

scheduler 和 controllermanager

编辑

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

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

注意:在某些“服务即服务” Kubernetes 实现(如 GKE)中,主节点甚至在主节点上运行的 Pod 都不可见。在这些情况下,将无法使用 schedulercontrollermanager 度量集。

Kubernetes RBAC

编辑

Metricbeat 需要一定的集群级别权限才能获取指标。以下示例创建了一个名为 metricbeatServiceAcount,它具有运行模块中所有度量集所需的权限。为此目的创建了一个 ClusterRole 和一个 ClusterRoleBinding

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.28.x、1.29.x、1.30.x 和 1.31.x

仪表盘

编辑

Kubernetes 模块附带 集群概述apiservercontrollermanagerschedulerproxy 的默认仪表盘。

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

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

集群概述 仪表盘中的集群选择器有助于区分和过滤从多个集群收集的指标。如果您想关注 Kubernetes 集群的子集以监控特定场景,则此集群选择器可能是一个方便的工具。请注意,此选择器是从 orchestrator.cluster.name 字段填充的,该字段可能并不总是可用。此字段的值来自 kube_configkubeadm-config ConfigMap 和 GKE 的 Google Cloud 元 API 等来源。如果上述来源未提供此值,则 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 controller manager 示例

metricbeat kubernetes controllermanager

Kubernetes scheduler 示例

metricbeat kubernetes scheduler

Kubernetes proxy 示例

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
  #By default requests to kubeadm config map are made in order to enrich cluster name by requesting /api/v1/namespaces/kube-system/configmaps/kubeadm-config API endpoint.
  use_kubeadm: true
  #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
  #By default requests to kubeadm config map are made in order to enrich cluster name by requesting /api/v1/namespaces/kube-system/configmaps/kubeadm-config API endpoint.
  use_kubeadm: true
  #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
  #By default requests to kubeadm config map are made in order to enrich cluster name by requesting /api/v1/namespaces/kube-system/configmaps/kubeadm-config API endpoint.
  use_kubeadm: true
  # 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
  #By default requests to kubeadm config map are made in order to enrich cluster name by requesting /api/v1/namespaces/kube-system/configmaps/kubeadm-config API endpoint.
  use_kubeadm: true

# 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
  #By default requests to kubeadm config map are made in order to enrich cluster name by requesting /api/v1/namespaces/kube-system/configmaps/kubeadm-config API endpoint.
  use_kubeadm: true

# 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
  #By default requests to kubeadm config map are made in order to enrich cluster name by requesting /api/v1/namespaces/kube-system/configmaps/kubeadm-config API endpoint.
  use_kubeadm: true

# 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
  #By default requests to kubeadm config map are made in order to enrich cluster name by requesting /api/v1/namespaces/kube-system/configmaps/kubeadm-config API endpoint.
  use_kubeadm: true

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

度量集

提供以下度量集: