如何将我的节点状态从“NotReady”或“Unknown”状态更改为“Ready”状态?

3 分钟阅读
0

我的 Amazon Elastic Kubernetes Service (Amazon EKS)Worker 节点处于“NotReady”或“Unknown”状态。我想让我的 Worker 节点恢复到“Ready”状态。

简短描述

您无法在处于 NotReadyUnknown 状态的节点上调度容器组(pod),只能在处于 Ready 状态的节点上调度容器组(pod)。

利用下面的解决方法,可解决处于 NotReadyUnknown 状态的节点。

如果节点处于 MemoryPressureDiskPressurePIDPressure 状态,必须管理资源,以允许在节点上调度更多容器组(pod)。

如果您的节点处于 NetworkUnavailable 状态,则必须在该节点上正确配置网络。有关更多信息,请参阅 Kubernetes 网站上的节点状态

**注意:**有关如何管理容器组(pod)驱逐和资源限制的信息,请参阅 Kubernetes 网站上的节点压力驱逐

解决方案

检查 aws-node 和 kube-proxy 容器组(pod),看一看这些节点为什么处于 NotReady 状态

处于 NotReady 状态的节点不可用于待调度的容器组(pod)。

为了改善安全状况,托管节点组可能会从节点角色的 Amazon 资源名称(ARN)中删除容器网络接口(CNI)策略。缺失 CNI 策略会导致节点变为 NotReady 状态。要解决此问题,请按照指南,为 aws-node DaemonSet 设置服务账户(IRSA) IAM 角色。

  1. 要查看您的 aws-nodekube-proxy 容器组(pod)的状态,请运行以下命令:

    $ kubectl get pods -n kube-system -o wide

    输出结果类似于:

    $ kubectl get pods -n kube-system -o wideNAME                             READY   STATUS    RESTARTS   AGE        IP              NODE
    aws-node-qvqr2                    1/1     Running   0          4h31m      192.168.54.115  ip-192-168-54-115.ec2.internal
    kube-proxy-292b4                  1/1     Running   0          4h31m      192.168.54.115  ip-192-168-54-115.ec2.internal
  2. 查看输出。如果节点状态正常,那么 aws-nodekube-proxy 容器组(pod)处于 Running 状态。
    如果未列出 aws-nodekube-proxy 容器组(pod),则跳到第 3 步。aws-nodekube-proxy 容器组(pod)由 DaemonSet 管理。这意味着集群中的每个节点都必须有一个 aws-node 和在其上运行的 kube-proxy 容器组(pod)。有关更多信息,请参阅 Kubernetes 网站上的 DaemonSet

    如果任一容器组(pod)的状态不是 Running,则运行以下命令:

    $ kubectl describe pod yourPodName -n kube-system

    要从 aws-nodekube-proxy 容器组(pod)日志中获取更多信息,请运行以下命令:

    $ kubectl logs yourPodName -n kube-system

    描述输出中的日志和事件可以表明容器组(pod)为何未处于 Running 状态。要使节点变为 Ready 状态,aws-nodekube-proxy 容器组(pod)在该节点上的状态必须为 Running

  3. 如果 aws-nodekube-proxy 容器组(pod)未出现在命令的输出结果中,则运行以下命令:

    $ kubectl describe daemonset aws-node -n kube-system
    $ kubectl describe daemonset kube-proxy -n kube-system
  4. 在输出中搜索无法启动容器组(pod)的原因:

    注意: 您还可以搜索 Amazon EKS 控制面板日志,了解无法调度容器组(pod)的原因。

  5. 根据 AWS 指南,确认 aws-nodekube-proxy 的版本与集群版本兼容。例如,运行以下命令来检查容器组(pod)版本:

    $ kubectl describe daemonset aws-node --namespace kube-system | grep Image | cut -d "/" -f 2$ kubectl get daemonset kube-proxy --namespace kube-system -o=jsonpath='{$.spec.template.spec.containers[:1].image}'

    **注意:**要更新 aws-node 版本,请参阅使用适用于 Kubernetes Amazon EKS 扩展程序的 Amazon VPC CNI 插件。要更新 kube-proxy 版本,请按照更新 Amazon EKS 集群的 Kubernetes 版本中的第 4 步进行操作。

