全部產品
Search
文件中心

Container Service for Kubernetes:開源Prometheus監控

更新時間:Jun 19, 2024

Prometheus是一款面向雲原生應用程式的開源監控工具,本文介紹如何基於阿里雲容器Kubernetes版本部署Prometheus監控方案。

前提條件

背景資訊

對於監控系統而言,監控對象通常分為以下兩類:

  • 資源監控:節點、應用的資源使用方式,在容器Kubernetes中可理解為節點的資源使用率、叢集的資源使用率、Pod的資源使用率等。

  • 應用監控:應用內部指標的監控,例如即時統計應用的線上人數,並通過連接埠暴露來實現應用業務層級的監控與警示等。

在Kubernetes系統中,監控對象具體為:

  • 系統組件:Kubernetes叢集中內建的組件,包括apiserver、controller-manager、etcd等。

  • 靜態資源實體:節點的資源狀態、核心事件等。

  • 動態資源實體:Kubernetes中抽象工作負載的實體,例如Deployment、DaemonSet、Pod等。

  • 自訂應用:應用內部需要定製化的監控資料以及監控指標。

對於系統組件和靜態資源實體的監控方式,在設定檔中指明即可。

對於動態資源實體的監控,可以使用Prometheus監控部署方案。

操作步驟

  1. 部署Prometheus監控方案。

    1. 登入Container Service管理主控台,在左側導覽列選擇市場 > 應用市場

    2. 應用市場頁面單擊應用目錄頁簽,搜尋並單擊ack-prometheus-operator

    3. ack-prometheus-operator頁面,單擊一鍵部署

    4. 建立面板中,選擇叢集和命名空間,然後單擊下一步

    5. 參數配置頁面,設定相應參數,然後單擊確定

      查看部署結果:

      1. 執行以下命令,將叢集中的Prometheus映射到本地9090連接埠。

        kubectl port-forward svc/ack-prometheus-operator-prometheus 9090:9090 -n monitoring
      2. 在瀏覽器中訪問localhost:9090,即可查看Prometheus。

      3. 選擇功能表列Status > Targets,查看所有採集任務。採集任務如果所有任務的狀態為UP,表示所有採集任務均已正常運行。Targets

  2. 查看與展示資料彙總。

    1. 執行以下命令,將叢集中的Grafana映射到本地3000連接埠。

      kubectl -n monitoring port-forward svc/ack-prometheus-operator-grafana 3000:80
    2. 在瀏覽器中訪問localhost:3000,選擇相應的Dashboard,即可查看相應的彙總內容。

      Dashboard

  3. 查看警示規則與設定警示壓制。

    • 查看警示規則

      在瀏覽器中訪問localhost:9090,選擇功能表列Alerts,即可查看當前的警示規則。

      • 紅色:正在觸發警示。

      • 綠色:正常狀態。

      Alerts

    • 設定警示壓制

      執行以下命令,並在瀏覽器中訪問localhost:9093,選擇Silenced,設定警示壓制。

      kubectl --namespace monitoring port-forward svc/alertmanager-operated 9093

      Silence

上述步驟為您簡單的介紹了如何部署Prometheus監控方案,下面將為您詳細介紹一些不同情境下的配置。

警示配置

如果您想要設定警示的接收方式以及設定警示接收的模板,請參考如下對alertmanager的config進行配置。

  • 設定警示接收方式

    prometheus-operator支援DingTalk警示和郵件警示,如果需要開啟,請參見以下操作進行配置。

    • 配置DingTalk警示

      如果需要添加DingTalk警示功能,請在ack-prometheus-operator頁面,單擊一鍵部署,然後在參數配置嚮導頁面,找到dingtalk欄位將enabled設定為true,Token欄位填入DingTalk的webhook地址;alertmanager的config欄位找到receiver,填寫您receivers中對應的DingTalk警示名稱(預設為Webhook)。

      例如您有兩個DingTalk機器人,操作樣本如下:

      1. 替換DingTalk的token配置

        在您的DingTalk機器人中,分別拷貝webhook地址替換為dingtalk1和dingtalk2的地址。即,使用webhook地址替換下圖中的https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxxxx

        token配置

      2. 修改receivers

        alertmanager的config欄位找到receiver,填寫您receivers中對應的DingTalk警示名稱,本例中分別為webhook1webhook2

      3. 修改URL的值

        將URL中的值替換成實際的dingtalk的值,本例中為dingtalk1dingtalk2

        webhook配置

      說明

      如果需要添加多個DingTalk機器人,請將前面的webhook依次遞增即可。

    • 配置郵件警示

      如果需要添加郵件警示功能,請在ack-prometheus-operator頁面,單擊一鍵部署,然後在參數配置嚮導頁面,將紅色選框內的郵件資訊補充完整,在alertmanager的config欄位找到receiver,填寫您receivers中對應的郵件警示名稱(預設為mail)。郵件警示

  • 設定警示接收模板

    您可以在alertmanager的templateFiles定義我們的警示模板,樣本如下。模板設定

儲存配置

