prometheus k8s服務發現


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

image-20220303195620411

發現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如下

image-20220303190902069

這里有一個隱藏點,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已被替換了。

image-20220303195053113

以上通過kubernetes-apiservers、kubernetes-nodes的實例簡單介紹了Prometheus中如何實現k8s集群資源的服務發現以及相應的配置和操作。亦可參考Prometheus示例配置prometheus-kubernetes

希望小作文對你有些許幫助,如果內容有誤請指正。通過博客閱讀:iqsing.github.io


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM