Prometheus定義指南之Operator
譯文【51CTO.com快譯】本文將重點(diǎn)向您介紹如何使用Prometheus Operator和Helm Chart,以及如何以簡(jiǎn)單的方式在Kubernetes集群上安裝和管理Prometheus。首先,讓我們先了解一些與Prometheus Operator相關(guān)的基本概念。
CRD(Custom Resource Definition,定制資源定義)的方法是允許用戶自定義Deployment和StatefulSet等資源類型的結(jié)構(gòu)和有效性。其中,CR(Custom Resource,定制資源)是按照CRD的結(jié)構(gòu)所創(chuàng)建的資源。而Custom Controller(定制控制器)則能夠確保Kubernetes集群、或應(yīng)用程序始終將其當(dāng)前的狀態(tài),與我們所期望的狀態(tài)相匹配。因此,Operator可以被理解為我們部署在集群中的一組Kubernetes定制控制器。它會(huì)去偵聽(tīng)被定制資源中,針對(duì)Kubernetes資源的創(chuàng)建、修改、刪除等操作。您可以通過(guò)鏈接-- https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/,了解更多有過(guò)定制資源的相關(guān)內(nèi)容。
Kubernetes Operator的用例
總的說(shuō)來(lái),Kubernetes Operator可以實(shí)現(xiàn):
- 提供一種在Kubernetes上部署有狀態(tài)服務(wù)(如各種數(shù)據(jù)庫(kù))的方法
- 處理應(yīng)用程序代碼的升級(jí)
- 根據(jù)性能指標(biāo),橫向擴(kuò)展資源
- 按需備份和恢復(fù)應(yīng)用程序或數(shù)據(jù)庫(kù)的狀態(tài)
- 向Kubernetes部署監(jiān)控、存儲(chǔ)、歸檔(vault)等方案
什么是Prometheus Operator?
簡(jiǎn)單來(lái)說(shuō),類似其他標(biāo)準(zhǔn)化的Kubernetes部署對(duì)象,Prometheus Operator能夠以完全自動(dòng)化的方式部署Prometheus服務(wù)器、Alertmanager、以及所有相關(guān)的密鑰和configmap等。該方式有助于在較短幾分鐘內(nèi),建立出Prometheus監(jiān)控系統(tǒng),并實(shí)例化Kubernetes的集群監(jiān)控。而在完成部署后,Prometheus Operator將具有如下功能:
- 自動(dòng)化:便捷地為Kubernetes的命名空間、特定的應(yīng)用或團(tuán)隊(duì)啟動(dòng)Prometheus實(shí)例。
- 服務(wù)發(fā)現(xiàn):無(wú)需額外學(xué)習(xí)Prometheus的特定配置語(yǔ)言,便可使用熟悉的Kubernetes標(biāo)簽,自動(dòng)發(fā)現(xiàn)有待監(jiān)控的目標(biāo)。
- 輕松配置:可管理Prometheus的版本、持久性、留存策略、以及來(lái)自Kubernetes資源的副本等基本資源的相關(guān)配置。
安裝Prometheus棧的方法
在Kubernetes中設(shè)置Prometheus監(jiān)控棧有如下三種不同的方法:
1.自行創(chuàng)造一切
如果您已準(zhǔn)備好了Prometheus組件、及其先決條件,則可以通過(guò)參考其相互之間的依賴關(guān)系,以正確的順序?yàn)镻rometheus、Alertmanager、Grafana的所有密鑰、以及ConfigMaps等每個(gè)組件,手動(dòng)部署YAML規(guī)范文件。這種方法通常非常耗時(shí),并且需要花費(fèi)大量的精力,去部署和管理Prometheus生態(tài)系統(tǒng)。同時(shí),它還需要構(gòu)建強(qiáng)大的文檔,以便將其復(fù)制到其他環(huán)境中。
2. 使用Prometheus Operator
既然前文提到了Prometheus Operator能夠管理Prometheus所有組件的生命周期,那么我們可以參考鏈接--https://github.com/prometheus-operator/prometheus-operator,據(jù)此在Kubernetes集群中部署Prometheus。
3. 使用Helm Chart部署Operator
作為一種更好、更高效的方式,我們可以使用由Prometheus社區(qū)維護(hù)的Helm Chart,來(lái)部署Prometheus Operator。概括地說(shuō),Helm會(huì)隨著Prometheus、Alertmanager和其他定制資源的創(chuàng)建,進(jìn)行Prometheu Operator的初始化安裝。然后,Prometheus Operator會(huì)管理這些定制資源的整個(gè)生命周期。其安裝步驟如下:
- Go
- helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
- helm repo update
- helm install prometheus prometheus-community/kube-prometheus-stack
此處的kube-Prometheus-stack安裝了以下組件:
- Prometheus Operator
- 創(chuàng)建Prometheus、Alertmanager、以及相關(guān)的CR
- Grafana
- 各種節(jié)點(diǎn)導(dǎo)出器
它們還預(yù)先配置了針對(duì)協(xié)同工作、以及為您設(shè)置了基本集群的監(jiān)控,以方便您輕松地調(diào)整和添加各種自定義。上述命令的執(zhí)行速度非??欤恍鑾追昼姳憧蓡?dòng)并運(yùn)行所有的組件。
您可以通過(guò)“helm get manifestPrometheus| kubectl get -f –”命令,來(lái)查看創(chuàng)建的所有對(duì)象。
如上所圖示,您將能夠看到Prometheus棧的Deployments和StatefulSet等所有不同的資源。
Prometheus如何找到所有監(jiān)控項(xiàng)并抓取的目標(biāo)?
為了讓Prometheus發(fā)現(xiàn)待監(jiān)控的對(duì)象,我們需要傳遞一個(gè)被稱為prometheus.yaml的YAML(配置文件,以便Prometheus可以參考并實(shí)施監(jiān)控。每個(gè)待監(jiān)控的目標(biāo)端點(diǎn)都在prometheus.yaml中的scrape_configs部分下被定義。下面展示了Prometheus release tar中自帶的典型配置文件的內(nèi)容:
- Go
- # my global config
- global:
- scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
- evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
- # scrape_timeout is set to the global default (10s).
- # Alertmanager configuration
- alerting:
- alertmanagers:
- - static_configs:
- - targets:
- - localhost:9093
- # Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
- rule_files:
- - '/etc/prometheus/alert.rules'
- # - "first_rules.yml"
- # - "second_rules.yml"
- # A scrape configuration containing exactly one endpoint to scrape:
- # Here it's Prometheus itself.
- scrape_configs:
- # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- - job_name: 'prometheus'
- # metrics_path defaults to '/metrics'
- # scheme defaults to 'http'.
- static_configs:
- - targets: ['localhost:9090']
- - job_name: 'node_exporter'
- scrape_interval: 5s
- static_configs:
- - targets: ['localhost:9100']
下面,讓我們深入了解prometheus.yaml文件中的一些主要關(guān)鍵術(shù)語(yǔ)。其中,我們可以通過(guò)如下兩種方式,為Prometheus指定目標(biāo)端點(diǎn)集合:
- scrape_config通過(guò)指定一組目標(biāo)和配置參數(shù),來(lái)描述如何抓取他們。也就是說(shuō),在prometheus.yaml文件中,我們需要針對(duì)每個(gè)目標(biāo)定義一個(gè)抓取配置塊。
- ServiceMonitor則讓我們以Kubernetes原生的方式,輕松地在scrape_config中創(chuàng)建一個(gè)作業(yè)條目。在內(nèi)部,Prometheus Operator將配置從每個(gè) ServiceMonitor資源轉(zhuǎn)換為prometheus.yaml的scrape_config部分。由kube-prometheus-stack創(chuàng)建的Prometheus資源帶有一個(gè)選擇器,可以對(duì)所有帶有標(biāo)簽release: prometheus(請(qǐng)參見(jiàn)配置)的ServiceMonitor進(jìn)行各項(xiàng)操作。下圖展示了其工作原理:
圖片來(lái)源:CoreOS(https://www.openshift.com/blog)
讓我們以Prometheus服務(wù)本身為例,查看ServiceMonitor能否自動(dòng)在Prometheus配置文件中創(chuàng)建了一個(gè)scrape_config條目。
- Go
- kubectl get services prometheus-prometheus-oper-prometheus -o wide --show-labels
- NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR LABELS
- prometheus-prometheus-oper-prometheus ClusterIP 10.105.67.172 <none> 9090/TCP 12d app=prometheus,prometheus=prometheus-prometheus-oper-prometheus app=prometheus-operator-prometheus,release=prometheus,self-monitor=true
根據(jù)上述代碼,我們進(jìn)而可以查看相應(yīng)的ServiceMonitor是否已為Prometheus的服務(wù)準(zhǔn)備就緒。
- Go
- kubectl get servicemonitors.monitoring.coreos.com -l app=prometheus-operator-prometheus
- NAME AGE
- prometheus-prometheus-oper-prometheus 12d
上述代碼證實(shí)了Prometheus服務(wù)本身ServiceMonitor的存在性。下面,讓我們檢查“prometheus-prometheus-oper-prometheus”是否已在Prometheusconfig YAML文件中添加了一個(gè)作業(yè)。我們首先需要訪問(wèn)由Prometheus Operator創(chuàng)建的Prometheuspod。
- Go
- kubectl exec -it prometheus-prometheus-prometheus-oper-prometheus-0 -- /bin/sh
- /prometheus $
讓我們通過(guò)如下代碼找出pod內(nèi)由Prometheus使用的配置文件名。
- Go
- /prometheus $ ps
- PID USER TIME COMMAND
- 1 1000 4h58 /bin/prometheus … --config.file=/etc/prometheus/config_out/prometheus.env.yaml
- 59 1000 0:00 /bin/sh
從上述代碼可知,由Operator創(chuàng)建的配置文件prometheus.env.yaml可以被Prometheus服務(wù)器用于查找待監(jiān)控和抓取的目標(biāo)端點(diǎn)。最后,讓我們檢查Prometheus服務(wù)本身的作業(yè)是否已被ServiceMonitor添加到了該配置文件中:
- Go
- /Prometheus $ cat / etc /Prometheus/ config_out /Prometheus。ENV 。yaml | grep - i - A 10 "job_name: default/prometheus-prometheus-oper-prometheus/0"
- Go
- - job_name: default/prometheus-prometheus-oper-prometheus/0
- honor_labels: false
- kubernetes_sd_configs:
- - role: endpoints
- namespaces:
- names:
- - default
- metrics_path: /metrics
由上述代碼可知,ServiceMonitor會(huì)自動(dòng)為基于Kubernetes的服務(wù)創(chuàng)建一個(gè)待監(jiān)控和抓取的作業(yè)。
此外,我們也可以直接在Prometheus Web UI中的Status -> Configuration下查看scrape_config的方法。如下圖所示:
除了ServiceMonitor之外,我們也可以使用PodMonitor方法去抓取Kubernetes pod,并由Prometheus Operator處理定制的資源。PodMonitor能夠以聲明的方式,指定如何直接監(jiān)控一組Pod。
您一定會(huì)問(wèn),既然我們有了ServiceMonitor,為何還需要PodMonitor呢?其主要原因是,ServiceMonitor合適那些Pod里已經(jīng)有某個(gè)服務(wù)(Service)的場(chǎng)景。否則,您需要用到PodMonitor。通常,Prometheus可以被配置為如下兩種方式,去定義待監(jiān)控的目標(biāo)端點(diǎn)。
- 使用static_config機(jī)制
如果待監(jiān)控的Kubernetes服務(wù)/端點(diǎn)非常小且固定,那么您可以使用prometheus.yaml文件中的static_config來(lái)定義這些靜態(tài)端點(diǎn)。示例鏈接展示了如何通過(guò)配置Prometheus,以默認(rèn)使用static_configs來(lái)監(jiān)控本身。
當(dāng)然,這主要適用于簡(jiǎn)單的用例,而且需要在添加和刪除節(jié)點(diǎn)時(shí),手動(dòng)更新prometheus.yml。而在Kubernetes之類的動(dòng)態(tài)環(huán)境中,新的應(yīng)用服務(wù)實(shí)例往往會(huì)出現(xiàn)得快而頻繁。
- 使用service_discovery機(jī)制
目前,支持Prometheus的服務(wù)發(fā)現(xiàn)機(jī)制有:DNS、Kubernetes、AWS、Consul、以及其他自定義的類型。這些機(jī)制通常能夠動(dòng)態(tài)地發(fā)現(xiàn)待監(jiān)控和抓取的目標(biāo)端點(diǎn)。對(duì)于Kubernetes而言,它可以使用Kubernetes API來(lái)實(shí)現(xiàn)。示例鏈接展示了如何為Kubernetes配置Prometheus。其中,Prometheus Operator負(fù)責(zé)根據(jù)ServiceMonitor和PodMonitor資源完成上述配置。
Prometheus的規(guī)則
您可以創(chuàng)建一個(gè)包含規(guī)則語(yǔ)句的YAML文件,并使用Prometheus-configuration中的rule_files字段,將它們加載到Prometheus中。而在使用Prometheus Operator時(shí),您可以使用PrometheusRule源的Helm,創(chuàng)建相應(yīng)的規(guī)則。目前,Prometheus可以定期配置和評(píng)估如下兩種類型的規(guī)則:
- 記錄(Recording)規(guī)則
記錄規(guī)則允許您預(yù)先計(jì)算出經(jīng)常使用的PromQL表達(dá)式,并且需要相對(duì)大量的步驟,來(lái)實(shí)現(xiàn)表達(dá)式的結(jié)果。據(jù)此,在下一次運(yùn)行相同的PromQL查詢時(shí),您可以直接從預(yù)先計(jì)算出的PromQL結(jié)果中獲取到。這比反復(fù)執(zhí)行相同的查詢要快得多。例如:
- Go
- groups:
- - name: example
- rules:
- - record: job:http_inprogress_requests:sum
- expr: sum by (job) (http_inprogress_requests)
- 警報(bào)(Alerting)規(guī)則
警報(bào)規(guī)則允許您根據(jù)PromQL定義的警報(bào)條件,將有關(guān)觸發(fā)警報(bào)的通知,發(fā)送到外部接收器上。只要警報(bào)表達(dá)式的結(jié)果為True時(shí),就會(huì)發(fā)送警報(bào)。例如:
- Go
- groups:
- - name: example
- rules:
- - alert: HighRequestLatency
- expr: job:request_latency_seconds:mean5m{job="myjob"} > 0.5
- for: 10m
- labels:
- severity: page
- annotations:
- summary: High request latency
警報(bào)和可視化
圖片來(lái)源:Prometheus的介紹(https://www.youtube.com/watch?v=9GMWvFcQjYI&t=314s)
在配置了警報(bào)規(guī)則后,我們需要通過(guò)Alertmanager來(lái)添加警報(bào)摘要、控制、甚至將收到的通知“靜音”。如上圖所示,Alertmanager會(huì)定期從Prometheus服務(wù)器處接收有關(guān)警報(bào)狀態(tài)的信息,以確保對(duì)已定義的接收者(如電子郵件、PagerDuty等)進(jìn)行分組、數(shù)據(jù)去重、以及通知發(fā)送。
我們不必?fù)?dān)心在何處、以及如何在Kubernetes集群中定義或設(shè)置Alertmanager。我們之前在Helm Chart的幫助下部署Prometheus Operator時(shí),已經(jīng)創(chuàng)建了一個(gè)作為StatefulSet的Alertmanager。請(qǐng)參見(jiàn)如下代碼:
- Go
- kubectl get statefulsets.apps
- NAME READY AGE
- alertmanager-prometheus-prometheus-oper-alertmanager 1/1 8d
Alertmanager StatefulSet會(huì)在內(nèi)部使用一個(gè)配置文件--alertmanager.yaml。我們可以將它放入alertmanagerpod中。請(qǐng)參見(jiàn)如下命令:
- Go
- /bin/alertmanager --config.file=/etc/alertmanager/config/alertmanager.yaml
alertmanager.yaml文件包含了如下關(guān)鍵元素:
- 路由:這是一個(gè)代碼塊,可用于定義將警報(bào)路由到下一個(gè)位置。
- 接收器:接收器是可用來(lái)發(fā)送或通知警報(bào)的網(wǎng)絡(luò)鉤子、郵件地址、以及PagerDuty之類的工具。
- 禁止規(guī)則:禁止規(guī)則部分可以在另一個(gè)警報(bào)因相同原因被觸發(fā)時(shí),使之“靜音”。例如,對(duì)于那些已經(jīng)處于critical級(jí)別的應(yīng)用服務(wù),即便再次出現(xiàn)故障,其警告通知也會(huì)被靜音。
我們可以通過(guò)如下示例來(lái)查看Alertmanager的配置文件:
- Go
- global:
- resolve_timeout: 5m
- route:
- group_by: ['alertname']
- group_wait: 10s
- group_interval: 10s
- repeat_interval: 1h
- receiver: 'web.hook'
- receivers:
- - name: 'web.hook'
- webhook_configs:
- - url: 'http://127.0.0.1:5001/'
- inhibit_rules:
- - source_match:
- severity: 'critical'
- target_match:
- severity: 'warning'
- equal: ['alertname', 'dev', 'instance']
使用Grafana進(jìn)行指標(biāo)可視化
作為一種標(biāo)準(zhǔn)化工具,Grafana可以幫助您可視化那些在Prometheus的幫助下,收集到的所有指標(biāo)。kube-Prometheus-stack的Helm Chart已經(jīng)為我們部署了Grafana。我們可以通過(guò)如下命令,定位Grafana服務(wù)。
- Go
- kubectl get services
- NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S)
- prometheus-grafana ClusterIP 10.104.143.147 <none> 80/TCP
通過(guò)如下代碼,我們可以將端口轉(zhuǎn)發(fā)到此服務(wù)上,以便顯示在Grafana的Web界面上。
- Go
- kubectl port-forward svc/prometheus-grafana 3000:80
- Forwarding from 127.0.0.1:3000 -> 3000
- Forwarding from [::1]:3000 -> 3000
如下圖,您可以在瀏覽器中訪問(wèn)http://localhost:3000。
在輸入了默認(rèn)用戶名:admin和密碼:prom-operator后,您可以訪問(wèn)到Grafana儀表板,如下圖所示。
依次點(diǎn)擊Dashboard -> Manage,您將能夠看到由kube-prometheus-stack提供的有關(guān)Kubernetes集群的所有儀表板:
您可以瀏覽到諸如“Kubernetes/Compute Resources/Pod”等儀表板信息:
上面展示的標(biāo)準(zhǔn)化儀表板便是從kubernetes-mixin項(xiàng)目生成的。
小結(jié)
綜上所述,我們討論了Prometheus Operator是什么,如何在Prometheus Operator和Helm Chart的幫助下輕松地配置Prometheus,Prometheus如何發(fā)現(xiàn)帶監(jiān)控的資源,以及該如何配置Prometheus的各個(gè)組件與運(yùn)作機(jī)制。此外,我們還探討了如何設(shè)置警報(bào),以及如何將它們可視化。
原文標(biāo)題:Prometheus Definitive Guide: Prometheus Operator,作者:Ninad Desai
【51CTO譯稿,合作站點(diǎn)轉(zhuǎn)載請(qǐng)注明原文譯者和出處為51CTO.com】