Prometheus是一款面向云原生應用程序的開源監控工具,本文介紹如何基于阿里云容器Kubernetes版本部署Prometheus監控方案。
前提條件
您已經成功創建一個Kubernetes集群,參見創建Kubernetes托管版集群。
您已連接到集群,方便快速查看節點標簽等信息,參見獲取集群KubeConfig并通過kubectl工具連接集群。
背景信息
對于監控系統而言,監控對象通常分為以下兩類:
資源監控:節點、應用的資源使用情況,在容器Kubernetes中可理解為節點的資源利用率、集群的資源利用率、Pod的資源利用率等。
應用監控:應用內部指標的監控,例如實時統計應用的在線人數,并通過端口暴露來實現應用業務級別的監控與告警等。
在Kubernetes系統中,監控對象具體為:
系統組件:Kubernetes集群中內置的組件,包括apiserver、controller-manager、etcd等。
靜態資源實體:節點的資源狀態、內核事件等。
動態資源實體:Kubernetes中抽象工作負載的實體,例如Deployment、DaemonSet、Pod等。
自定義應用:應用內部需要定制化的監控數據以及監控指標。
對于系統組件和靜態資源實體的監控方式,在配置文件中指明即可。
對于動態資源實體的監控,可以使用Prometheus監控部署方案。
操作步驟
部署Prometheus監控方案。
登錄容器服務管理控制臺,在左側導航欄選擇 。
在應用市場頁面單擊應用目錄頁簽,搜索并單擊ack-prometheus-operator。
在ack-prometheus-operator頁面,單擊一鍵部署。
在創建面板中,選擇集群和命名空間,然后單擊下一步。
在參數配置頁面,設置相應參數,然后單擊確定。
查看部署結果:
執行以下命令,將集群中的Prometheus映射到本地9090端口。
kubectl port-forward svc/ack-prometheus-operator-prometheus 9090:9090 -n monitoring
在瀏覽器中訪問localhost:9090,即可查看Prometheus。
選擇菜單欄
,查看所有采集任務。如果所有任務的狀態為UP,表示所有采集任務均已正常運行。
查看與展示數據聚合。
執行以下命令,將集群中的Grafana映射到本地3000端口。
kubectl -n monitoring port-forward svc/ack-prometheus-operator-grafana 3000:80
在瀏覽器中訪問localhost:3000,選擇相應的Dashboard,即可查看相應的聚合內容。
查看告警規則與設置告警壓制。
查看告警規則
在瀏覽器中訪問
localhost:9090
,選擇菜單欄Alerts,即可查看當前的告警規則。紅色:正在觸發告警。
綠色:正常狀態。
設置告警壓制
執行以下命令,并在瀏覽器中訪問
localhost:9093
,選擇Silenced,設置告警壓制。kubectl --namespace monitoring port-forward svc/alertmanager-operated 9093
上述步驟為您簡單的介紹了如何部署Prometheus監控方案,下面將為您詳細介紹一些不同場景下的配置。
使用容器服務的Prometheus完整的最佳實踐請參見云上Prometheus監控運維最佳實踐。
告警配置
如果您想要設置告警的接收方式以及設置告警接收的模板,請參考如下對alertmanager的config進行配置。
設置告警接收方式
prometheus-operator支持釘釘告警和郵件告警,如果需要開啟,請參見以下操作進行配置。
配置釘釘告警
如果需要添加釘釘告警功能,請在ack-prometheus-operator頁面,單擊一鍵部署,然后在參數配置向導頁面,找到dingtalk字段將enabled設置為true,Token字段填入釘釘的webhook地址;alertmanager的config字段找到receiver,填寫您receivers中對應的釘釘告警名稱(默認為Webhook)。
例如您有兩個釘釘機器人,操作示例如下:
替換釘釘的token配置
在您的釘釘機器人中,分別拷貝webhook地址替換為dingtalk1和dingtalk2的地址。即,使用webhook地址替換下圖中的https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxxxx。
修改receivers
alertmanager的config字段找到receiver,填寫您receivers中對應的釘釘告警名稱,本例中分別為webhook1和webhook2。
修改URL的值
將URL中的值替換成實際的dingtalk的值,本例中為dingtalk1和dingtalk2。
說明如果需要添加多個釘釘機器人,請將前面的Webhook依次遞增即可。
配置郵件告警
如果需要添加郵件告警功能,請在ack-prometheus-operator頁面,單擊一鍵部署,然后在參數配置向導頁面,將紅色選框內的郵件信息補充完整,在
alertmanager
的config
字段找到receiver
,填寫您receivers中對應的郵件告警名稱(默認為mail)。
設置告警接收模板
您可以在alertmanager的templateFiles定義我們的告警模板,示例如下。
Prometheus掛載自定義ConfigMap
以下介紹兩種操作,將ConfigMap掛載到pod中的/etc/prometheus/configmaps/路徑下。
方法一:首次部署prometheus-operator
如果您是第一次部署prometheus-operator,請按照步驟1部署Prometheus監控方案。其中在參數配置向導頁面,找到prometheus的ConfigMaps字段,填入您自定義ConfigMap名稱。
方法二:已部署prometheus-operator
如果集群中已有部署好的prometheus-operator,請按照如下進行操作:
登錄容器服務管理控制臺,在左側導航欄選擇集群。
在集群列表頁面,單擊目標集群名稱,然后在左側導航欄,選擇 。
在目標Helm應用右側操作列下單擊更新。
在更新發布面板中的prometheus和alertmanager的ConfigMaps字段中,填入您自定義ConfigMap名稱后,單擊確定。
例如,您想要定義一個名稱為
special-config
的ConfigMap,里面包含prometheus的config文件。如果您想要在prometheus的pod啟動時,將其作為--config.file的參數,那么我們可以在prometheus的ConfigMaps字段添加如下字段,就可以將其掛載到我們的pod中了,其掛載路徑為/etc/prometheus/configmaps/。special-config的yml定義如下。
prometheus的ConfigMaps字段配置如下。
Grafana配置
Dashboard的外掛配置
如果您想將Dashboard文件以ConfigMap的方式掛載到Grafana pod中,您可以在ack-prometheus-operator頁面,單擊一鍵部署,然后在參數配置向導頁面,找到
extraConfigmapMounts
,您可以在下圖的字段中進行掛載配置。說明先確保dashboard以ConfigMap的形式存在于集群中。
ConfigMap的labels必須要和其他的ConfigMap保持一致。
在Grafana的
extraConfigmapMounts
字段填入我們的ConfigMap信息以及掛載信息。mountPath是/tmp/dashboards/。
ConfigMap是您定義的ConfigMap的名稱。
name是您Dashboard的JSON名稱。
Dashboard的持久化
Grafana支持Dashboard的持久化操作如下:
登錄容器服務管理控制臺,在左側導航欄單擊集群。
在集群列表頁面,單擊目標集群名稱,然后在左側導航欄,選擇
。找到ack-prometheus-operator,然后單擊右側更新。
在更新發布面板,grafana的字段下找到persistence選項,按照下圖配置完成Grafana的持久化操作。
如果我們需要將我們的Dashboard導出到本地,我們可以通過將需要保存的Dashboard導出為JSON文件的方式,將其保存到本地。請參見Grafana導出。
常見問題
釘釘配置后,沒有收到告警。
獲取釘釘的webhook地址。請參見場景三:使用釘釘實現Kubernetes監控告警。
找到dingtalk字段,將enabled設置為true,將Token字段填入釘釘的webhook地址。請參見告警配置中的釘釘告警配置。
部署prometheus-operator時報錯。
報錯信息如下
Can't install release with errors: rpc error: code = Unknown desc = object is being deleted: customresourcedefinitions.apiextensions.k8s.io "xxxxxxxx.monitoring.coreos.com" already exists
在卸載prometheus-operator的時候沒有將上一次部署的自定義資源(CRD)及時清理掉,執行如下命令,刪除CRD并重新部署。
kubectl delete crd prometheuses.monitoring.coreos.com kubectl delete crd prometheusrules.monitoring.coreos.com kubectl delete crd servicemonitors.monitoring.coreos.com kubectl delete crd alertmanagers.monitoring.coreos.com
郵件告警沒有生效 。
郵件告警沒有生效,有可能是因為
smtp_auth_password
填寫的是您的登錄密碼,而非授權碼。另外SMTP的服務器地址需要加端口號。如果在單擊YAML更新時,出現當前集群暫時無法訪問,請稍后重試或提交工單反饋信息。
此問題原因是tiller的配置文件過大,導致的集群無法訪問,您可以先將部分注釋刪除,再將配置文件以ConfigMap形式,掛載到pod中,目前prometheus-operator只支持prometheus和alertmanager pod的掛載,詳情請參見Prometheus掛載自定義ConfigMap中的方法二。
部署prometheus-operator后,如何開啟其中的功能?
當部署好prometheus-operator后,如果要開啟部分功能,在集群信息頁面,選擇
,在ack-prometheus-operator右側,單擊更新,找到對應的開關,進行相應的設置,然后單擊確定開啟您想要的功能。TSDB和阿里云云盤的選擇。
TSDB支持的地域比較少,而阿里云云盤是全域支持,數據回收策略請參見以下配置。
Grafana dashboard顯示有問題
在集群信息頁面選擇
,在ack-prometheus-operator右側,單擊更新,查看clusterVersion的值是否為正確的集群版本。Kubernetes集群是1.16以前的版本,這里請填寫1.14.8-aliyun.1,1.16及以后的版本,請填寫1.16.6-aliyun.1。刪除ack-prometheus的命名空間后,重新安裝ack-prometheus失敗。
只刪除ack-prometheus的命名空間,會導致資源刪除后有殘留配置,影響再次安裝。您可以執行以下操作,刪除殘余配置。
刪除RBAC權限。
刪除ClusterRole。
kubectl delete ClusterRole ack-prometheus-operator-grafana-clusterrole kubectl delete ClusterRole ack-prometheus-operator-kube-state-metrics kubectl delete ClusterRole psp-ack-prometheus-operator-kube-state-metrics kubectl delete ClusterRole psp-ack-prometheus-operator-prometheus-node-exporter kubectl delete ClusterRole ack-prometheus-operator-operator kubectl delete ClusterRole ack-prometheus-operator-operator-psp kubectl delete ClusterRole ack-prometheus-operator-prometheus kubectl delete ClusterRole ack-prometheus-operator-prometheus-psp
刪除ClusterRoleBinding。
kubectl delete ClusterRoleBinding ack-prometheus-operator-grafana-clusterrolebinding kubectl delete ClusterRoleBinding ack-prometheus-operator-kube-state-metrics kubectl delete ClusterRoleBinding psp-ack-prometheus-operator-kube-state-metrics kubectl delete ClusterRoleBinding psp-ack-prometheus-operator-prometheus-node-exporter kubectl delete ClusterRoleBinding ack-prometheus-operator-operator kubectl delete ClusterRoleBinding ack-prometheus-operator-operator-psp kubectl delete ClusterRoleBinding ack-prometheus-operator-prometheus kubectl delete ClusterRoleBinding ack-prometheus-operator-prometheus-psp
刪除CRD。
kubectl delete crd alertmanagerconfigs.monitoring.coreos.com kubectl delete crd alertmanagers.monitoring.coreos.com kubectl delete crd podmonitors.monitoring.coreos.com kubectl delete crd probes.monitoring.coreos.com kubectl delete crd prometheuses.monitoring.coreos.com kubectl delete crd prometheusrules.monitoring.coreos.com kubectl delete crd servicemonitors.monitoring.coreos.com kubectl delete crd thanosrulers.monitoring.coreos.com