为什么我无法在 Amazon EKS 中使用指标服务器从容器、容器组或节点收集指标?
我无法使用 Amazon Elastic Kubernetes Service (Amazon EKS) 集群中的指标服务器,从容器、容器组或节点中收集指标。
简短描述
默认情况下,Amazon EKS 不安装指标服务器。如果您最近创建了集群,但无法使用指标服务器收集指标,请确认您已将指标服务器应用程序部署到集群。
如果您仍然无法使用指标服务器收集指标,请完成以下各节中所述的步骤:
- 检查是否可以从集群的节点和容器组中检索到指标。
- 检查 APIService 是否可用且可以处理请求。
- 查看 GitHub,了解常见问题。
- 如果指标显示为 ,请检查 Horizontal Pod Autoscaler (HPA) 和应用程序资源请求<unknown>。
**注意:**最好不要使用指标服务器长期监控应用程序和集群性能。请参阅 Kubernetes 网站上的容器组和容器的资源管理,了解如何实施长期监控。Kubernetes 社区一直在维护指标服务器,并在其 GitHub 页面上报告问题。
解决方法
请参阅以下步骤来解决指标服务器中的一些最常见问题。
检查是否可以从集群的节点和容器组中检索到指标
检查 API 服务器和指标服务器之间是否存在错误。要从集群的节点和容器组中提取指标,请运行以下命令:
$ kubectl top nodes
$ kubectl top pods
如果没有命令出错,请参阅检查 APIService 是否可用且可以处理请求部分。
如果收到错误,请根据收到的错误完成以下其中一个部分中所述的步骤:
- 服务器出错 (Forbidden)
- 服务器出错 (ServiceUnavailable)
- 等待标头时已超过 Client.Timeout
- 连接被拒绝
服务器出错 (Forbidden)
此错误消息表明您在使用 RBAC 授权时遇到了问题。要解决此错误,请确认以下几点:
- ServiceAccount 已正确附加到部署。
- ClusterRole/Role 和 ClusterRoleBinding/RoleBindings 使用的指标服务器的 RBAC 权限正确。
有关详细信息,请参阅 Kubernetes 网站上的使用 RBAC 授权。
如果您通过 aws-auth ConfigMap 中定义的角色访问集群,请确认您设置了用户名字段和映射。
-
请运行以下命令来描述 aws-auth ConfigMap:
$ kubectl describe -n kube-system configmap aws-auth
-
确认已为访问集群的角色设置了用户名字段。请参见以下示例:
Name: aws-auth Namespace: kube-system Labels: <none> Annotations: <none> Data ==== mapRoles: ---- ... - groups: - system:masters rolearn: arn:aws:iam::123456789123:role/kubernetes-devops username: devops:{{SessionName}} # Ensure this has been specified.
服务器出错 (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 条件失败原因部分。
如果原因代码为 FailedDiscoveryCheck,则表示指标服务器服务可用且容器组正在运行。Kubernetes APIServer 在尝试访问指标服务器端点时会返回错误。
如果 APIServer 条件消息包含等待标头时已超过 Client.Timeout,则请参阅解决“等待标头时超过 Client.Timeout”错误部分。
如果 APIServer 条件消息包含连接被拒绝,则请参阅解决“连接被拒绝”错误部分。
解决“等待标头时已超过 Client.Timeout”错误
APIService 上显示此错误消息,表示安全组或网络访问控制列表 (ACL) 配置不正确。这会阻止访问 metrics-server 容器组。请参见以下示例:
no response from https://10.0.35.231:443: Get https://10.0.35.231:443: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
要解决此错误,请确认您的安全组符合 Amazon EKS 的最低流量要求。
解决“连接被拒绝”错误
APIServer 消息中显示此错误,表示容器正在错误的端口上进行侦听。请参见以下示例:
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
要解决此错误,请运行以下命令以确认 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 参数,则容器组公开的端口(前面的示例中为“443/TCP”)必须匹配此参数。如果命令不包含 --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 是否可用且可以处理请求
请运行以下命令,从指标服务器容器组中提取日志:
$ kubectl logs -n <namespace> -l app=metrics-server
例如,以字母 E 开头的 metrics-server 中的错误日志:
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 上查看常见问题
如果仍然无法从容器、容器组或节点收集指标,则查看 GitHub 以了解指标服务器的常见问题。
检查您的 HPA 和应用程序资源请求中是否有未知指标
-
要检查 HPA 配置,请运行以下命令:
$ kubectl get hpa -n namespace 2048-deployment
注意:将 namespace 和 2048-deployment 替换为应用程序的 HPA 配置值。您可能会看到 <unknown> 在输出的目标列下。请参见以下示例:
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
然后,查看输出的事件部分,了解更多信息:
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
如果消息列显示 [x] 缺少请求,则 Deployments 或 ReplicaSet 不是符合其规范标准的声明资源请求。确认容器组中的所有容器都声明了请求。忽略请求可能会导致 HPA 中的指标返回 <unknown> 响应。
有关详细信息,请参阅 Kubernetes 网站上的容器组和容器的资源管理。
相关内容
- AWS 官方已更新 2 年前
- AWS 官方已更新 2 年前
- AWS 官方已更新 5 个月前
- AWS 官方已更新 6 个月前