如何将我的节点状态从“NotReady”或“Unknown”状态更改为“Ready”状态?
我的 Amazon Elastic Kubernetes Service (Amazon EKS)Worker 节点处于“NotReady”或“Unknown”状态。我想让我的 Worker 节点恢复到“Ready”状态。
简短描述
您无法在处于 NotReady 或 Unknown 状态的节点上调度容器组(pod),只能在处于 Ready 状态的节点上调度容器组(pod)。
利用下面的解决方法,可解决处于 NotReady 或 Unknown 状态的节点。
如果节点处于 MemoryPressure、DiskPressure 或 PIDPressure 状态,必须管理资源,以允许在节点上调度更多容器组(pod)。
如果您的节点处于 NetworkUnavailable 状态,则必须在该节点上正确配置网络。有关更多信息,请参阅 Kubernetes 网站上的节点状态。
**注意:**有关如何管理容器组(pod)驱逐和资源限制的信息,请参阅 Kubernetes 网站上的节点压力驱逐。
解决方案
检查 aws-node 和 kube-proxy 容器组(pod),看一看这些节点为什么处于 NotReady 状态
处于 NotReady 状态的节点不可用于待调度的容器组(pod)。
为了改善安全状况,托管节点组可能会从节点角色的 Amazon 资源名称(ARN)中删除容器网络接口(CNI)策略。缺失 CNI 策略会导致节点变为 NotReady 状态。要解决此问题,请按照指南,为 aws-node DaemonSet 设置服务账户(IRSA) IAM 角色。
-
要查看您的 aws-node 和 kube-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
-
查看输出。如果节点状态正常,那么 aws-node 和 kube-proxy 容器组(pod)处于 Running 状态。
如果未列出 aws-node 或 kube-proxy 容器组(pod),则跳到第 3 步。aws-node 和 kube-proxy 容器组(pod)由 DaemonSet 管理。这意味着集群中的每个节点都必须有一个 aws-node 和在其上运行的 kube-proxy 容器组(pod)。有关更多信息,请参阅 Kubernetes 网站上的 DaemonSet。如果任一容器组(pod)的状态不是 Running,则运行以下命令:
$ kubectl describe pod yourPodName -n kube-system
要从 aws-node 和 kube-proxy 容器组(pod)日志中获取更多信息,请运行以下命令:
$ kubectl logs yourPodName -n kube-system
描述输出中的日志和事件可以表明容器组(pod)为何未处于 Running 状态。要使节点变为 Ready 状态,aws-node 和 kube-proxy 容器组(pod)在该节点上的状态必须为 Running。
-
如果 aws-node 和 kube-proxy 容器组(pod)未出现在命令的输出结果中,则运行以下命令:
$ kubectl describe daemonset aws-node -n kube-system $ kubectl describe daemonset kube-proxy -n kube-system
-
在输出中搜索无法启动容器组(pod)的原因:
注意: 您还可以搜索 Amazon EKS 控制面板日志,了解无法调度容器组(pod)的原因。
-
根据 AWS 指南,确认 aws-node 和 kube-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 状态的节点存在的问题,请完成以下部分中的步骤。
检查节点和控制面板之间的网络配置
-
确认您的子网中没有访问控制列表(ACL)规则来阻止 Amazon EKS 控制面板和您的 Worker 节点之间的流量。
-
确认您的控制面板和节点的安全组符合最低入站和出站要求。
-
(可选)如果您的节点配置为使用代理,请确认该代理允许流向 API 服务器端点的流量。
-
要验证该节点是否可以访问 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 服务器端点。
-
检查路由表是否配置为允许与 API 服务器端点进行通信。这可以通过互联网网关或 NAT 网关来完成。如果集群使用 PrivateOnly 网络,请验证 VPC 端点的配置是否正确无误。
检查 kubelet 的状态
-
使用 SSH 连接到受影响的 Worker 节点。
-
要检查 kubelet 日志,请运行以下命令:
$ journalctl -u kubelet > kubelet.log
**注意:**kubelet.log 文件包含有关 kubelet 操作的信息,可以帮助您找到节点状态问题的根本原因。
-
如果日志未提供有关问题来源的信息,请运行以下命令。该命令检查 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 端点
- 使用 SSH 连接到其中一个 Worker 节点。
- 要检查您的 AWS 区域的 Amazon Elastic Compute Cloud (Amazon EC2) API 端点是否可访问,请运行以下命令:
**注意:**将 us-east-1 替换为您的 Worker 节点所在的 AWS 区域。$ nc -vz ec2.<region>.amazonaws.com 443Connection to ec2.us-east-1.amazonaws.com 443 port [tcp/https] succeeded!
检查 Worker 节点实例配置文件和 ConfigMap
- 确认 Worker 节点实例配置文件具有推荐的策略。
- 确认 Worker 节点实例角色存在于 aws-auth ConfigMap 中。要检查 ConfigMap,请运行以下命令:
ConfigMap 必须包含 Worker 节点实例 AWS Identity and Access Management(IAM)角色的条目。例如:$ kubectl get cm aws-auth -n kube-system -o yaml
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 官方已更新 1 年前