Kubernetes 集群监控配置必读
功能简介
作为CNCF第二个毕业的项目(第一个是Kubernetes),Prometheus对Kubernetes有很好的原生支持。通过Prometheus提供的服务自动发现机制,可以实现对Kubernetes集群的自动化监控:当在集群中部署了新的应用时,Prometheus可以自动发现Pod、Service等相关的监控信息;当相关的资源被从Kubernetes集群中删除时,Prometheus也会自动移除这个应用相关的资源监控。
TSDB for Prometheus提供的接口让您可以方便灵活的配置对一个或多个阿里云Kubernetes集群的监控。下面我们详细介绍如何在Kubernetes集群中设置相应的访问权限,以及如何在Prometheus实例中添加相关的配置信息,实现通过Prometheus服务自动发现机制对Kubernetes集群的监控。
设置Kubernetes访问权限
为了让Prometheus安全访问Kubernetes接口,Kubernetes提供了ServiceAccount对象,以便应用程序通过相关安全认证信息(如token)访问Kubernetes API。Prometheus的服务发现机制正是通过Kubernetes API实现的,所以我们首先需要为Prometheus创建一个ServiceAccount对象,并通过Kubernetes的RBAC设置访问权限,给ServiceAccount对象绑定一个ClusterRole,该集群角色声明了Prometheus访问Kubernetes集群所需的权限规则。
以下是一个RBAC资源清单YAML文件(名为prometheus-rbac.yaml)的示例:
apiVersion: rbac.authorization.k8s.io/v1beta1kind: ClusterRolemetadata:name: alibabarules:- apiGroups: [""]resources:- nodes- nodes/proxy- services- services/proxy- endpoints- endpoints/proxy- pods- pods/proxyverbs: ["get", "list", "watch"]- apiGroups:- extensionsresources:- ingressesverbs: ["get", "list", "watch"]- nonResourceURLs: ["/metrics"]verbs: ["get"]---apiVersion: v1kind: ServiceAccountmetadata:name: alibabanamespace: default---apiVersion: rbac.authorization.k8s.io/v1beta1kind: ClusterRoleBindingmetadata:name: alibabaroleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: alibabasubjects:- kind: ServiceAccountname: alibabanamespace: default
创建上述YAML资源清单文件后,使用kubectl命令创建,更新Kubernetes集群配置:
kubectl create -f prometheus-rbac.yaml
完成上述步骤后,登录“阿里云-容器服务Kubernetes”控制台,从页面左侧导航栏进入“保密字典”分页,找到刚刚创建的ServiceAccount,点击右侧“详情”即可查看该ServiceAccount的token信息。然后将token信息拷贝下来,通过TSDB for Prometheus的管理页面 -> “参数配置”页面,创建一个token文件:

Prometheus实例将使用这个token信息,访问Kubernetes集群API,接下来我们介绍如何配置Prometheus服务自动发现。
配置Prometheus服务自动发现
Prometheus通过与Kubernetes API集成来完成自动发现,这里我们通过具体的示例详细介绍如何配置Prometheus支持的几种Kubernetes服务自动发现模式(包括API Server,Node,Pod,Service,Endpoint, Ingress等)。
API Server
API Server是Kubernetes核心组件之一,为了让Prometheus能获取Kubernetes集群API Server信息,需要利用服务自动发现机制,在Prometheus主配置文件(prometheus.yml)中,配置一个单独的监控任务(job),在kubernetes_sd_configs项下,指定api_server地址以及访问token信息(),Prometheus就会自动从Kubernetes API抓取监控指标,并将其作为当前监控任务的目标(targets)。
Prometheus监控任务配置示例如下:
- job_name: kubernetes-apiserversmetrics_path: /metricsscheme: httpskubernetes_sd_configs:- api_server: https://192.168.2.224:6443/ #从阿里云Kubernetes集群管理页面获取“API Server 公网或内网连接端点”role: endpointsbearer_token_file: /prometheus/k8s_token #在Prometheus“参数配置”页面中设置的token文件名tls_config:insecure_skip_verify: truebearer_token_file: /prometheus/k8s_tokentls_config:insecure_skip_verify: truerelabel_configs:- source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]separator: ;regex: default;kubernetes;httpsreplacement: $1action: keep- separator: ;regex: (.*)target_label: __address__replacement: 192.168.2.224:6443action: replace
将上述监控任务配置,通过“参数配置”页面的config文件编辑功能更新到配置文件中后,访问Prometheus控制台,即可看到一个新的监控任务对应Kubernetes API Server:

Node Metrics
利用Node服务发现模式,在Prometheus主配置文件(prometheus.yml)中,配置一个单独的监控任务(job),在kubernetes_sd_configs项下,指定模式为Node,Prometheus就会自动从Kubernetes集群中发现所有Node节点,并将其作为当前监控任务的目标(targets)。
Prometheus监控任务配置示例如下:
- job_name: kubernetes-node-exportermetrics_path: /metricsscheme: httpskubernetes_sd_configs:- api_server: https://106.14.40.119:6443/role: nodebearer_token_file: /prometheus/k8s_tokentls_config:insecure_skip_verify: truebearer_token_file: /prometheus/k8s_tokentls_config:insecure_skip_verify: truerelabel_configs:- separator: ;regex: __meta_kubernetes_node_label_(.+)replacement: $1action: labelmap- separator: ;regex: (.*)target_label: __address__replacement: 106.14.40.119:6443action: replace- source_labels: [__meta_kubernetes_node_name]separator: ;regex: (.+)target_label: __metrics_path__replacement: /api/v1/nodes/${1}/proxy/metricsaction: replace
将上述监控任务配置,通过“参数配置”页面的config文件编辑功能更新到配置文件中后,访问Prometheus控制台,即可看到一个新的监控任务对应Kubernetes集群中的节点Nodes:

Node Exporter
注:该组件需要先在容器集群内安装Node Exporter组件
K8s生态下,Node Exporter被广泛应用于主机监控中,目前Node Exporter支持几乎所有的常见监控指标,如CPU、内存、网络、文件系统、磁盘等。在下面的示例中,我们在K8s集群节点上部署的Node Exporter通过9100端口输出指标,因此在配置中,指向每个node该端口抓取Node Exporter输出的监控指标。
Prometheus监控任务配置示例如下:
- job_name: kubernetes-node-exportermetrics_path: /metricsscheme: httpskubernetes_sd_configs:- api_server: https://192.168.2.224:6443/role: nodebearer_token_file: /prometheus/k8s_tokentls_config:insecure_skip_verify: truebearer_token_file: /prometheus/k8s_tokentls_config:insecure_skip_verify: truerelabel_configs:- separator: ;regex: __meta_kubernetes_node_label_(.+)replacement: $1action: labelmap- separator: ;regex: (.*)target_label: __address__replacement: 192.168.2.224:6443action: replace- source_labels: [__meta_kubernetes_node_name]separator: ;regex: (.+)target_label: __metrics_path__replacement: /api/v1/nodes/${1}:9100/proxy/metricsaction: replace
将上述监控任务配置,通过“参数配置”页面的config文件编辑功能更新到配置文件中后,访问Prometheus控制台,即可看到一个新的监控任务对应Kubernetes集群中的节点Node Exporter:

Node-Kubelet
K8s下节点自带的Kubelet组件也自带输出一些监控指标数据,通过10255端口对外暴露。监控Node Kubelet的配置与前述Node Exporter的配置十分类似,主要的区别是指向Kubelet的10255输出端口。
- job_name: kubernetes-node-kubeletmetrics_path: /metricsscheme: httpskubernetes_sd_configs:- api_server: https://192.168.2.224:6443/role: nodebearer_token_file: /prometheus/k8s_tokentls_config:insecure_skip_verify: truebearer_token_file: /prometheus/k8s_tokentls_config:insecure_skip_verify: truerelabel_configs:- separator: ;regex: __meta_kubernetes_node_label_(.+)replacement: $1action: labelmap- separator: ;regex: (.*)target_label: __address__replacement: 192.168.2.224:6443action: replace- source_labels: [__meta_kubernetes_node_name]separator: ;regex: (.+)target_label: __metrics_path__replacement: /api/v1/nodes/${1}:10255/proxy/metricsaction: replace
将上述监控任务配置,通过“参数配置”页面的config文件编辑功能更新到配置文件中后,访问Prometheus控制台,即可看到一个新的监控任务对应Kubernetes集群中的节点Kubelet:

