Kubernetes 模块
编辑Kubernetes 模块
编辑作为 Kubernetes 监控的主要组成部分之一,此模块能够从多个组件获取指标
一些之前的组件运行在每个 Kubernetes 节点上(例如 kubelet
或 proxy
),而其他组件则提供单个集群范围的端点。这对于确定模块中包含的不同度量集的最佳配置和运行策略非常重要。
有关如何在 Kubernetes 上将此模块配置为 DaemonSet
和 Deployment
的一部分以及如何运行它的完整参考,请参阅 在 Kubernetes 上运行 Metricbeat 文档中提供的完整示例清单。
Kubernetes 端点和度量集
编辑Kubernetes 模块有点复杂,因为它的内部度量集需要访问各种各样的端点。
本节重点介绍一些具有相似端点访问需求的度量集组。有关度量集的更多详细信息,请参见下面的 配置示例
和 度量集
部分。
容器/节点/Pod/系统/卷
编辑默认度量集 container
、node
、pod
、system
和 volume
需要访问每个 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-manager
和 scheduler
端点。默认情况下,这些 Pod 只在主节点上运行,并且它们没有通过服务公开,但有不同的策略可用于其配置。
- 创建
Kubernetes 服务
以使kube-controller-manager
和kube-scheduler
可用,并将度量集配置为指向这些服务,作为 MetricbeatDeployment
的一部分。 - 使用
自动发现
功能作为 Metricbeat DaemonSet 的一部分,并将度量集包含在应用于特定 Pod 的条件模板中。
注意:在某些“服务即服务” Kubernetes 实现(如 GKE
)中,主节点甚至在主节点上运行的 Pod 都不可见。在这些情况下,将无法使用 scheduler
和 controllermanager
度量集。
Kubernetes RBAC
编辑Metricbeat 需要一定的集群级别权限才能获取指标。以下示例创建了一个名为 metricbeat
的 ServiceAcount
,它具有运行模块中所有度量集所需的权限。为此目的创建了一个 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 模块附带 集群概述
、apiserver
、controllermanager
、scheduler
和 proxy
的默认仪表盘。
如果您正在为这些组件使用 HA,请注意,当从所有实例收集数据时,仪表盘通常会显示指标的平均值。对于这些场景,可以通过主机或服务地址进行筛选。
controllermanager
scheduler
和 proxy
的仪表盘与低于 7.2.0
版本的 Kibana 不兼容。
集群概述
仪表盘中的集群选择器有助于区分和过滤从多个集群收集的指标。如果您想关注 Kubernetes 集群的子集以监控特定场景,则此集群选择器可能是一个方便的工具。请注意,此选择器是从 orchestrator.cluster.name
字段填充的,该字段可能并不总是可用。此字段的值来自 kube_config
、kubeadm-config
ConfigMap 和 GKE 的 Google Cloud 元 API 等来源。如果上述来源未提供此值,则 Metricbeat 不会报告它。但是,您可以始终使用 add_fields 处理器 设置 orchestrator.cluster.name
字段并在 集群概述
仪表盘中使用它。
processors: - add_fields: target: orchestrator.cluster fields: name: clusterName url: clusterURL
Kubernetes 集群概述示例
如果将收集周期设置为大于 2m
的值,则需要增加“所需 Pod”、“可用 Pod”和“不可用 Pod”可视化的间隔(在面板选项中)。
Kubernetes controller manager 示例
Kubernetes scheduler 示例
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 配置选项 中描述的选项。
提供以下度量集: