k8s

pod无法启动报错:Predicate NodePorts failed

报错详情

pod状态显示为NodePorts:

file

查看pod events:

file

原因

我的ingress-nginx-controller是daemonset形式部署的,只部署在master节点上。报错是nodeport无法分配,那就先看端口是否有冲突:

file

发现端口没有被占用。

file

查看daemonset的yaml,端口使用了主机端口hostport,查看hostport是否被占用:

file

发现hostport端口80,443,8443都没有被占用。

file

参考https://blog.csdn.net/mzzgaopeng/article/details/111473881,https://wghdr.top/?p=423

kube-scheduler调度分为两个阶段,predicate预选和priority优选。在预选阶段时会先判断端口是否有冲突,即PodFitsPorts。从events日志中可以看到是在这阶段报错的。

那么问题来了,对应主机上为什么没有端口占用呢?

资源对象里虽然使用hostport暴露,但是容器内没有使用这个端口,所以主机上不会真正暴露出来,所以肉眼无法感知到端口占用。

进入ingress-nginx-controller容器内查看端口情况,容器内使用的还是80,443,8443。

file

解决

修改daemonset中的hostport,修改为如下的端口:

file

同时修改ingress-nginx-controller svc的端口:

file

等待pod重启完成,pod恢复正常,域名访问正常。

file

再次查看端口情况:

file

发现hostport仍然使用的是80,443,8443,而不是配置的8800,8843。再次查看daemonset的yaml,发现启用了hostNetwork: true,hostNetwork的优先级高于hostPort,hostNetwork直接通过主机端口到容器中,而hostport通过iptables的nat表进行转发。所以没有使用配置的hostport端口。

既然hostNetwork优先级更高,那之前80,443无法启动,查看master01主机上运行的pod,发现启动了kuboard静态pod,该pod使用了主机的80端口,破案了。。。

分类: k8s
0 0 投票数
文章评分
订阅评论
提醒
guest

0 评论
最旧
最新 最多投票
内联反馈
查看所有评论

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部
0
希望看到您的想法,请您发表评论x