为什么我无法使用 Amazon EKS 中的指标服务器从容器、容器组 (pod) 或节点中收集指标?
我无法使用 Amazon Elastic Kubernetes Service (Amazon EKS) 集群中的指标服务器从容器、容器组 (pod) 或节点中收集指标。
解决方法
Amazon EKS 无法自动安装指标服务器。如果您最近创建了集群,但无法使用指标服务器收集指标,请确认您已将指标服务器应用程序部署到集群。
如果您仍然无法使用指标服务器收集指标,请完成以下部分中的步骤。
**注意:**最好不要使用指标服务器长期监控应用程序和集群性能。有关长期监控,请参阅 Kubernetes 网站上的 Resource management for pods and containers(容器组 (pod) 和容器的资源管理)。Kubernetes 社区维护指标服务器并在其 GitHub 页面上报告问题。有关更多信息,请参阅指标服务器 GitHub 页面上的 Issues(问题)。
检查是否可以从集群的节点和容器组 (pod) 中检索指标
要检查您是否可以从集群的节点和容器组 (pod) 中检索指标,请运行以下命令:
kubectl top nodes kubectl top pods
注意:如果您没有收到来自任一命令的错误,请参阅检查 APIService 是否可用且可以处理请求部分。
如果您从上述命令中收到错误,请根据收到的错误完成以下其中一个部分中的步骤。
"Error from server (Forbidden)" 错误消息
如果您在基于角色的访问控制 (RBAC) 授权方面遇到问题,则会收到 "Error from server (Forbidden)" 错误消息。
要解决此错误,请执行以下操作:
- 确认 ServiceAccount 已正确连接到部署。
- 验证 ClusterRole/Role 和 ClusterRoleBinding/RoleBindings 使用的指标服务器的 RBAC 权限是否正确。有关详细信息,请参阅 Kubernetes 网站上的 Using RBAC authorization(使用 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`确保在输出中指定了 username(用户名)。
"Error from server (ServiceUnavailable)" 错误消息
如果指标服务器配置不正确,则会收到 "Error from server (ServiceUnavailable)" 错误消息。
要检查集群中指标服务器服务应用程序的配置是否存在问题,请运行以下命令:
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>
如果指标服务器服务可用且通过检查,则状态设置为 True。
注意:如果将状态设置为 True 后,问题依然存在,则请参阅检查 APIService 是否可用且可以处理请求部分。
如果状态设置为 False,则在输出中查找关联的原因代码和可以看懂的条件****消息。
失败的 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
注意:如果原因不是 FailedDiscoveryCheck,请参阅其他 APIServer 条件失败原因部分。如果 APIServer 条件消息包含 Client.Timeout exceeded while awaiting headers,则请参阅解决 "Client.Timeout exceeded while awaiting headers" 错误部分。如果 APIServer 条件消息包含 Connection refused,则请参阅解决 "Connection refused" 错误部分。
解决 "Client.Timeout exceeded while awaiting headers" 错误
如果您未正确配置安全组或网络访问控制列表,则会在 **APIService 上收到 "Client.Timeout exceeded will awaiting headers" 错误消息。**此时您也无法访问 metrics-server 容器组 (pod)。
要解决此错误,请确认您的安全组符合 Amazon EKS 的最低流量要求。
解决 "Connection refused" 错误
如果容器侦听的端口有误,则会收到 "Connection refused" 错误消息。
要解决此错误,请运行以下命令,确认 metrics-server 部署中的端口、映像和命令的值是否正确:
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 ...
注意:****命令和映像的值会有所不同,具体取决于指标服务器的部署方式和映像的存储位置。如果命令包含 --secure-port 参数,则容器组 (pod) 公开的端口必须匹配此参数。如果命令不包含 --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 ...
如果仍然无法使用指标服务器收集指标,请参阅检查 APIService 是否可用且可以处理请求部分。
检查 APIService 是否可用且可以处理请求
请运行以下命令,从指标服务器容器组 (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"
注意:指标服务器错误日志会显示指标服务器部署命令是否存在配置问题,或者指标服务器容器是否存在错误。如果错误消息不明显,或者您怀疑这是缺陷,请完成在 GitHub 上查看常见问题部分中的步骤。
在 GitHub 上查看常见问题
如果仍然无法从容器、容器组 (pod) 或节点收集指标,则查看 GitHub 以了解指标服务器的常见问题。有关更多信息,请参阅指标服务器 GitHub 页面上的 Issues(问题)。
要检查您的 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 网站上的 Resource management for pods and containers(容器组 (pod) 和容器的资源管理)、Deployment 和 ReplicaSet。
- 语言
- 中文 (简体)