支援通過TSDB和雲端硬碟儲存,您可以通過如下操作設定prometheus的資料存放位置。

  • TSDB配置

    如果需要將prometheus的資料存入TSDB,請在ack-prometheus-operator頁面,單擊一鍵部署,然後在參數配置嚮導頁面,找到tsdb欄位,將enabled設定為true,並把remoteRead和remoteWrite的URL填寫完整。TSDB配置

  • 雲端硬碟儲存配置

    ack-prometheus-operator預設帶了阿里雲盤儲存,可以選擇在prometheus或者alertmanager中選擇雲端硬碟儲存,請在ack-prometheus-operator頁面,單擊一鍵部署,然後在參數配置嚮導頁面,找到alertmanager的storage欄位或者prometheus的storageSpec欄位來配置雲端硬碟儲存,這裡的storageClassName需要填雲端硬碟類型,accessModes需要配置訪問模式,storage需要填寫需要容量。雲端硬碟配置

    說明

    本例中,您需要在Prometheus中啟用一個SSD雲端硬碟,則在Prometheus的storageSpec欄位中,將storageClassName配置為alicloud-disk-ssdaccessModes配置為ReadWriteOncesrorage配置為50Gi,樣本如下。雲端硬碟儲存

    配置完成後,您可以在ECS控制台,選擇儲存與快照 > 雲端硬碟,查看您啟用的SSD雲端硬碟。

    如果您想要複用雲端硬碟,請參見雲端硬碟儲存卷概述

通過自訂指標來實現HPA

您可以在prometheus中使用prometheus-adapter自訂指標,通過開啟adapter,使得叢集中的pod根據指標,自動增加和減少,提升資源使用率。

您可以在ack-prometheus-operator頁面,單擊一鍵部署,然後在參數配置嚮導頁面,找到prometheus-adapter欄位,將enabled為true,即可啟用adapter。啟用adapter

配置完成後,您可以通過執行如下命令,來查看是否正確開啟adapter,如果您需要自訂指標,請參見prometheus-adapter

kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1"

Prometheus掛載自訂configmap

以下介紹兩種操作,將configmap掛載到pod中的/etc/prometheus/configmaps/路徑下。

方法一:首次部署prometheus-operator

如果您是第一次部署prometheus-operator,請按照步驟1部署Prometheus監控方案。其中在參數配置嚮導頁面,找到prometheus的configmaps欄位,填入您自訂configmap名稱。掛載configmap

方法二:已部署prometheus-operator

如果叢集中已有部署好的prometheus-operator,請按照如下進行操作:

  1. 登入Container Service管理主控台,在左側導覽列選擇叢集

  2. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇應用 > Helm

  3. 在目標Helm應用右側操作列下單擊更新

  4. 更新發布面板中的prometheus和alertmanager的configmaps欄位中,填入您自訂configmap名稱後,單擊確定

    更新配置

    例如,您想要定義一個名稱為special-config的configmap,裡麵包含prometheus的config檔案。如果您想要將在prometheus的pod啟動時,將其作為--config.file的參數,那我們就可以在prometheus的configmaps欄位添加如下欄位,就可以將其掛載到我們的pod中了,其掛載路徑為/etc/prometheus/configmaps/

    special-config的yml定義如下。

    special-config

    prometheus的configmaps欄位配置如下。configmaps

Grafana配置

  • Dashboard的外掛配置

    如果您想將Dashboard檔案以configmap的方式掛載到Grafana pod中去,您可以在ack-prometheus-operator頁面,單擊一鍵部署,然後在參數配置嚮導頁面,找到extraConfigmapMounts,您可以在下圖的欄位中進行掛載配置。dashboard外掛配置

    說明
    • 先確保dashboard以confgimap的形式存在於叢集中。

      configmap的labels必須要和其他的configmap保持一致。

    • 在Grafana的extraConfigmapMounts欄位填入我們的configmap資訊以及掛載資訊。

    • mountPath是/tmp/dashboards/

    • configmap是您定義的configmap的名稱。

    • name是您Dashboard的JSON名稱。

  • Dashboard的持久化

    Grafana支援Dashboard的持久化操作如下:

    1. 登入Container Service管理主控台,在左側導覽列單擊叢集

    2. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇應用 > Helm

    3. 找到ack-prometheus-operator,然後單擊右側更新

    4. 更新發布面板,grafana的欄位下找到persistence選項,按照下圖配置完成Grafana的持久化操作。

    grafana的持久化操作

    如果我們需要匯出我們的Dashboard到本地,我們可以將需要儲存的Dashboard通過匯出為JSON檔案的方式,將其儲存到本地。請參見Grafana匯出

常見問題

  • DingTalk配置後,沒有收到警示。

    1. 擷取DingTalk的webhook地址。請參見情境三:使用DingTalk實現Kubernetes監控警示

    2. 找到dingtalk欄位,將enabled設定為true,將Token欄位填入DingTalk的webhook地址。請參見警示配置中的DingTalk警示配置

  • 部署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後,如果要開啟部分功能,在叢集資訊頁面,選擇應用 > Helm,在ack-prometheus-operator右側,單擊更新,找到對應的開關,做相應的設定,然後單擊確定開啟您想要的功能。

  • TSDB和阿里雲雲端硬碟的選擇。

    TSDB支援的地區比較少,而阿里雲雲端硬碟是全域支援,資料回收策略請參見以下配置。資料回收策略

  • Grafana dashboard顯示有問題

    在叢集資訊頁面選擇應用 > Helm,在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的命名空間,會導致資源刪除後有殘留配置,影響再次安裝。您可以執行以下操作,刪除殘餘配置。

    1. 刪除RBAC許可權。

      1. 刪除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
      2. 刪除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
    2. 刪除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