Deployment 设了 3 个副本,其中两个被调度到同一台节点,后启动的 Pod 一直 ContainerCreating,describe 里写 failed to create endpoint,端口已被占用。

把日志和配置对完,能解释这个现象的基本就这几处。hostPort 会占用节点上的真实端口,同一节点只能有一个 Pod 用;没有配 podAntiAffinity,调度器不知道要分散;用了 hostNetwork,端口冲突更直接;Service 的 targetPort 和 hostPort 写重了。

第一件事是确认 Pod 是否用了 hostPort

kubectl get pod -o custom-columns=NAME:.metadata.name,HOSTPORT:.spec.containers[*].ports[*].hostPort

再往下按节点看端口被谁占了

ss -lntp | grep 9100

接着加上反亲和让副本分散

kubectl get deploy app -o yaml | grep -A8 affinity

滚动更新后确认每个节点只跑一个

kubectl get pod -o wide -l app=app

那几天正好在做别的变更,先把时间线对齐才敢动手。

排查用的命令都是临时敲的,没有写成脚本,事后才整理。

恢复的判定其实很直接。三个副本分布在不同节点上,每个 Pod 都进入 Running,节点上 9100 端口只有一处监听,Service 访问正常。

补一句。能用 Service 暴露就别用 hostPort,端口冲突在扩缩容时必然出现;确实要绑宿主端口就配 requiredDuringScheduling 的反亲和。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。

作者 9823189