Prometheus的服務發現在解決什麼問題?
被監控的目標(target)是整個監控體系中重要組成部分,傳統監控系統zabbix通過 網路發現
的機制自動建立主機到zabbix-server,進而快速地對目標進行監控。同樣在Prometheus監控中存在一個叫服務發現
的機制,在k8s容器環境中由於叢集內例項網路地址是動態的,我們不可能每次建立或修改例項都將例項IP寫入Prometheus的target中,藉助服務發現
我們可以快速的將叢集內的資源註冊到Prometheus-server中。
Prometheus 中的 scrape_config 是什麼?
Prometheus通過yml檔案來儲存配置檔案,通過scrape_config(抓取配置)域來配置抓取目標和抓取服務發現方式。
scrape_config
指定了一組target和抓取引數。在一般情況下,一個scrape_config指定一個作業。
如下指定了兩個靜態服務發現prometheus、kube-state-metrics,
scrape_configs:
- job_name: prometheus
static_configs:
- targets:
- localhost:9090
- job_name: kube-state-metrics
static_configs:
- targets:
- prometheus-kube-state-metrics.monitoring.svc:8080
Prometheus支援的服務發現非常多:
- static_configs: 靜態服務發現
- dns_sd_configs: DNS 服務發現
- file_sd_configs: 檔案服務發現
- kubernetes_sd_configs: Kubernetes 服務發現
- gce_sd_configs: GCE 服務發現
- ec2_sd_configs: EC2 服務發現
- openstack_sd_configs: OpenStack 服務發現
- azure_sd_configs: Azure 服務發現
前面4個是比較常用的,這裡我們主要介紹kubernetes_sd_configs,其他的比較簡單可檢視Prometheus官方文件 prometheus configuration
什麼是 Kubernetes_sd_configs?
Prometheus中k8s服務發現的原理是通過 Kubernetes 的REST API 檢索抓取目標,並始終與叢集狀態保持同步。所以我們需要配置Kubernetes_sd_configs來訪問K8s API
比如我們要抓取k8s ingress,需要為Prometheus指定用於RBAC認證證書和serviceaccount的token
- job_name: 'kubernetes-ingress'
scheme: https
tls_config:
ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
insecure_skip_verify: true
bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
kubernetes_sd_configs:
- role: ingress
這裡的role為k8s中資源實體如 endpoints、service,、pod,、node或 ingress
當指定ingress時,Prometheus將每個入口地址發現為一個目標。
過載配置檔案後可以在Prometheus Service Discovery檢視發現的target
發現apiserver配置
- job_name: kubernetes-apiservers
scheme: https
tls_config:
ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
insecure_skip_verify: true
bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
kubernetes_sd_configs:
- role: endpoints
relabel_configs:
- action: keep
regex: default;kubernetes;https
source_labels:
- __meta_kubernetes_namespace
- __meta_kubernetes_service_name
- __meta_kubernetes_endpoint_port_name
這裡我們用到了relabel_configs
即重新打標,動作為keep
啥意思呢? 首先我們通過k8s API獲取到所有endpoints,將endpoints中的含後設資料 namespace、service_name、endpoint_port_name的例項和regex匹配,如果匹配成功就保留。這用來過濾一下不需要的例項時很有用。
通過kubectl 檢視的kubernetes這個endpoints的資訊
# kubectl describe endpoints kubernetes
Name: kubernetes
Namespace: default
Labels: <none>
Annotations: <none>
Subsets:
Addresses: 192.168.1.82,192.168.1.83,192.168.1.84
NotReadyAddresses: <none>
Ports:
Name Port Protocol
---- ---- --------
https 6443 TCP
發現出來的target如下
這裡有一個隱藏點,Prometheus會把後設資料中的__address__
和__metrics_path__
作為endpoint,下面我們來看一個替換後設資料的node例項
發現node配置
- job_name: kubernetes-nodes
scheme: https
tls_config:
ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
insecure_skip_verify: true
bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
kubernetes_sd_configs:
- role: node
relabel_configs:
- action: labelmap
regex: __meta_kubernetes_node_label_(.+)
- replacement: kubernetes.default.svc:443
target_label: __address__
- regex: (.+)
replacement: /api/v1/nodes/$1/proxy/metrics
source_labels:
- __meta_kubernetes_node_name
target_label: __metrics_path__
這裡的動作為labelmap
,可用於標籤替換。首先獲取所有node,對後設資料__address__
中的value替換為replacement的值kubernetes.default.svc:443
在replacement的值中可以通過$1,$2,$3...的方式引用source_labels的key-value,所以後設資料__metrics_path__
的值將會被/api/v1/nodes/{node_name}/proxy/metrics替換。
發現出的node如下所示,此時target的address和metrics_path已被替換了。
以上通過kubernetes-apiservers、kubernetes-nodes的例項簡單介紹了Prometheus中如何實現k8s叢集資源的服務發現以及相應的配置和操作。亦可參考Prometheus示例配置prometheus-kubernetes
希望小作文對你有些許幫助,如果內容有誤請指正。通過部落格閱讀:iqsing.github.io