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)的示例:

  1. apiVersion: rbac.authorization.k8s.io/v1beta1
  2. kind: ClusterRole
  3. metadata:
  4. name: alibaba
  5. rules:
  6. - apiGroups: [""]
  7. resources:
  8. - nodes
  9. - nodes/proxy
  10. - services
  11. - services/proxy
  12. - endpoints
  13. - endpoints/proxy
  14. - pods
  15. - pods/proxy
  16. verbs: ["get", "list", "watch"]
  17. - apiGroups:
  18. - extensions
  19. resources:
  20. - ingresses
  21. verbs: ["get", "list", "watch"]
  22. - nonResourceURLs: ["/metrics"]
  23. verbs: ["get"]
  24. ---
  25. apiVersion: v1
  26. kind: ServiceAccount
  27. metadata:
  28. name: alibaba
  29. namespace: default
  30. ---
  31. apiVersion: rbac.authorization.k8s.io/v1beta1
  32. kind: ClusterRoleBinding
  33. metadata:
  34. name: alibaba
  35. roleRef:
  36. apiGroup: rbac.authorization.k8s.io
  37. kind: ClusterRole
  38. name: alibaba
  39. subjects:
  40. - kind: ServiceAccount
  41. name: alibaba
  42. namespace: default

创建上述YAML资源清单文件后,使用kubectl命令创建,更新Kubernetes集群配置:

  1. kubectl create -f prometheus-rbac.yaml

完成上述步骤后,登录“阿里云-容器服务Kubernetes”控制台,从页面左侧导航栏进入“保密字典”分页,找到刚刚创建的ServiceAccount,点击右侧“详情”即可查看该ServiceAccount的token信息。然后将token信息拷贝下来,通过TSDB for Prometheus的管理页面 -> “参数配置”页面,创建一个token文件:

1

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监控任务配置示例如下:

  1. - job_name: kubernetes-apiservers
  2. metrics_path: /metrics
  3. scheme: https
  4. kubernetes_sd_configs:
  5. - api_server: https://192.168.2.224:6443/ #从阿里云Kubernetes集群管理页面获取“API Server 公网或内网连接端点”
  6. role: endpoints
  7. bearer_token_file: /prometheus/k8s_token #在Prometheus“参数配置”页面中设置的token文件名
  8. tls_config:
  9. insecure_skip_verify: true
  10. bearer_token_file: /prometheus/k8s_token
  11. tls_config:
  12. insecure_skip_verify: true
  13. relabel_configs:
  14. - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
  15. separator: ;
  16. regex: default;kubernetes;https
  17. replacement: $1
  18. action: keep
  19. - separator: ;
  20. regex: (.*)
  21. target_label: __address__
  22. replacement: 192.168.2.224:6443
  23. action: replace

将上述监控任务配置,通过“参数配置”页面的config文件编辑功能更新到配置文件中后,访问Prometheus控制台,即可看到一个新的监控任务对应Kubernetes API Server:

2

Node Metrics

利用Node服务发现模式,在Prometheus主配置文件(prometheus.yml)中,配置一个单独的监控任务(job),在kubernetes_sd_configs项下,指定模式为Node,Prometheus就会自动从Kubernetes集群中发现所有Node节点,并将其作为当前监控任务的目标(targets)。

Prometheus监控任务配置示例如下:

  1. - job_name: kubernetes-node-exporter
  2. metrics_path: /metrics
  3. scheme: https
  4. kubernetes_sd_configs:
  5. - api_server: https://106.14.40.119:6443/
  6. role: node
  7. bearer_token_file: /prometheus/k8s_token
  8. tls_config:
  9. insecure_skip_verify: true
  10. bearer_token_file: /prometheus/k8s_token
  11. tls_config:
  12. insecure_skip_verify: true
  13. relabel_configs:
  14. - separator: ;
  15. regex: __meta_kubernetes_node_label_(.+)
  16. replacement: $1
  17. action: labelmap
  18. - separator: ;
  19. regex: (.*)
  20. target_label: __address__
  21. replacement: 106.14.40.119:6443
  22. action: replace
  23. - source_labels: [__meta_kubernetes_node_name]
  24. separator: ;
  25. regex: (.+)
  26. target_label: __metrics_path__
  27. replacement: /api/v1/nodes/${1}/proxy/metrics
  28. action: replace

