报错详情
pod状态显示为NodePorts:
查看pod events:
原因
我的ingress-nginx-controller是daemonset形式部署的,只部署在master节点上。报错是nodeport无法分配,那就先看端口是否有冲突:
发现端口没有被占用。
查看daemonset的yaml,端口使用了主机端口hostport,查看hostport是否被占用:
发现hostport端口80,443,8443都没有被占用。
参考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。
解决
修改daemonset中的hostport,修改为如下的端口:
同时修改ingress-nginx-controller svc的端口:
等待pod重启完成,pod恢复正常,域名访问正常。
再次查看端口情况:
发现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端口,破案了。。。