本文主要描述使用自建 Prometheus 采集腾讯云容器服务 TKE 的监控数据时如何配置采集规则。TKE 集群内按照节点类型分为常规节点和超级节点,Prometheus 通过配置
scrape_config
来抓取节点和容器的监控数据,由于节点性质不同因此需要配置的采集规则略有差异。常规节点采集规则
常规节点的采集配置文件如下所示:
- job_name: "tke-cadvisor"scheme: httpsmetrics_path: /metrics/cadvisor # 采集容器 cadvisor 监控数据tls_config:insecure_skip_verify: true # tke 的 kubelet 使用自签证书,忽略证书校验authorization:credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/tokenkubernetes_sd_configs:- role: noderelabel_configs:- source_labels: [__meta_kubernetes_node_label_node_kubernetes_io_instance_type]regex: eklet # 排除超级节点action: drop- action: labelmapregex: __meta_kubernetes_node_label_(.+)- job_name: "tke-kubelet"scheme: httpsmetrics_path: /metrics # 采集 kubelet 自身的监控数据tls_config:insecure_skip_verify: trueauthorization:credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/tokenkubernetes_sd_configs:- role: noderelabel_configs:- source_labels: [__meta_kubernetes_node_label_node_kubernetes_io_instance_type]regex: ekletaction: drop- action: labelmapregex: __meta_kubernetes_node_label_(.+)- job_name: "tke-probes" # 采集容器健康检查健康数据scheme: httpsmetrics_path: /metrics/probestls_config:insecure_skip_verify: trueauthorization:credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/tokenkubernetes_sd_configs:- role: noderelabel_configs:- source_labels: [__meta_kubernetes_node_label_node_kubernetes_io_instance_type]regex: ekletaction: drop- action: labelmapregex: __meta_kubernetes_node_label_(.+)
使用说明:
使用节点服务发现(
kubernetes_sd_configs
的 role 为 node
),抓取所有节点 kubelet:10250
暴露的几种监控数据。如果集群是普通节点与超级节点混用,排除超级节点(
relabel_configs
中将带 node.kubernetes.io/instance-type: eklet
这种 label 的 node 排除)。TKE 节点上的 kubelet 证书是自签的,需要忽略证书校验,所以
insecure_skip_verify
要置为 true。kubelet 通过
/metrics/cadvisor
, /metrics
与 /metrics/probes
路径分别暴露了容器 cadvisor 监控数据、kubelet 自身监控数据以及容器健康检查健康数据,为这三个不同路径分别配置采集 job 进行采集。超级节点采集规则
超级节点的采集配置文件如下所示:
- job_name: eks # 采集超级节点监控数据honor_timestamps: truemetrics_path: '/metrics' # 所有健康数据都在这个路径params: # 通常需要加参数过滤掉 ipvs 相关的指标,因为可能数据量较大,打高 Pod 负载。collect[]:- 'ipvs'# - 'cpu'# - 'meminfo'# - 'diskstats'# - 'filesystem'# - 'load0vg'# - 'netdev'# - 'filefd'# - 'pressure'# - 'vmstat'scheme: httpkubernetes_sd_configs:- role: pod # 超级节点 Pod 的监控数据暴露在 Pod 自身 IP 的 9100 端口,所以使用 Pod 服务发现relabel_configs:- source_labels: [__meta_kubernetes_pod_annotation_tke_cloud_tencent_com_pod_type]regex: eklet # 只采集超级节点的 Podaction: keep- source_labels: [__meta_kubernetes_pod_phase]regex: Running # 非 Running 状态的 Pod 机器资源已释放,不需要采集action: keep- source_labels: [__meta_kubernetes_pod_ip]separator: ;regex: (.*)target_label: __address__replacement: ${1}:9100 # 监控指标暴露在 Pod 的 9100 端口action: replace- source_labels: [__meta_kubernetes_pod_name]separator: ;regex: (.*)target_label: pod # 将 Pod 名字写到 "pod" labelreplacement: ${1}action: replace- source_labels: [__meta_kubernetes_namespace]separator: ;regex: (.*)target_label: namespace # 将 Pod 所在 namespace 写到 "namespace" labelreplacement: ${1}action: replacemetric_relabel_configs:- source_labels: [__name__]separator: ;regex: (container_.*|pod_.*|kubelet_.*)replacement: $1action: keep
使用说明:
超级节点的监控数据暴露在每个 Pod 的9100端口的
/metrics
这个 HTTP API 路径(非 HTTPS),使用 Pod 服务发现(kubernetes_sd_configs
的 role 为 pod
),用一个 job 就可以采集完。超级节点的 Pod 支持通过
collect[]
这个查询参数来过滤掉不希望采集的指标,这样可以避免指标数据量过大,导致 Pod 负载升高,通常要过滤掉 ipvs
的指标。如果集群是普通节点与超级节点混用,确保只采集超级节点的 Pod(
relabel_configs
中只保留有 tke.cloud.tencent.com/pod-type:eklet
这个注解的 Pod)。如果 Pod 的 phase 不是 Running 也无法采集,可以排除。
container_
开头的指标是 cadvisor 监控数据,pod_
前缀指标是超级节点 Pod 所在子机的监控数据(相当于将 node_exporter
的 node_
前缀指标替换成了 pod_
),kubelet_
前缀指标是超级节点 Pod 子机内兼容 kubelet 的指标(主要是 pvc 存储监控)。kube-prometheus-stack 配置
通常使用 kube-prometheus-stack 这个 helm chart 来自建 Prometheus,在
values.yaml
中进行自定义配置然后安装到集群,其中可以配置 Prometheus 原生的 scrape_config
(非 CRD),配置方法是将自定义的 scrape_config
写到 prometheus.prometheusSpec.additionalScrapeConfigs
字段下,示例如下:prometheus:prometheusSpec:additionalScrapeConfigs:- job_name: "tke-cadvisor"scheme: httpsmetrics_path: /metrics/cadvisortls_config:insecure_skip_verify: trueauthorization:credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/tokenkubernetes_sd_configs:- role: noderelabel_configs:- source_labels: [__meta_kubernetes_node_label_node_kubernetes_io_instance_type]regex: ekletaction: drop- action: labelmapregex: __meta_kubernetes_node_label_(.+)- job_name: "tke-kubelet"scheme: httpsmetrics_path: /metricstls_config:insecure_skip_verify: trueauthorization:credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/tokenkubernetes_sd_configs:- role: noderelabel_configs:- source_labels: [__meta_kubernetes_node_label_node_kubernetes_io_instance_type]regex: ekletaction: drop- action: labelmapregex: __meta_kubernetes_node_label_(.+)- job_name: "tke-probes"scheme: httpsmetrics_path: /metrics/probestls_config:insecure_skip_verify: trueauthorization:credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/tokenkubernetes_sd_configs:- role: noderelabel_configs:- source_labels: [__meta_kubernetes_node_label_node_kubernetes_io_instance_type]regex: ekletaction: drop- action: labelmapregex: __meta_kubernetes_node_label_(.+)- job_name: ekshonor_timestamps: truemetrics_path: '/metrics'params:collect[]: ['ipvs']# - 'cpu'# - 'meminfo'# - 'diskstats'# - 'filesystem'# - 'load0vg'# - 'netdev'# - 'filefd'# - 'pressure'# - 'vmstat'scheme: httpkubernetes_sd_configs:- role: podrelabel_configs:- source_labels: [__meta_kubernetes_pod_annotation_tke_cloud_tencent_com_pod_type]regex: ekletaction: keep- source_labels: [__meta_kubernetes_pod_phase]regex: Runningaction: keep- source_labels: [__meta_kubernetes_pod_ip]separator: ;regex: (.*)target_label: __address__replacement: ${1}:9100action: replace- source_labels: [__meta_kubernetes_pod_name]separator: ;regex: (.*)target_label: podreplacement: ${1}action: replace- source_labels: [__meta_kubernetes_namespace]separator: ;regex: (.*)target_label: namespacereplacement: ${1}action: replacemetric_relabel_configs:- source_labels: [__name__]separator: ;regex: (container_.*|pod_.*|kubelet_.*)replacement: $1action: keepstorageSpec:volumeClaimTemplate:spec:accessModes: ["ReadWriteOnce"]resources:requests:storage: 100Gi