在 Kubernetes 叢集中排除指標伺服器問題

瞭解如何針對 Kubernetes 叢集中的 metrics-server 進行除錯並解決常見問題,內容涵蓋問題徵兆、成因及逐步操作指南。

虛擬私有雲 經典基礎架構

下列症狀可能指出需要調整 metrics-server 資源:

  • metrics-server 經常重新啟動。

  • 刪除名稱空間會導致名稱空間停留在 Terminating 狀態,且 kubectl describe namespace 包括報告度量值 API 探索錯誤的條件。

  • kubectl top pods、kubectl top nodes、其他 kubectl 指令或使用 Kubernetes API 來記載 Kubernetes 錯誤的應用程式,例如:

    The server is currently unable to handle the request (get pods.metrics.k8s.io)
    
    Discovery failed for some groups, 1 failing: unable to retrieve the complete list of server APIs: metrics.k8s.io/v1beta1: the server is currently unable to handle the request
    
  • HorizontalPodAutoscalers (HPA) 不會擴充部署。

  • 執行 kubectl get apiservices v1beta1.metrics.k8s.io 會導致下列狀態:

    NAME                     SERVICE                      AVAILABLE                      AGE
    v1beta1.metrics.k8s.io   kube-system/metrics-server   False (FailedDiscoveryCheck)   139d
    

您的叢集在 kube-system 名稱空間中具有 metrics-server 部署所提供的度量服務。 metrics-server 資源要求及限制基於叢集裡的節點數目,並針對每個工作者節點具有 30 個或更少 Pod 的叢集進行最佳化。 如果記憶體要求太低,它會因記憶體不足錯誤而失敗,且回應會非常緩慢。 如果 CPU 要求太低,可能會因為 CPU 節流控制而使存活性及就緒性探測失敗。

metrics-server 的問題也可能導致其他區域發生問題。 如果控制平面無法使用 Konnectivity 與度量伺服器通訊,則無法使用度量 API。 許可控制 Webhook 可以防止控制平面建立 Pod,包括 metrics-server Pod。

請遵循下列步驟進行疑難排解。

  1. 驗證 metrics-server Pod 是否存在。

    kubectl get pod -n kube-system -l k8s-app=metrics-server
    

    如果未列出任何 Pod,則 admission-control Webhook 可能有問題。 請參閱 為何由於 Webhook 中斷而導致叢集作業失敗?。

  2. 驗證 apiserver 是否可以連接至 metrics-server。

    kubectl logs POD -n kube-system -c metrics-server --tail 5
    

    將 POD 取代為先前顯示的 Pod 名稱。 傳回的任何日誌內容都不重要。

    如果您收到包含 <workerIP>:10250: getsockopt: connection timed out 之類文字的錯誤訊息,請參閱 kubectl 指令逾時。

  3. 如果先前步驟未顯示問題,請調整 metrics-server 的資源。 請參閱 調整叢集度量值提供者資源。