服务发现用于将 VKE 集群中的业务指标端点接入托管 Prometheus,实现自定义指标采集。本文介绍 VKE 集群支持的服务发现方式和配置步骤,并验证指标是否正常采集。
Prometheus 主要通过 Pull 的方式来抓取目标服务暴露的监控接口。因此,您需要在集群中配置对应的服务发现规则,指定采集对象,才能完成数据采集,并写入到托管 Prometheus 服务的工作区中。
容器服务集群中支持使用如下 CRD 资源,自定义指标采集配置。不同资源的概念和适用场景,如下表所示。
通过 ServiceMonitor 实现服务发现
ServiceMonitor 通过匹配 Service 来发现后端 Pod,适用于应用已通过 Service 暴露指标端口的场景。配置后,系统会按 ServiceMonitor 中的端口、路径和标签规则抓取目标指标。操作步骤如下:
- 在左侧菜单栏中选择 集群,并在右侧集群列表中选择目标集群。
- 在左侧菜单栏中选择 工作负载 > 对象浏览器,单击 使用 Yaml 创建 ,通过 ServiceMonitor 配置服务发现。
apiVersion: monitoring.coreos.com/v1
namespace: volcano-metrics
- targetLabel: environment
app.kubernetes.io/name: ek8s-gpu-exporter
在容器服务中创建 CRD 后,可以遵循以下步骤,查看、编辑或删除配置。
- 在左侧菜单栏中选择 集群,并在右侧集群列表中选择目标集群。
- 在左侧菜单栏中选择 工作负载 > 对象浏览器,在 分类 下拉菜单中选择 CRD,即可查看创建的 CRD 资源。
-
- 单击 ServiceMonitor,进入详情页。
- 选择需要编辑或删除的配置项,单击 操作 栏的...,选择 编辑 Yaml 或 删除,即可编辑或删除该配置。
-
PodMonitor 直接通过 Pod 标签发现采集目标,适用于目标 Pod 没有通过 Service 暴露,或希望绕过 Service 直接采集 Pod 指标的场景。配置后,系统会按 PodMonitor 中的端口、路径和标签规则抓取目标指标。操作步骤如下:
- 在左侧菜单栏中选择 集群,并在右侧集群列表中选择目标集群。
- 在左侧菜单栏中选择 工作负载 > 对象浏览器,单击 使用 Yaml 创建 ,通过 PodMonitor 配置服务发现。
apiVersion: monitoring.coreos.com/v1
namespace: volcano-metrics
replacement: 'kafka-xxxxxx'
app-name: kafka-exporter
在容器服务中创建 CRD 后,可以遵循以下步骤,查看、编辑或删除配置。
- 在左侧菜单栏中选择 集群,并在右侧集群列表中选择目标集群。
- 在左侧菜单栏中选择 工作负载 > 对象浏览器,在 分类 下拉菜单中选择 CRD,即可查看创建的 CRD 资源。
-
- 选择需要编辑或删除的配置项,单击 操作 栏的...,选择 编辑 Yaml 或 删除,即可编辑或删除该配置。
-
您可以通过 VMNodeScrape 配置节点级别的指标发现。本文以配置 kubelet 指标为例,操作步骤如下:
注意
- 配置 kubelet 的指标时,建议保留节点发现和 TLS 相关配置,然后在metricRelabelConfigs中补充需要新增采集的指标名,例如kubelet_evictions。
- 请合理选择自定义采集规则中的采集范围和指标,如果您自定义采集规则中的配置与集群默认采集规则存在重叠,将会导致指标被重复抓取,进而重复计费。
- 在左侧菜单栏中选择 集群,并在右侧集群列表中选择目标集群。
- 在左侧菜单栏中选择 工作负载 > 对象浏览器,单击 使用 Yaml 创建 ,通过 VMNodeScrape 配置服务发现。
apiVersion: operator.victoriametrics.com/v1beta1
bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token
- key: node.kubernetes.io/instance-type
caFile: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
insecureSkipVerify: true
- replacement: kubelet-custom
- __meta_kubernetes_node_name
- regex: volcengine://(.+)
- __meta_kubernetes_node_provider_id
regex: kubelet_running_pods|kubelet_node_name|kubelet_evictions
在容器服务中创建自定义配置后,可以遵循以下步骤,查看、编辑或删除配置。
- 在左侧菜单栏中选择 集群,并在右侧集群列表中选择目标集群。
- 在左侧菜单栏中选择 工作负载 > 对象浏览器,在 分类 下拉菜单中选择 CRD,通过关键字vmnodescrape进行检索,即可查看集群中的配置。
-
- 选择需要编辑或删除的配置项,单击 操作 栏的...,选择 编辑 Yaml 或 删除,即可编辑或删除自定义配置。
警告
请勿删除集群默认配置,否则可能导致集群观测功能异常。
-
通过 Service/Pod annotation 实现服务发现
如上文所述,您可以使用 ServiceMonitor 或 PodMonitor 实现服务发现。但是,如果集群中有很多的 Service/Pod,那么就需要人工去创建多个 ServiceMonitor 或 PodMonitor 对象来进行监控,这会使得您的配置变得尤为复杂。
为了解决上述问题,托管 Prometheus 为您提供了另外一种服务发现方式,即通过配置 Service/Pod annotation 来实现服务发现。您可以在部署 Service 或 Pod 时,添加指定的 annotation 字段,实现业务的快速接入。
注意
- Service/Pod annotation 是一种快速的服务发现方式,但也存在部分问题,例如:无法实现指标的 Relabel 等。您需要根据实际需求,合理选择使用。
- kube-system 命名空间下无法使用 Service/Pod annotation 实现服务发现。如有需求,建议使用 ServiceMonitor 或 PodMonitor 实现。
当您在集群中配置 Service/Pod 时,可以通过添加如下的 annotation,实现对自定义目标的服务发现。
prometheus.io/scrape: "true"
prometheus.io/port: "9400"
prometheus.io/path: "/metrics"
说明
使用prometheus.io/port: "9400"指定目标的端口号时,该端口必须在容器的配置中显式声明,如下所示:
通过 Service annotation 配置服务发现
当您在集群中配置服务时,可以添加 annotation 完成服务发现。方便服务快速接入监控,步骤如下:
- 在集群列表页面,单击目标集群,进入集群管理页面。
- 在左侧导航栏中,选择 服务与路由 > 服务,单击 使用 Yaml 创建 ,配置服务,并同时添加 annotation,实现服务发现。
name: golang-service-demo
namespace: volcano-metrics
app: golang-service-demo
prometheus.io/scrape: "true"
prometheus.io/port: "2023"
prometheus.io/path: "/metrics"
通过 Pod Annotation 配置服务发现
当您在集群中配置 Pod 时,可以添加 annotation 完成服务发现。方便 Pod 快速接入监控,步骤如下:
- 在集群列表页面,单击目标集群,进入集群管理页面。
- 在左侧菜单栏中选择 工作负载 > 无状态负载,单击 使用 Yaml 创建 ,部署应用,并同时添加 annotation,实现服务发现。
namespace: volcano-metrics
prometheus.io/scrape: "true"
prometheus.io/port: "2023"
prometheus.io/path: "/metrics"
image: doc-cn-beijing.cr.volces.com/vmp/golang-demo:1.0
说明
- 本例以配置无状态负载(Deployment)为例,其他类型工作负载配置的方法相同。
- 本例中的镜像地址为举例,您需要将其修改为实际环境中镜像的正确地址。
- 使用 Pod annotation 实现服务发现时,不能同时支持 HTTP 和 HTTPS。
配置服务发现后,您可以使用托管 Prometheus 的 Explore 功能,确认是否已经发现了期望的服务。操作步骤如下:
- 单击左侧导航栏的 Explore,进入 Explore 页面。
- 在右上角的配置项中,配置需要查询指标的 工作区,并在 指标检索 文本框内,输入 up{job="xxx"}语句,查看对应的服务是否被正确发现。指标的值为 1 表示对应的服务已经被正确发现。
-