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

4 分钟阅读
0

我无法使用 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/RoleClusterRoleBinding/RoleBindings 使用的指标服务器的 RBAC 权限正确。

有关详细信息,请参阅 Kubernetes 网站上的使用 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)

请运行以下命令,检查集群中指标服务器服务应用程序的配置是否存在问题:

$ 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 代码,请根据相关的错误消息采取措施: ServiceNotFoundServiceAccessErrorServicePortErrorEndpointsNotFoundEndpointsAccessErrorMissingEndpoints

  1. 请运行以下命令,获取与发生错误的服务相关的信息:

    $ 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
  2. 请运行以下命令,列出端点:

    $ kubectl get endpoints metrics-server -n kube-system

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

    NAME             ENDPOINTS         AGE
    metrics-server   10.0.35.231:443   76m
  3. 请运行以下命令,确认存在部署且标签与 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 和应用程序资源请求中是否有未知指标

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

    $ kubectl get hpa -n namespace 2048-deployment

    注意:namespace2048-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] 缺少请求,则 DeploymentsReplicaSet 不是符合其规范标准的声明资源请求。确认容器组中的所有容器都声明了请求。忽略请求可能会导致 HPA 中的指标返回 <unknown> 响应。

有关详细信息,请参阅 Kubernetes 网站上的容器组和容器的资源管理

AWS 官方
AWS 官方已更新 1 年前
没有评论