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

K8s KPI 與 Kuberhealthy

從 Kuberhealthy v2.0.0 繼續前進

去年 11 月在 2019 年聖地牙哥 KubeCon 上,我們宣布發布 Kuberhealthy 2.0.0 - 將 Kuberhealthy 轉型為用於合成監控的 Kubernetes 運算子。這項新功能讓開發人員能夠建立自己的 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 repo 新增至 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(非運算子)時,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 的 deployment 檢查 成功和失敗次數來計算此值。

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

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

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

  • 檢查運行間隔 = 檢查運行的頻率(在您的 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、服務等)的採用率。這是透過我們的客戶正在使用的節點、部署、statefulset、持久卷、服務、Pod 和工作的總數來衡量的。我們透過計算節點、部署、statefulset、持久卷、服務、Pod 和工作的總數來計算此值。

持續時間(延遲)

我們將持續時間定義為控制平面的容量和吞吐量利用率。我們透過擷取 Kuberhealthy deployment 檢查 運行的平均運行持續時間來計算此值。

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

錯誤 / 警報

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

謝謝!

再次感謝社群中的每個人提供的所有貢獻和幫助!我們很高興看到您們建構的成果。與往常一樣,如果您發現問題、有功能請求或需要開啟提取請求,請在 Github 專案上開啟問題