将上述监控任务配置,通过“参数配置”页面的config文件编辑功能更新到配置文件中后,访问Prometheus控制台,即可看到一个新的监控任务对应Kubernetes集群中的节点Nodes:

node-metrics

Node Exporter

注:该组件需要先在容器集群内安装Node Exporter组件

K8s生态下,Node Exporter被广泛应用于主机监控中,目前Node Exporter支持几乎所有的常见监控指标,如CPU、内存、网络、文件系统、磁盘等。在下面的示例中,我们在K8s集群节点上部署的Node Exporter通过9100端口输出指标,因此在配置中,指向每个node该端口抓取Node Exporter输出的监控指标。

Prometheus监控任务配置示例如下:

  1. - job_name: kubernetes-node-exporter
  2. metrics_path: /metrics
  3. scheme: https
  4. kubernetes_sd_configs:
  5. - api_server: https://192.168.2.224:6443/
  6. role: node
  7. bearer_token_file: /prometheus/k8s_token
  8. tls_config:
  9. insecure_skip_verify: true
  10. bearer_token_file: /prometheus/k8s_token
  11. tls_config:
  12. insecure_skip_verify: true
  13. relabel_configs:
  14. - separator: ;
  15. regex: __meta_kubernetes_node_label_(.+)
  16. replacement: $1
  17. action: labelmap
  18. - separator: ;
  19. regex: (.*)
  20. target_label: __address__
  21. replacement: 192.168.2.224:6443
  22. action: replace
  23. - source_labels: [__meta_kubernetes_node_name]
  24. separator: ;
  25. regex: (.+)
  26. target_label: __metrics_path__
  27. replacement: /api/v1/nodes/${1}:9100/proxy/metrics
  28. action: replace

将上述监控任务配置,通过“参数配置”页面的config文件编辑功能更新到配置文件中后,访问Prometheus控制台,即可看到一个新的监控任务对应Kubernetes集群中的节点Node Exporter:

3

Node-Kubelet

K8s下节点自带的Kubelet组件也自带输出一些监控指标数据,通过10255端口对外暴露。监控Node Kubelet的配置与前述Node Exporter的配置十分类似,主要的区别是指向Kubelet的10255输出端口。

  1. - job_name: kubernetes-node-kubelet
  2. metrics_path: /metrics
  3. scheme: https
  4. kubernetes_sd_configs:
  5. - api_server: https://192.168.2.224:6443/
  6. role: node
  7. bearer_token_file: /prometheus/k8s_token
  8. tls_config:
  9. insecure_skip_verify: true
  10. bearer_token_file: /prometheus/k8s_token
  11. tls_config:
  12. insecure_skip_verify: true
  13. relabel_configs:
  14. - separator: ;
  15. regex: __meta_kubernetes_node_label_(.+)
  16. replacement: $1
  17. action: labelmap
  18. - separator: ;
  19. regex: (.*)
  20. target_label: __address__
  21. replacement: 192.168.2.224:6443
  22. action: replace
  23. - source_labels: [__meta_kubernetes_node_name]
  24. separator: ;
  25. regex: (.+)
  26. target_label: __metrics_path__
  27. replacement: /api/v1/nodes/${1}:10255/proxy/metrics
  28. action: replace

将上述监控任务配置,通过“参数配置”页面的config文件编辑功能更新到配置文件中后,访问Prometheus控制台,即可看到一个新的监控任务对应Kubernetes集群中的节点Kubelet:

4

cAdvisor

cAdvisor为节点上运行的各个容器和整个节点执行资源消耗数据的基本收集。监控cAdvisor的配置与上一节介绍的Node配置十分相似,区别是将_metrics_path访问路径指向…/proxy/metrics/cadvisor

