Kubernetes是一个强大的容器编排系统,但在运行过程中,节点故障可能会发生。本教程将引导您深入了解和排查K8S节点故障的常见问题,以确保集群的可靠性和稳定性。
步骤一:检查节点状态
首先,通过以下命令检查节点的整体状态:
kubectl get nodes
执行上述命令,输入结果如下图:
确认所有节点都处于Ready状态。如果有节点处于NotReady状态,可以运行以下命令查看详细信息:
kubectl describe node <node-name>
例如,现在要查看node01节点详细信息,如下图:
步骤二:查看事件
使用以下命令查看集群中的事件,以了解任何异常情况:
kubectl get events
执行上述命令,输入结果如下图:
步骤三:系统资源检查
确保节点上的系统资源(CPU、内存、磁盘空间)足够。可以通过以下命令检查:
kubectl describe node <node-name> | grep Allocated -A 5
执行上述命令,输入结果如下图:
步骤四:网络排查
(1) 确认网络插件状态
检查网络插件是否正常运行。常见的网络插件有Flannel、Calico等。使用以下命令检查:
kubectl get pods -n kube-system
执行上述命令,输入结果如下图:
(2) 检查节点之间的网络连通性
确认节点之间的网络通信是否正常。使用工具如ping、traceroute等检查节点间的连通性。例如,下图是从node01节点ping控制节点controlplane
步骤五:检查容器运行时状态
如果使用Docker作为容器运行时,请检查Docker容器的状态:
docker ps
docker logs <container-id>
如果使用了containerd为容器运行时,请检查containerd容器的状态,如下图:
步骤六:检查kubelet服务状态
确保kubelet服务在节点上正常运行。运行以下命令:
systemctl status kubelet
检查输出以确保kubelet服务处于激活(active)状态。如果kubelet服务未激活,运行以下命令重启kubelet服务:
sudo systemctl restart kubelet
步骤七:重启故障节点
在确保不影响生产负载的情况下,可以尝试重启故障的节点。使用以下命令:
kubectl drain <node-name> --ignore-daemonsets
kubectl delete node <node-name>
结论
通过以上步骤,您应该能够诊断并解决Kubernetes节点故障的常见问题。请注意,在进行操作之前,确保已经了解操作的潜在风险,并在非生产环境中进行测试。保持对K8S集群的定期监控,以及学习并熟练使用K8S提供的工具,将有助于更好地管理和维护您的容器化应用程序。
9CKA真题
(1) 真题截图:
(2) 中文解析
切换 k8s 集群环境: kubectl config use-context wk8sTask:一个名为 wk8s-node-0 的节点状态为 NotReady,让其他恢复至正常状态,并确认所有的更改开机自动完成。
- 可以使用以下命令,通过 ssh 连接到 wk8s-node-0 节点:ssh wk8s-node-0
- 可以使用以下命令,在该节点上获取更高权限:sudo -i
(3) 官方参考文档
安全地清空一个节点:https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/safely-drain-node/
(4) 做题解答
切换k8s集群环境:
kubectl config use-context wk8s
SSH登录到wk8s-node-0 的节点,并获取最高权限:
ssh wk8s-node-0
sudo -i
检查kubelet的状态:
systemctl status kubelet
重启kubelet,并设置开机自启动:
systemctl enable kubelet
systemctl status kubelet