cAdvisor
cAdvisor为节点上运行的各个容器和整个节点执行资源消耗数据的基本收集。监控cAdvisor的配置与上一节介绍的Node配置十分相似,区别是将_metrics_path访问路径指向…/proxy/metrics/cadvisor
Prometheus监控任务配置示例如下:
- job_name: kubernetes-cadvisormetrics_path: /metricsscheme: httpskubernetes_sd_configs:- api_server: https://192.168.2.224:6443/role: nodebearer_token_file: /prometheus/k8s_tokentls_config:insecure_skip_verify: truebearer_token_file: /prometheus/k8s_tokentls_config:insecure_skip_verify: truerelabel_configs:- separator: ;regex: __meta_kubernetes_node_label_(.+)replacement: $1action: labelmap- separator: ;regex: (.*)target_label: __address__replacement: 192.168.2.224:6443action: replace- source_labels: [__meta_kubernetes_node_name]separator: ;regex: (.+)target_label: __metrics_path__replacement: /api/v1/nodes/${1}/proxy/metrics/cadvisoraction: replace
将上述监控任务配置,通过“参数配置”页面的config文件编辑功能更新到配置文件中后,访问Prometheus控制台,即可看到一个新的监控任务对应Kubernetes集群中cAdvisor:

Pod
利用Pod服务发现模式,在Prometheus主配置文件(prometheus.yml)中,配置一个单独的监控任务(job),在kubernetes_sd_configs项下,指定模式为Pod,Prometheus就会自动从Kubernetes集群中抓取正在运行的Pods并将其作为当前监控任务的目标(targets)。
这里我们给出一个没有添加任何过滤(filtering)条件的Pod服务发现配置示例:
- job_name: 'kubernetes-pods'scheme: httpskubernetes_sd_configs:- api_server: https://192.168.2.224:6443/role: podbearer_token_file: /prometheus/k8s_tokentls_config:insecure_skip_verify: truetls_config:insecure_skip_verify: truebearer_token_file: /prometheus/k8s_tokenrelabel_configs:- source_labels: [__meta_kubernetes_namespace]action: replacetarget_label: kubernetes_namespace- source_labels: [__meta_kubernetes_pod_name]action: replacetarget_label: kubernetes_pod_name- action: labelmapregex: __meta_kubernetes_pod_label_(.+)- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path]action: replacetarget_label: __metrics_path__regex: (.+)- source_labels: [__address__, __meta_kubernetes_pod_annotation_prometheus_io_port]action: replaceregex: ([^:]+)(?::\d+)?;(\d+)replacement: $1:$2target_label: __address__- source_labels: [__address__]separator: ;regex: '.*:(.*)'target_label: __pod_port__replacement: $1action: replace- source_labels: [__meta_kubernetes_namespace,__meta_kubernetes_pod_name, __pod_port__]separator: ;regex: (.*);(.*);(.*)target_label: __metrics_path__replacement: /api/v1/namespaces/$1/pods/$2:$3/proxy/metricsaction: replace- source_labels: [__address__]separator: ;regex: (.*)target_label: __address__replacement: 192.168.2.224:6443action: replace
将上述监控任务配置,通过“参数配置”页面的config文件编辑功能更新到配置文件中后,访问Prometheus控制台,即可看到一个新的监控任务对应Kubernetes集群中Pod监控信息。

前面提到这里给的配置示例没有添加任何过滤条件,因此Prometheus会尝试抓取所有Pod。但实际上并不是所有Pod在其当前运行的端口都有符合Prometheus格式的监控指标输出,所以Prometheus控制台中会显示有一部分端点是DOWN状态,这是符合预期的。
Service
利用Service服务发现模式,在Prometheus主配置文件(prometheus.yml)中,配置一个单独的监控任务(job),在kubernetes_sd_configs项下,指定模式为Service,Prometheus就会自动从Kubernetes集群中抓取正在运行的服务并将其作为当前监控任务的目标(targets)。
这里我们给出一个没有添加任何过滤(filtering)条件的Service服务发现配置示例:
- job_name: 'kubernetes-services'scheme: httpskubernetes_sd_configs:- api_server: https://192.168.2.224:6443/role: servicebearer_token_file: /prometheus/k8s_tokentls_config:insecure_skip_verify: truetls_config:insecure_skip_verify: truebearer_token_file: /prometheus/k8s_tokenrelabel_configs:- separator: ;regex: __meta_kubernetes_service_label_(.+)replacement: $1action: labelmap- source_labels: [__address__]separator: ;regex: '.*:(.*)'target_label: __service_port__replacement: $1action: replace- source_labels: [__meta_kubernetes_namespace,__meta_kubernetes_service_name, __service_port__]separator: ;regex: (.*);(.*);(.*)target_label: __metrics_path__replacement: /api/v1/namespaces/$1/services/$2:$3/proxy/metricsaction: replace- source_labels: [__address__]separator: ;regex: (.*)target_label: __address__replacement: 192.168.2.224:6443action: replace
将上述监控任务配置,通过“参数配置”页面的config文件编辑功能更新到配置文件中后,访问Prometheus控制台,即可看到一个新的监控任务对应Kubernetes集群中Service监控信息。

前面提到这里给的配置示例没有添加任何过滤条件,因此Prometheus会尝试抓取所有Service。但实际上并不是所有Service在其当前运行的端口都有符合Prometheus格式的监控指标输出,所以Prometheus控制台中会显示有一部分端点是DOWN状态,这是符合预期的。
Endpoint
利用Endpoint服务发现模式,在Prometheus主配置文件(prometheus.yml)中,配置一个单独的监控任务(job),在kubernetes_sd_configs项下,指定模式为Endpoint,Prometheus就会自动从Kubernetes集群中抓取正在运行的Endpoint并将其作为当前监控任务的目标(targets)。
这里我们给出一个没有添加任何过滤(filtering)条件的Endpoint服务发现配置示例:
- job_name: kubernetes-endpointsscheme: httpsmetrics_path: /metricskubernetes_sd_configs:- role: endpoints- api_server: https://192.168.2.224:6443/role: endpointsbearer_token_file: /prometheus/k8s_tokentls_config:insecure_skip_verify: truebearer_token_file: /prometheus/k8s_tokentls_config:insecure_skip_verify: truerelabel_configs:- separator: ;regex: __meta_kubernetes_service_label_(.+)replacement: $1action: labelmap- source_labels: [__meta_kubernetes_namespace]separator: ;regex: (.*)target_label: kubernetes_namespacereplacement: $1action: replace- source_labels: [__meta_kubernetes_endpoints_name]separator: ;regex: (.*)target_label: kubernetes_endpoint_namereplacement: $1action: replace- source_labels: [__address__]separator: ;regex: '.*:(.*)'target_label: __service_port__replacement: $1action: replace- source_labels: [__meta_kubernetes_namespace,__meta_kubernetes_endpoint_address_target_name, __service_port__]separator: ;regex: (.*);(.*);(.*)target_label: __metrics_path__replacement: /api/v1/namespaces/$1/pods/$2:$3/proxy/metricsaction: replace- source_labels: [__address__]separator: ;regex: (.*)target_label: __address__replacement: 192.168.2.224:6443action: replace
将上述监控任务配置,通过“参数配置”页面的config文件编辑功能更新到配置文件中后,访问Prometheus控制台,即可看到一个新的监控任务对应Kubernetes集群中Endpoints监控信息。

前面提到这里给的配置示例没有添加任何过滤条件,因此Prometheus会尝试抓取所有Endpoint。但实际上并不是所有Endpoint都有符合Prometheus格式的监控指标输出,所以Prometheus控制台中会显示有一部分端点是DOWN状态,这是符合预期的。