Prometheus监控任务配置示例如下:

  1. - job_name: kubernetes-cadvisor
  2. metrics_path: /metrics
  3. scheme: https
  4. kubernetes_sd_configs:
  5. - api_server: https://192.168.2.224:6443/
  6. role: node
  7. bearer_token_file: /prometheus/k8s_token
  8. tls_config:
  9. insecure_skip_verify: true
  10. bearer_token_file: /prometheus/k8s_token
  11. tls_config:
  12. insecure_skip_verify: true
  13. relabel_configs:
  14. - separator: ;
  15. regex: __meta_kubernetes_node_label_(.+)
  16. replacement: $1
  17. action: labelmap
  18. - separator: ;
  19. regex: (.*)
  20. target_label: __address__
  21. replacement: 192.168.2.224:6443
  22. action: replace
  23. - source_labels: [__meta_kubernetes_node_name]
  24. separator: ;
  25. regex: (.+)
  26. target_label: __metrics_path__
  27. replacement: /api/v1/nodes/${1}/proxy/metrics/cadvisor
  28. action: replace

将上述监控任务配置,通过“参数配置”页面的config文件编辑功能更新到配置文件中后,访问Prometheus控制台,即可看到一个新的监控任务对应Kubernetes集群中cAdvisor:

5

Pod

利用Pod服务发现模式,在Prometheus主配置文件(prometheus.yml)中,配置一个单独的监控任务(job),在kubernetes_sd_configs项下,指定模式为Pod,Prometheus就会自动从Kubernetes集群中抓取正在运行的Pods并将其作为当前监控任务的目标(targets)。

这里我们给出一个没有添加任何过滤(filtering)条件的Pod服务发现配置示例:

  1. - job_name: 'kubernetes-pods'
  2. scheme: https
  3. kubernetes_sd_configs:
  4. - api_server: https://192.168.2.224:6443/
  5. role: pod
  6. bearer_token_file: /prometheus/k8s_token
  7. tls_config:
  8. insecure_skip_verify: true
  9. tls_config:
  10. insecure_skip_verify: true
  11. bearer_token_file: /prometheus/k8s_token
  12. relabel_configs:
  13. - source_labels: [__meta_kubernetes_namespace]
  14. action: replace
  15. target_label: kubernetes_namespace
  16. - source_labels: [__meta_kubernetes_pod_name]
  17. action: replace
  18. target_label: kubernetes_pod_name
  19. - action: labelmap
  20. regex: __meta_kubernetes_pod_label_(.+)
  21. - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path]
  22. action: replace
  23. target_label: __metrics_path__
  24. regex: (.+)
  25. - source_labels: [__address__, __meta_kubernetes_pod_annotation_prometheus_io_port]
  26. action: replace
  27. regex: ([^:]+)(?::\d+)?;(\d+)
  28. replacement: $1:$2
  29. target_label: __address__
  30. - source_labels: [__address__]
  31. separator: ;
  32. regex: '.*:(.*)'
  33. target_label: __pod_port__
  34. replacement: $1
  35. action: replace
  36. - source_labels: [__meta_kubernetes_namespace,__meta_kubernetes_pod_name, __pod_port__]
  37. separator: ;
  38. regex: (.*);(.*);(.*)
  39. target_label: __metrics_path__
  40. replacement: /api/v1/namespaces/$1/pods/$2:$3/proxy/metrics
  41. action: replace
  42. - source_labels: [__address__]
  43. separator: ;
  44. regex: (.*)
  45. target_label: __address__
  46. replacement: 192.168.2.224:6443
  47. action: replace

将上述监控任务配置,通过“参数配置”页面的config文件编辑功能更新到配置文件中后,访问Prometheus控制台,即可看到一个新的监控任务对应Kubernetes集群中Pod监控信息。

6

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

Service

利用Service服务发现模式,在Prometheus主配置文件(prometheus.yml)中,配置一个单独的监控任务(job),在kubernetes_sd_configs项下,指定模式为Service,Prometheus就会自动从Kubernetes集群中抓取正在运行的服务并将其作为当前监控任务的目标(targets)。

