本文發表於一年多前。舊文章可能包含過時內容。請檢查頁面中的資訊自發布以來是否已變得不正確。

使用 Kuberhealthy 監測 K8s KPI

基於 Kuberhealthy v2.0.0 繼續發展

去年 11 月在 KubeCon San Diego 2019 大會上,我們宣佈釋出 Kuberhealthy 2.0.0 —— 將 Kuberhealthy 轉型為用於合成監控的 Kubernetes Operator。這項新功能讓開發人員能夠建立自己的 Kuberhealthy 檢查容器,以合成方式監控他們的應用程式和叢集。社群很快採用了這項新功能,我們感謝所有在其叢集中實施和測試 Kuberhealthy 2.0.0 的人。感謝所有在 #kuberhealthy Slack 頻道中報告問題並參與討論的人。我們迅速著手處理您的所有反饋,釋出了 Kuberhealthy 的新版本。此外,我們建立了一份指南,介紹如何輕鬆安裝和使用 Kuberhealthy,以捕獲一些有用的合成 KPI

部署 Kuberhealthy

要安裝 Kuberhealthy,請確保您已安裝 Helm 3。如果尚未安裝,您可以使用此 deploy 資料夾中生成的扁平規範檔案。如果您不使用 Prometheus Operator,則應使用 kuberhealthy-prometheus.yaml;如果您使用 Prometheus Operator,則應使用 kuberhealthy-prometheus-operator.yaml。如果您完全不使用 Prometheus,仍然可以使用 Kuberhealthy,並透過 此規範使用 JSON 狀態頁面和/或 InfluxDB 整合。

使用 Helm 3 進行安裝

1. 在所需的 Kubernetes 叢集/上下文中建立名稱空間 "kuberhealthy"
kubectl create namespace kuberhealthy
2. 將當前名稱空間設定為 "kuberhealthy"
kubectl config set-context --current --namespace=kuberhealthy 
3. 將 kuberhealthy 倉庫新增到 Helm
helm repo add kuberhealthy https://comcast.github.io/kuberhealthy/helm-repos
4. 根據您的 Prometheus 實現,使用適用於您叢集的相應命令安裝 Kuberhealthy
helm install kuberhealthy kuberhealthy/kuberhealthy --set prometheus.enabled=true,prometheus.enableAlerting=true,prometheus.enableScraping=true,prometheus.serviceMonitor=true
  • 如果您使用 Prometheus,但**不**使用 Prometheus Operator
helm install kuberhealthy kuberhealthy/kuberhealthy --set prometheus.enabled=true,prometheus.enableAlerting=true,prometheus.enableScraping=true

有關配置適當的抓取註解的更多詳細資訊,請參閱下面的Prometheus 整合詳情部分。

  • 最後,如果您不使用 Prometheus
helm install kuberhealthy kuberhealthy/kuberhealthy

執行 Helm 命令應自動安裝最新版本的 Kuberhealthy (v2.2.0) 以及一些基本檢查。如果您執行 kubectl get pods,應該會看到兩個 Kuberhealthy pod。這些 pod 用於建立、協調和跟蹤測試 pod。這兩個 Kuberhealthy pod 還提供一個 JSON 狀態頁面以及一個 /metrics 端點。您看到的其他所有建立的 pod 都是檢查器 pod,用於執行並在完成後關閉。

配置附加檢查

接下來,您可以執行 kubectl get khchecks。您應該會看到預設安裝了三個 Kuberhealthy 檢查:

  • daemonset:部署並拆除一個 daemonset,以確保叢集中的所有節點都正常執行。
  • deployment:建立一個部署,然後觸發滾動更新。測試部署是否可以透過服務訪問,然後刪除所有內容。此過程中的任何問題都會導致此檢查報告失敗。
  • dns-status-internal:驗證內部叢集 DNS 是否按預期執行。

要檢視其他可用的外部檢查,請查閱外部檢查登錄檔,您可以在其中找到其他可應用於叢集以啟用各種檢查的 yaml 檔案。

Kuberhealthy 檢查 pod 應在 Kuberhealthy 啟動後不久(1-2 分鐘)開始執行。此外,check-reaper cronjob 每隔幾分鐘執行一次,以確保同時沒有超過 5 個已完成的檢查器 pod 留下。

要獲取這些檢查的狀態頁檢視,您需要透過編輯服務 kuberhealthy 並將 Type: LoadBalancer 設定為外部暴露 kuberhealthy 服務,或者使用 kubectl port-forward service/kuberhealthy 8080:80。檢視時,服務終結點將顯示一個 JSON 狀態頁,如下所示:

