使用kubeadm创建K8s集群时AddOn Pod始终处于Pending状态的问题
嘿,我来帮你搞定这个Pod一直Pending的问题!这种调度失败的情况在kubeadm刚搭建的集群里太常见了,咱们一步步来排查:
首先执行这个命令,看看你的节点是不是处于可用状态:
kubectl get nodes
如果输出里节点的STATUS不是Ready,那问题的根源肯定在节点本身,这也是最常见的原因。
如果节点显示NotReady:
大概率是你还没部署网络插件——kubeadm默认不会自动安装网络组件,而网络插件是节点进入Ready状态的必要条件。
先确认节点NotReady的具体原因:
kubectl describe node <你的节点名称>看输出里的
Conditions区块,如果看到NetworkUnavailable标记为True,那实锤就是没装网络插件了。部署kubeadm官方支持的网络插件(比如Calico、Flannel、Weave等),按照官方文档的步骤创建对应的YAML资源即可。部署完成后等个几分钟,再用
kubectl get nodes检查,节点应该会变成Ready状态,Pending的Pod也会自动开始调度。另外也可以检查kubelet的运行状态,看看有没有启动失败或者报错:
systemctl status kubelet如果kubelet没正常运行,根据输出的错误提示修复就行,比如配置文件错误、依赖缺失之类的。
如果节点已经是Ready状态:
那得排查是不是资源不足或者有调度限制:
查看节点的资源使用情况:
再次执行kubectl describe node <你的节点名称>,找到Allocated resources部分,看看CPU、内存是不是已经被占满了。如果资源不够,要么扩容节点,要么清理掉集群里不必要的Pod。检查节点有没有设置调度污点:
在kubectl describe node的Taints区块,如果看到类似node-role.kubernetes.io/master:NoSchedule的条目——这是kubeadm默认给master节点加的污点,防止普通Pod调度到master上。如果你的集群只有这一个master节点,而你的AddOn Pod(比如Tiller、Dashboard)没有配置对应容忍度的话,就会被调度器拒绝。- 解决办法:要么给这些AddOn Pod添加对应的容忍度配置,要么临时移除master节点的污点(注意:生产环境不推荐这么做):
kubectl taint nodes <你的节点名称> node-role.kubernetes.io/master-
- 解决办法:要么给这些AddOn Pod添加对应的容忍度配置,要么临时移除master节点的污点(注意:生产环境不推荐这么做):
Tiller是Helm2的组件,现在Helm3已经完全废弃了Tiller,如果你是刚搭建的集群,建议直接使用Helm3来管理应用,这样能避免Tiller带来的权限和部署复杂度问题。
内容的提问来源于stack exchange,提问作者Flea

