全部產品
Search
文件中心

Container Service for Kubernetes:開源Prometheus監控

更新時間:Oct 09, 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

      image

上述步驟為您簡單的介紹了如何部署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頁面,單擊一鍵部署,然後在參數配置嚮導頁面,將紅色選框內的郵件資訊補充完整,在alertmanagerconfig欄位找到receiver,填寫您receivers中對應的郵件警示名稱(預設為mail)。郵件警示

  • 設定警示接收模板

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

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以ConfigMap的形式存在於叢集中。

      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