在某些情况下,节点可能处于 Unknown 状态。这意味着节点上的 kubelet 无法将节点的正确状态传达给控制面板。

要解决处于 Unknown 状态的节点存在的问题,请完成以下部分中的步骤。

检查节点和控制面板之间的网络配置

  1. 确认您的子网中没有访问控制列表(ACL)规则来阻止 Amazon EKS 控制面板和您的 Worker 节点之间的流量。

  2. 确认您的控制面板和节点的安全组符合最低入站和出站要求

  3. (可选)如果您的节点配置为使用代理,请确认该代理允许流向 API 服务器端点的流量。

  4. 要验证该节点是否可以访问 API 服务器,请在 Worker 节点内部运行以下 netcat 命令:

    $ nc -vz 9FCF4EA77D81408ED82517B9B7E60D52.yl4.eu-north-1.eks.amazonaws.com 443Connection to 9FCF4EA77D81408ED82517B9B7E60D52.yl4.eu-north-1.eks.amazonaws.com 443 port [tcp/https] succeeded!

    注意:9FCF4EA77D81408ED82517B9B7E60D52.yl4.eu-north-1.eks.amazonaws.com 替换为您的 API 服务器端点。

  5. 检查路由表是否配置为允许与 API 服务器端点进行通信。这可以通过互联网网关或 NAT 网关来完成。如果集群使用 PrivateOnly 网络,请验证 VPC 端点的配置是否正确无误。

检查 kubelet 的状态

  1. 使用 SSH 连接到受影响的 Worker 节点。

  2. 要检查 kubelet 日志,请运行以下命令:

    $ journalctl -u kubelet > kubelet.log

    **注意:**kubelet.log 文件包含有关 kubelet 操作的信息,可以帮助您找到节点状态问题的根本原因。

  3. 如果日志未提供有关问题来源的信息,请运行以下命令。该命令检查 Worker 节点上 kubelet 的状态:

    $ sudo systemctl status kubelet  kubelet.service - Kubernetes Kubelet
       Loaded: loaded (/etc/systemd/system/kubelet.service; enabled; vendor preset: disabled)
      Drop-In: /etc/systemd/system/kubelet.service.d
               └─10-eksclt.al2.conf
       Active: inactive (dead) since Wed 2023-12-04 08:57:33 UTC; 40s ago

    如果 kubelet 不处于 Running 状态,则运行以下命令来重启 kubelet

    $ sudo systemctl restart kubelet

确认可以访问 Amazon EC2 API 端点

  1. 使用 SSH 连接到其中一个 Worker 节点。
  2. 要检查您的 AWS 区域的 Amazon Elastic Compute Cloud (Amazon EC2) API 端点是否可访问,请运行以下命令:
    $ nc -vz ec2.<region>.amazonaws.com 443Connection to ec2.us-east-1.amazonaws.com 443 port [tcp/https] succeeded!
    **注意:**将 us-east-1 替换为您的 Worker 节点所在的 AWS 区域。

检查 Worker 节点实例配置文件和 ConfigMap

  1. 确认 Worker 节点实例配置文件具有推荐的策略
  2. 确认 Worker 节点实例角色存在于 aws-auth ConfigMap 中。要检查 ConfigMap,请运行以下命令:
    $ kubectl get cm aws-auth -n kube-system -o yaml
    ConfigMap 必须包含 Worker 节点实例 AWS Identity and Access Management(IAM)角色的条目。例如:
    apiVersion: v1kind: ConfigMap
    metadata:
      name: aws-auth
      namespace: kube-system
    data:
      mapRoles: |
        - rolearn: <ARN of instance role (not instance profile)>
          username: system:node:{{EC2PrivateDNSName}}
          groups:
            - system:bootstrappers
            - system:nodes
AWS 官方
AWS 官方已更新 3 个月前