为什么我无法在 Amazon EKS 中使用 Metrics Server 从容器、pod 或节点收集指标?

上次更新时间:2020 年 1 月 23 日

我无法在我的 Amazon Elastic Kubernetes Service (Amazon EKS) 集群中使用 Metrics Server 从容器、pod 或节点收集指标。

简短描述

默认情况下,Amazon EKS 中未安装 Metrics Server。如果您刚创建集群且无法使用 Metrics Server 从容器、pod 或节点收集指标,则请确认您已向您的集群部署 Metrics Server 应用程序

如果您仍无法使用 Metrics Server 收集指标,请完成以下部分中的步骤:

  • 检查您是否可以从您的集群的节点和 pod 检索指标。
  • 检查 APIService 是否可用且是否可以处理请求。
  • 检查 GitHub 的常见问题。
  • 如果指标显示为 <unknown>,请检查 Horizontal Pod Autoscaler (HPA) 和应用程序资源请求。

注意:Metrics Server 不适用于长期监控应用程序和集群性能。 有关长期监控,请参阅管理容器的资源

解决方法

检查您是否可以从您的集群的节点和 pod 检索指标

要检查 API 服务器和 Metrics Server 之间的错误,请运行以下命令以从您的集群的节点和 pod 提取指标:

$ kubectl top nodes
$ kubectl top pods

如果您未收到任何一个命令的错误,则请完成检查 APIService 是否可用且是否可以处理请求部分中的步骤。

如果您收到错误,则请根据您收到的错误完成以下任一部分中的步骤:

  • 来自服务器的错误 (Forbidden)
  • 来自服务器的错误 (ServiceUnavailable)
  • 等待标头时超出 Client.Timeout
  • 连接被拒

来自服务器的错误 (Forbidden)

此错误消息说明您存在 RBAC 授权问题。要解决此错误,请确认以下事项:

  • ServiceAccount 已正确附加到部署。
  • ClusterRole/RoleClusterRoleBinding/RoleBindings 使用正确的 Metrics Server RBAC 权限。

如果您正通过 aws-auth ConfigMap 中定义的角色访问集群,请确认您已设置用户名字段和映射。

1.    要描述 aws-auth ConfigMap,请运行以下命令:

$ kubectl describe -n kube-system configmap aws-auth

2.    确认已为访问集群的角色设置了用户名字段。请参阅以下示例:

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)

要检查您集群中 Metrics Server 服务应用程序的配置问题,请运行以下命令:

$ kubectl describe apiservices v1beta1.metrics.k8s.io

输出应与以下类似:

Name:         v1beta1.metrics.k8s.io
Namespace:
Labels:       app=metrics-server
...
API Version:  apiregistration.k8s.io/v1
Kind:         APIService
Spec:
  Group:                     metrics.k8s.io
  Group Priority Minimum:    100
  Insecure Skip TLS Verify:  true
  Service:
    Name:            metrics-server
    Namespace:       metrics
...
Status:
  Conditions:
    Last Transition Time:  2020-01-09T13:57:23Z
    Message:               all checks passed
    Reason:                Passed
    Status:                True
    Type:                  Available
Events:                    <none>

如果 Metrics Server 服务可用且通过检查,则将状态设置为 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,则 Metrics Server 服务可用且 pod 正在运行。尝试命中 Metrics Server 终端节点时 Kubernetes APIServer 返回错误。

如果 APIServer 条件消息包含“等待标头时超出 Client.Timeout ”,则请完成解决“等待标头时超出 Client.Timeout”错误部分中的步骤。

如果 APIServer 条件消息包含“连接被拒”,则请完成解决“连接被拒”错误部分中的步骤。

解决“等待标头时超出 Client.Timeout”错误

APIService 上的此错误消息说明未正确配置安全组或网络访问控制列表 (ACL),其会阻止访问 metrics-server pod。请参阅以下示例:

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 metrics

输出应与以下类似:

Name:                   metrics-server
Namespace:              metrics
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
...

注意:命令图像值可能因 Metrics Server 的部署方式和图像的储存位置而异。如果命令包含 --secure-port 参数,则 pod 公开的端口(之前示例中为 443/TCP)必须与此参数匹配。如果命令不包含 --secure-port 参数,则端口默认为 443

其他 APIServer 条件失败原因

如果您收到以下任何 APIService 的原因代码,则可根据关联的错误消息采取措施:ServiceNotFound、ServiceAccessError、ServicePortError、EndpointsNotFound、EndpointsAccessError、MissingEndpoints。

1.    要获取错误服务的信息,请运行以下命令:

$ kubectl get service

在输出中,确认 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

2.    要列出终端节点,请运行以下命令:

$ kubectl get endpoints metrics-server

在输出中,确认您拥有至少一个 metrics-server 服务的终端节点:

NAME             ENDPOINTS         AGE
metrics-server   10.0.35.231:443   76m

3.    要确认部署已存在且标签与 metrics-server 服务的标签匹配,请运行以下命令:

$ kubectl describe deploy metrics-server -n metrics

在输出中,确认部署拥有至少一个副本:

Name:                   metrics-server
Namespace:              metrics
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

例如,metrics-server 中的错误日志以 E 为开头:

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 部署命令的配置问题或 Metrics Server 容器本身的错误。如果错误消息不明显,或是您怀疑这是错误且您仍然无法使用 Metrics Server 收集指标,则请完成检查 GitHub 的常见问题部分中的步骤。

检查 GitHub 的常见问题

如果您仍然无法从容器、pod 或节点收集指标,则使用 Metrics Server 检查 GitHub 的常见问题

检查 HPA 和应用程序资源请求以了解未知指标

1.    要检查 HPA 配置,请运行以下命令:

$ kubectl get hpa -n namespace 2048-deployment

注意:命名空间2048-deployment 替换为您应用程序的 HPA 配置值。

您可能会在输出的目标列下看到 <unknown>。请参阅以下示例:

NAME              REFERENCE                    TARGETS         MINPODS   MAXPODS   REPLICAS   AGE
2048-deployment   Deployment/2048-deployment   <unknown>/80%   1         2         2          10s

2.    等待几分钟,然后从第 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] 的请求缺失,则您的部署副本集可能未在其规范中声明资源请求。确认 pod 中的所有容器均已声明请求。

仅保留一个请求可能导致 HPA 中的指标返回 <unknown> 响应。有关更多信息,请参阅管理容器的计算资源


这篇文章对您有帮助吗?


您是否需要账单或技术支持?