执行kubectl replace更新LoadBalancer服务时遇重复nodePort错误求助
问题解答:Kubernetes Service Replace 出现 duplicate nodePort 错误
错误原因
这个错误的核心是TCP 30054 端口被重复分配,具体有两种可能场景:
- 你最初创建的80端口Service,Kubernetes自动为其分配了NodePort 30054;当你添加443端口并执行
kubectl replace时,K8s在重新处理Service配置时,尝试给443端口也分配30054(多因资源状态缓存或更新逻辑冲突导致),而同一个Service的两个端口不能共用NodePort,因此触发错误。 - 集群中存在其他Service或资源已经占用了30054这个NodePort,导致新的端口分配请求冲突。
解决方法
方法1:删除旧Service后重新创建
先清理原有Service,再重新部署新配置:
kubectl delete svc feature-branches kubectl apply -f nginx-bot-proxy-loadbalancer.yaml
这种方式会让Kubernetes重新为两个端口自动分配不同的NodePort,彻底避免冲突。
方法2:手动指定不同的NodePort
在Service配置中明确为两个端口分配不同的NodePort(需确保端口在集群NodePort范围内,默认是30000-32767):
apiVersion: v1 kind: Service metadata: name: feature-branches spec: selector: app: nginx-proxy-bot ports: - port: 80 targetPort: 80 nodePort: 30054 - port: 443 targetPort: 443 nodePort: 30055 type: LoadBalancer
之后执行kubectl replace -f nginx-bot-proxy-loadbalancer.yaml即可。
方法3:检查并排除集群内端口占用
先查看当前Service的NodePort分配情况:
kubectl get svc feature-branches
再检查集群内所有Service的NodePort,确认30054是否被其他资源占用:
kubectl get svc --all-namespaces -o jsonpath='{range .items[*]}{.metadata.namespace}/{.metadata.name}{"\t"}{.spec.ports[*].nodePort}{"\n"}' | grep 30054
如果发现其他Service占用了该端口,可调整对应Service的端口,或为当前Service的443端口指定未被占用的NodePort。
内容的提问来源于stack exchange,提问作者Chris Stryczynski
相关产品推荐
相关产品推荐

