Prometheus基于k8s的動態(tài)服務(wù)發(fā)現(xiàn)實戰(zhàn)

當初做了一個支持springboot的插拔式微服務(wù)監(jiān)控組件,各個微服務(wù)只需要加入依賴,就能暴露prometheus可以識別的接口。但是公司的微服務(wù)數(shù)量太多,在prometheus中一個個配置數(shù)據(jù)收集job也不太現(xiàn)實,而且現(xiàn)在的微服務(wù)都部署在k8s容器中,每重新發(fā)布一次,你的節(jié)點信息都會發(fā)生變化。這時候,我們會想到,k8s中是有提供apiserver這個組件的,所有的微服務(wù)信息理應(yīng)都可以從k8s的serviceapi拿到,prometheus既然具備這么豐富的生態(tài),應(yīng)該就會對k8s的服務(wù)發(fā)現(xiàn)有著良好的支持,所以我們今天就來實戰(zhàn)一下k8s的動態(tài)服務(wù)發(fā)現(xiàn)。

一.基本用法

Promethues通過K8s的apiservice目前可以支持5種服務(wù)發(fā)現(xiàn)模式,分別是:Node、Service、Pod、Endpoints、Ingress。我們可以通過對配置文件prometheus.yml添加以下內(nèi)容實現(xiàn)k8s中信息的獲取。

  - job_name: 'kubernetes-pods'
    kubernetes_sd_configs: //相當于數(shù)據(jù)源類型,更多數(shù)據(jù)源請參考官網(wǎng)
    - role: pod //獲取的資源名
      api_server: 'https://10.110.73.213:6443' //k8s的apiservice接口
      tls_config:
        insecure_skip_verify: true //如果部署在k8s集群中,可以不用配置認證,自動抓取所在k8s集群的信息

二.標簽管理

在連接k8s之后,有些指標會自動生成一些標簽,有時候我們可能會需要重命名這些標簽,可能會丟棄一部分無用的標簽,還可能會通過這些標簽過濾出我們需要監(jiān)控的資源,因此在job_name子屬性中,還有一個叫做relabel_configs的配置,這個配置可以使我們通過一些正則表達式,來滿足我們對標簽的各種自定義。

relabel_configs的常用配置:

#原標簽(需要被替換的標簽),以","進行分隔
[ source_labels: '[' <labelname> [, ...] ']' ]

# 連接多個資源標簽的分隔符
[ separator: <string> | default = ; ]

# 將替換結(jié)果寫入到的目標標簽
[ target_label: <labelname> ]

# 對原標簽進行分割的正則表達式
[ regex: <regex> | default = (.*) ]

# 按照正則分隔后的結(jié)果進行替換的模板,會根據(jù)這個模板生成替換結(jié)果
[ replacement: <string> | default = $1 ]

# 基于正則表達式匹配執(zhí)行的操作。
#replace:通過正則對原標簽分組之后,類似(${1},${2},...),用replacement的值對其替換,正則匹配不到的不替換。
#keep:只保留regex與目標source_labels匹配的指標。
#drop:刪除regex與目標source_labels匹配的指標。
#hashmod:設(shè)置target_label為的modulus哈希值的source_labels。
#labelmap:regex與所有原標簽做匹配,并且將捕獲到的內(nèi)容作為為新的標簽名稱,通過replacement替換值。
#labeldrop:regex與所有原標簽做匹配。任何匹配的標簽將從標簽集中刪除。
#labelkeep:regex與所有原標簽做匹配。只保留匹配的標簽集。
[ action: <relabel_action> | default = replace ]

我們以POD資源為例,看下有哪些自動生成source_labels(更多資源請參考官網(wǎng):https://prometheus.io/docs/prometheus/latest/configuration/configuration/#kubernetes_sd_config
):

  • __meta_kubernetes_namespace:pod對象的名稱空間。
  • __meta_kubernetes_pod_name:pod對象的名稱。
  • __meta_kubernetes_pod_ip:pod對象的pod IP。
  • __meta_kubernetes_pod_label_<labelname>:來自pod對象的每個標簽。
  • __meta_kubernetes_pod_labelpresent_<labelname>true用于pod對象中的每個標簽。
  • __meta_kubernetes_pod_annotation_<annotationname>:來自pod對象的每個注釋。
  • __meta_kubernetes_pod_annotationpresent_<annotationname>:包含某個注解則為true。
  • __meta_kubernetes_pod_container_init:如果容器是[InitContainer]則為true。
  • __meta_kubernetes_pod_container_name:容器的名稱。
  • __meta_kubernetes_pod_container_port_name:容器端口的名稱。
  • __meta_kubernetes_pod_container_port_number:容器端口號。
  • __meta_kubernetes_pod_container_port_protocol:容器端口的協(xié)議。
  • __meta_kubernetes_pod_ready:pod的就緒狀態(tài)。
  • __meta_kubernetes_pod_phase:pod的聲明周期,(Pending,Running,Succeeded,Failed,Unknown
  • __meta_kubernetes_pod_node_name:將Pod所在的節(jié)點的名稱。
  • __meta_kubernetes_pod_host_ip:pod對象的當前主機IP。
  • __meta_kubernetes_pod_uid:pod對象的UID。
  • __meta_kubernetes_pod_controller_kind:pod控制器的對象種類。
  • __meta_kubernetes_pod_controller_name:pod控制器的名稱。

三.實戰(zhàn)

Prometheus的k8s完整配置:

- job_name: 'kubernetes-pods'
    kubernetes_sd_configs:
    - role: pod
      api_server: http://172.16.xx.xx:xxxx
      tls_config:
        insecure_skip_verify: true
    relabel_configs:
    - source_labels: [__meta_kubernetes_namespace]#只對命名空間為order的pod資源進行監(jiān)控
      regex: order
      action: keep
    - source_labels: [__metrics_path__]#替換指示獲取的路徑
      action: replace
      replacement: /hellgate/prometheus#這個是每個微服務(wù)暴露出數(shù)據(jù)收集的URI
      target_label: __metrics_path__
      regex: (.+)
    - source_labels: [__address__,__meta_kubernetes_pod_annotation_prometheus_io_port]#替換ip和端口
      action: replace
      regex: (.*);(.*)
      replacement: ${1}:${2}
      target_label: __address__
    - action: labelmap
      regex: __meta_kubernetes_pod_label_(.+)
    - source_labels: [__meta_kubernetes_namespace]
      action: replace
      target_label: kubernetes_namespace
    - source_labels: [__meta_kubernetes_pod_name]
      action: replace
      target_label: kubernetes_pod_name

之后,在prometheus的target看板中會出現(xiàn)我們的監(jiān)控資源:


image.png

Nice!自己的自定義監(jiān)控終于出來了:


image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容