这里我们给出一个没有添加任何过滤(filtering)条件的Service服务发现配置示例:

  1. - job_name: 'kubernetes-services'
  2. scheme: https
  3. kubernetes_sd_configs:
  4. - api_server: https://192.168.2.224:6443/
  5. role: service
  6. bearer_token_file: /prometheus/k8s_token
  7. tls_config:
  8. insecure_skip_verify: true
  9. tls_config:
  10. insecure_skip_verify: true
  11. bearer_token_file: /prometheus/k8s_token
  12. relabel_configs:
  13. - separator: ;
  14. regex: __meta_kubernetes_service_label_(.+)
  15. replacement: $1
  16. action: labelmap
  17. - source_labels: [__address__]
  18. separator: ;
  19. regex: '.*:(.*)'
  20. target_label: __service_port__
  21. replacement: $1
  22. action: replace
  23. - source_labels: [__meta_kubernetes_namespace,__meta_kubernetes_service_name, __service_port__]
  24. separator: ;
  25. regex: (.*);(.*);(.*)
  26. target_label: __metrics_path__
  27. replacement: /api/v1/namespaces/$1/services/$2:$3/proxy/metrics
  28. action: replace
  29. - source_labels: [__address__]
  30. separator: ;
  31. regex: (.*)
  32. target_label: __address__
  33. replacement: 192.168.2.224:6443
  34. action: replace

将上述监控任务配置,通过“参数配置”页面的config文件编辑功能更新到配置文件中后,访问Prometheus控制台,即可看到一个新的监控任务对应Kubernetes集群中Service监控信息。

7

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

Endpoint

利用Endpoint服务发现模式,在Prometheus主配置文件(prometheus.yml)中,配置一个单独的监控任务(job),在kubernetes_sd_configs项下,指定模式为Endpoint,Prometheus就会自动从Kubernetes集群中抓取正在运行的Endpoint并将其作为当前监控任务的目标(targets)。

这里我们给出一个没有添加任何过滤(filtering)条件的Endpoint服务发现配置示例:

  1. - job_name: kubernetes-endpoints
  2. scheme: https
  3. metrics_path: /metrics
  4. kubernetes_sd_configs:
  5. - role: endpoints
  6. - api_server: https://192.168.2.224:6443/
  7. role: endpoints
  8. bearer_token_file: /prometheus/k8s_token
  9. tls_config:
  10. insecure_skip_verify: true
  11. bearer_token_file: /prometheus/k8s_token
  12. tls_config:
  13. insecure_skip_verify: true
  14. relabel_configs:
  15. - separator: ;
  16. regex: __meta_kubernetes_service_label_(.+)
  17. replacement: $1
  18. action: labelmap
  19. - source_labels: [__meta_kubernetes_namespace]
  20. separator: ;
  21. regex: (.*)
  22. target_label: kubernetes_namespace
  23. replacement: $1
  24. action: replace
  25. - source_labels: [__meta_kubernetes_endpoints_name]
  26. separator: ;
  27. regex: (.*)
  28. target_label: kubernetes_endpoint_name
  29. replacement: $1
  30. action: replace
  31. - source_labels: [__address__]
  32. separator: ;
  33. regex: '.*:(.*)'
  34. target_label: __service_port__
  35. replacement: $1
  36. action: replace
  37. - source_labels: [__meta_kubernetes_namespace,__meta_kubernetes_endpoint_address_target_name, __service_port__]
  38. separator: ;
  39. regex: (.*);(.*);(.*)
  40. target_label: __metrics_path__
  41. replacement: /api/v1/namespaces/$1/pods/$2:$3/proxy/metrics
  42. action: replace
  43. - source_labels: [__address__]
  44. separator: ;
  45. regex: (.*)
  46. target_label: __address__
  47. replacement: 192.168.2.224:6443
  48. action: replace

将上述监控任务配置,通过“参数配置”页面的config文件编辑功能更新到配置文件中后,访问Prometheus控制台,即可看到一个新的监控任务对应Kubernetes集群中Endpoints监控信息。

8

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