為什麼我無法在 Amazon EKS 中使用 Metrics Server,從容器、Pod 或節點收集指標?
我無法在 Amazon Elastic Kubernetes Service (Amazon EKS) 叢集中使用 Metrics Server,從容器、Pod 或節點收集指標。
解決方法
Amazon EKS 不會自動安裝 Metrics Server。如果您最近建立了叢集,而且無法使用 Metrics Server 收集指標,請確認您已將 Metrics Server 應用程式部署到叢集。
如果您仍然無法使用 Metrics Server 收集指標,請完成以下各節中的步驟。
**注意:**Metrics Server 不適合做為應用程式與叢集效能的長期監控最佳實務。如需長期監控,請參閱 Kubernetes 網站上的 Pod 與容器的資源管理。Kubernetes 社群會維護 Metrics Server,並在其 GitHub 頁面回報問題。如需更多資訊,請參閱 Metrics Server GitHub 頁面上的問題。
檢查您是否可以從叢集的節點和 Pod 擷取指標
若要檢查您是否可以從叢集的節點和 Pod 擷取指標,請執行以下命令:
kubectl top nodes kubectl top pods
注意:如果任一命令都未傳回錯誤,請參閱檢查 APIService 是否可用且可處理請求一節。
如果前述命令傳回錯誤,請根據您收到的錯誤,完成以下其中一節中的步驟。
「Error from server (Forbidden)」錯誤訊息
如果您遇到角色型存取控制 (RBAC) 授權問題,就會收到「Error from server (Forbidden)」錯誤訊息。
若要解決此錯誤,請採取以下動作:
- 確認 ServiceAccount 已正確附加至部署。
- 驗證 ClusterRole/Role 與 ClusterRoleBinding/RoleBindings 對 Metrics Server 使用正確的 RBAC 權限。如需更多資訊,請參閱 Kubernetes 網站上的使用 RBAC 授權。
如果您透過 aws-auth ConfigMap 中定義的角色存取叢集,請確認您已設定使用者名稱欄位與對應。
請完成以下步驟:
-
若要描述 aws-auth ConfigMap,請執行以下命令:
kubectl describe -n kube-system configmap aws-auth -
檢閱前述命令的輸出,確認存取叢集角色的使用者名稱欄位已設定。
範例輸出:Name: aws-auth Namespace: kube-system Labels: Annotations: <none> Data === mapRoles: ---- ... - groups: - system:masters rolearn: arn:aws:iam::123456789123:role/kubernetes-devops username: devops:`SessionName`請確認輸出中已指定使用者名稱。
「Error from server (ServiceUnavailable)」錯誤訊息
如果 Metrics Server 未正確設定,您就會收到「Error from server (ServiceUnavailable)」錯誤訊息。
若要檢查叢集中 Metrics Server 服務應用程式的組態是否有問題,請執行以下命令:
kubectl describe apiservices v1beta1.metrics.k8s.io
範例輸出:
Name: v1beta1.metrics.k8s.io Namespace: Labels: app=metrics-server ... Status: Conditions: Last Transition Time: 2020-01-09T13:57:23Z Message: all checks passed Reason: Passed Status: True Type: Available Events: <none>
如果 Metrics Server 服務可用且通過檢查,Status (狀態) 就會設為 True。
注意:如果您將 Status (狀態) 設為 True,但問題仍然持續,請參閱檢查 APIService 是否可用且可處理請求一節。
如果 Status (狀態) 設為 False,請在輸出中尋找 Conditions (條件) 對應的 Reason (原因) 代碼與可供人員閱讀的 Message (訊息)。
失敗的 APIService 範例:
... Status: Conditions: Last Transition Time: 2020-01-09T14:40:28Z Message: no response from https://10.0.35.231:443: Get https://10.0.35.231:443: dial tcp 10.0.35.231:443: connect: connection refused Reason: FailedDiscoveryCheck Status: False Type: Available
注意:如果 Reason (原因) 不是 FailedDiscoveryCheck,請參閱其他 APIServer 條件失敗原因 一節。如果 APIServer Conditions Message 包含 Client.Timeout exceeded while awaiting headers,請參閱解決「Client.Timeout exceeded while awaiting headers」錯誤一節。如果 APIServer Conditions Message 包含 Connection refused,請參閱解決「Connection refused」錯誤一節。
解決「Client.Timeout exceeded while awaiting headers」錯誤
如果您未正確設定安全群組或網路存取控制清單 (網路 ACL),就會在 **APIService 上收到「Client.Timeout exceeded will awaiting headers」錯誤訊息。**然後,您將無法存取 metrics-server Pod。
若要解決此錯誤,請確認您的安全群組符合 Amazon EKS 的最低流量需求。
解決「Connection refused」錯誤
如果容器接聽錯誤的連接埠,您就會收到「Connection refused」錯誤訊息。
若要解決此錯誤,請執行以下命令,確認 metrics-server 部署中的 ports、image 與 command 值皆正確:
kubectl describe deployment metrics-server -n kube-system
範例輸出:
Name: metrics-server Namespace: kube-system CreationTimestamp: Wed, 08 Jan 2020 11:48:45 +0200 Labels: app=metrics-server ... Containers: metrics-server: Image: gcr.io/google_containers/metrics-server-amd64:v0.3.6 Port: 443/TCP Command: - /metrics-server - --logtostderr - --secure-port=443 ...
**注意:**Command 與 Image 值會依您部署 Metrics Server 的方式以及映像儲存位置而有所不同。如果 Command 包含 --secure-port 參數,則 Pod 公開的連接埠必須與此參數相符。如果 Command 未包含 --secure-port 參數,則連接埠預設為 443。
其他 APIServer 條件失敗原因
如果 APIService 收到以下任一代碼,請根據相關錯誤訊息採取動作: ServiceNotFound、ServiceAccessError、ServicePortError、EndpointsNotFound、EndpointsAccessError 或 MissingEndpoints。
若要解決這些錯誤,請完成以下步驟:
-
若要取得發生錯誤的服務資訊,請執行以下命令:
kubectl get service -n kube-system在輸出中,確認 Kubernetes 服務的名稱與命名空間與 APIService.Spec.Service 中定義的內容相同。然後,確認連接埠設為 443/TCP。
範例輸出:NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE metrics-server ClusterIP 172.20.172.133 <none> 443/TCP 65m -
執行以下命令以列出所有端點:
kubectl get endpoints metrics-server -n kube-system在輸出中,確認 metrics-server 服務至少有一個端點。
範例輸出:NAME ENDPOINTS AGE metrics-server 10.0.35.231:443 76m -
執行以下命令,確認部署存在,而且標籤與 metrics-server 服務的標籤相符:
kubectl describe deploy metrics-server -n kube-system在輸出中,確認部署至少有一個複本。
範例輸出:Name: metrics-server Namespace: kube-system CreationTimestamp: Wed, 08 Jan 2020 11:48:45 +0200 Labels: app=metrics-server release=metrics-server ... Selector: app=metrics-server,release=metrics-server Replicas: 1 desired | 1 updated | 1 total | 1 available | 0 unavailable ... Pod Template: Labels: app=metrics-server release=metrics-server Service Account: metrics-server Containers: metrics-server: Image: gcr.io/google_containers/metrics-server-amd64:v0.3.6 ...
如果您仍然無法使用 Metrics Server 收集指標,請參閱檢查 APIService 是否可用且可處理請求一節。
檢查 APIService 是否可用且可處理請求
執行以下命令,從您的 Metrics Server Pod 擷取日誌:
kubectl logs -n namespace -l app=metrics-server
**注意:**將 namespace 替換為您的命名空間。
範例錯誤日誌:
E0610 23:13:28.247604 1 reststorage.go:98] unable to fetch pod metrics for pod default/php-apache-b5f58cc5f-nv8sz: no metrics known for pod "default/php-apache-b5f58cc5f-nv8sz" E0610 23:13:43.260069 1 reststorage.go:98] unable to fetch pod metrics for pod default/php-apache-b5f58cc5f-nv8sz: no metrics known for pod "default/php-apache-b5f58cc5f-nv8sz" E0610 23:16:13.346070 1 reststorage.go:98] unable to fetch pod metrics for pod default/php-apache-b5f58cc5f-cj67b: no metrics known for pod "default/php-apache-b5f58cc5f-cj67b" E0610 23:16:13.346087 1 reststorage.go:98] unable to fetch pod metrics for pod default/php-apache-b5f58cc5f-sqc6l: no metrics known for pod "default/php-apache-b5f58cc5f-sqc6l" E0610 23:16:13.346091 1 reststorage.go:98] unable to fetch pod metrics for pod default/php-apache-b5f58cc5f-4cpwk: no metrics known for pod "default/php-apache-b5f58cc5f-4cpwk"
注意:Metrics Server 錯誤日誌會顯示您在 Metrics Server Deployment Command 上是否有組態問題,或 Metrics Server 容器是否有錯誤。如果錯誤訊息不明顯,或您懷疑這是錯誤,請完成在 GitHub 檢查常見問題一節中的步驟。
在 GitHub 檢查常見問題
如果您仍然無法從容器、Pod 或節點收集指標,請在 GitHub 檢查 Metrics Server 的常見問題。如需更多資訊,請參閱 Metrics Server GitHub 頁面上的問題。
若要檢查您的 HorizontalPodAutoscaler (HPA) 與應用程式資源請求是否有未知指標,請完成以下步驟:
-
執行以下命令以檢查 HPA 組態:
kubectl get hpa -n namespace 2048-deployment**注意:**將 namespace 與 2048-deployment 替換為您應用程式的 HPA 組態值。
您可能會看到 <unknown> (在輸出的 Targets (目標) 資料欄下)。
範例輸出:NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE 2048-deployment Deployment/2048-deployment <unknown>/80% 1 2 2 10s -
等待幾分鐘,然後重複步驟 1 的命令。
如果您仍然收到「**<unknown>」**錯誤,請執行以下命令:kubectl describe hpa -n namespace 2048-deployment**注意:**將 namespace 替換為您的命名空間。
然後,檢查輸出的 Events (事件) 區段,以取得更多資訊。
範例輸出:Name: 2048-deployment Namespace: 2048-game ... Metrics: ( current / target ) resource cpu on pods (as a percentage of request): <unknown> / 80% Min replicas: 1 Max replicas: 2 Deployment pods: 2 current / 2 desired Conditions: Type Status Reason Message ---- ------ ------ ------- AbleToScale True SucceededGetScale the HPA controller was able to get the target's current scale ScalingActive False FailedGetResourceMetric the HPA was unable to compute the replica count: missing request for cpu Events: Type Reason Age From Message ---- ------ ---- ---- ------- Warning FailedGetResourceMetric 3m29s (x4333 over 19h) horizontal-pod-autoscaler missing request for cpu**注意:**如果 Message (訊息) 欄顯示 missing request for [x],則您的 Deployment 或 ReplicaSet 可能未在其規格中宣告資源請求。確認 Pod 中的所有容器都已宣告要求。如果您遺漏了要求,則 HPA 中的指標會傳回 <unknown> 回應。
如需更多資訊,請參閱 Kubernetes 網站上的 Pod 與容器的資源管理、Deployment 與 ReplicaSet。
- 語言
- 中文 (繁體)

相關內容
已提問 3 年前
已提問 2 年前