{
    "OK": true,
    "Errors": [],
    "CheckDetails": {
        "kuberhealthy/daemonset": {
            "OK": true,
            "Errors": [],
            "RunDuration": "22.512278967s",
            "Namespace": "kuberhealthy",
            "LastRun": "2020-04-06T23:20:31.7176964Z",
            "AuthoritativePod": "kuberhealthy-67bf8c4686-mbl2j",
            "uuid": "9abd3ec0-b82f-44f0-b8a7-fa6709f759cd"
        },
        "kuberhealthy/deployment": {
            "OK": true,
            "Errors": [],
            "RunDuration": "29.142295647s",
            "Namespace": "kuberhealthy",
            "LastRun": "2020-04-06T23:20:31.7176964Z",
            "AuthoritativePod": "kuberhealthy-67bf8c4686-mbl2j",
            "uuid": "5f0d2765-60c9-47e8-b2c9-8bc6e61727b2"
        },
        "kuberhealthy/dns-status-internal": {
            "OK": true,
            "Errors": [],
            "RunDuration": "2.43940936s",
            "Namespace": "kuberhealthy",
            "LastRun": "2020-04-06T23:20:44.6294547Z",
            "AuthoritativePod": "kuberhealthy-67bf8c4686-mbl2j",
            "uuid": "c85f95cb-87e2-4ff5-b513-e02b3d25973a"
        }
    },
    "CurrentMaster": "kuberhealthy-7cf79bdc86-m78qr"
}

此 JSON 頁面顯示叢集中執行的所有 Kuberhealthy 檢查。如果您的 Kuberhealthy 檢查在不同的名稱空間中執行,您可以透過在狀態頁 URL 上新增 GET 變數 namespace 引數來過濾它們:?namespace=kuberhealthy,kube-system

編寫自己的檢查

Kuberhealthy 旨在透過自定義檢查容器進行擴充套件,任何人都可以編寫這些容器來檢查任何內容。只要這些檢查被打包到容器中,就可以用任何語言編寫。這使得 Kuberhealthy 成為建立您自己的合成檢查的絕佳平臺!

建立您自己的檢查是驗證您的客戶端庫、模擬真實使用者工作流程並提高您的服務或系統正常執行時間信心的絕佳方式。

要了解有關編寫您自己的檢查的更多資訊以及簡單示例,請查閱自定義檢查建立文件。

Prometheus 整合詳情

啟用 Prometheus(非 Operator)時,Kuberhealthy 服務會新增以下註解:

prometheus.io/path: /metrics
prometheus.io/port: "80"
prometheus.io/scrape: "true"

在您的 Prometheus 配置中,新增以下示例 scrape_config,它根據新增的 prometheus 註解抓取 Kuberhealthy 服務:

- job_name: 'kuberhealthy'
  scrape_interval: 1m
  honor_labels: true
  metrics_path: /metrics
  kubernetes_sd_configs:
  - role: service
    namespaces:
      names:
        - kuberhealthy
  relabel_configs:
    - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape]
      action: keep
      regex: true

您還可以使用此示例作業指定要抓取的目標端點:

- job_name: kuberhealthy
  scrape_interval: 1m
  honor_labels: true
  metrics_path: /metrics
  static_configs:
    - targets:
      - kuberhealthy.kuberhealthy.svc.cluster.local:80

應用適當的 Prometheus 配置後,您應該能夠看到以下 Kuberhealthy 指標:

  • kuberhealthy_check
  • kuberhealthy_check_duration_seconds
  • kuberhealthy_cluster_states
  • kuberhealthy_running

建立關鍵績效指標

利用這些 Kuberhealthy 指標,我們的團隊能夠根據以下定義、計算和 PromQL 查詢收集 KPI。

可用性

我們定義可用性為 K8s 叢集控制平面正常執行並按預期工作。這透過我們能否在設定的時間內建立部署、進行滾動更新並刪除部署來衡量。

我們透過衡量 Kuberhealthy 的部署檢查的成功和失敗來計算這一點。

  • 可用性 = 正常執行時間 / (正常執行時間 * 停機時間)

  • 正常執行時間 = 部署檢查透過次數 * 檢查執行間隔

  • 停機時間 = 部署檢查失敗次數 * 檢查執行間隔

  • 檢查執行間隔 = 檢查執行的頻率(在 KuberhealthyCheck 規範中設定的 runInterval

  • PromQL 查詢(過去 30 天的可用性百分比)

    1 - (sum(count_over_time(kuberhealthy_check{check="kuberhealthy/deployment", status="0"}[30d])) OR vector(0)) / sum(count_over_time(kuberhealthy_check{check="kuberhealthy/deployment", status="1"}[30d]))
    

利用率

我們將利用率定義為使用者對產品(k8s)及其資源(pod、服務等)的採用。這透過我們客戶使用的節點、部署、有狀態集、持久卷、服務、pod 和作業的數量來衡量。我們透過計算節點、部署、有狀態集、持久卷、服務、pod 和作業的總數來計算這一點。

持續時間(延遲)

我們定義持續時間為控制平面的容量和吞吐量利用率。我們透過捕獲 Kuberhealthy 部署檢查執行的平均執行持續時間來計算這一點。

  • PromQL 查詢(部署檢查平均執行持續時間)
    avg(kuberhealthy_check_duration_seconds{check="kuberhealthy/deployment"}) 
    

錯誤/警報

我們將錯誤定義為所有 k8s 叢集和 Kuberhealthy 相關警報。每次我們的 Kuberhealthy 檢查失敗時,我們都會收到此失敗的警報。

謝謝!

再次感謝社群中所有人的貢獻和幫助!我們很高興看到您構建了什麼。一如既往,如果您發現問題、有功能請求或需要提交拉取請求,請在 Github 專案上提出問題