修改Kubernetes Service targetPort后DNS URL失效,回滚仍未恢复
问题排查与解决:EKS集群Ingress仍指向旧Service端口
问题背景
我们拥有版本为1.24的EKS集群,使用nginx-controller作为Ingress控制器。已部署如下示例应用的Deployment和Service:
apiVersion: apps/v1 kind: Deployment metadata: name: apache-app namespace: default spec: replicas: 2 selector: matchLabels: app: apache-app template: metadata: labels: app: apache-app spec: containers: - name: apache-app image: httpd:latest ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: apache-svc namespace: default labels: spec: ports: - port: 80 targetPort: 80 protocol: TCP selector: app: apache-app
此前服务运行正常,为测试将Service的targetPort修改为9999并执行kubectl apply后,访问URL http://abc.example.com 失败。随后将targetPort改回80,但URL仍无法正常访问。所有Pod均处于运行状态,查看Ingress控制器日志发现,DNS URL仍尝试连接9999端口,而非已回滚的80端口。请问是否需要重启Deployment、Service或ALB?
更新1
- 执行命令:
输出:kubectl get svc apache-svc -o=jsonpath='{.spec.ports}'[{"port":80,"protocol":"TCP","targetPort":80}] - 执行命令:
输出:kubectl get ingNAME CLASS HOSTS ADDRESS PORTS AGE micro-ingress abc.example.com a4bbbe78e1a68478ea345rt567yu7-518c5fa564c5ce6c.elb.us-east-1.amazonaws.com 80 23h
排查与解决步骤
- 无需重启Deployment:所有Pod已处于运行状态,且容器端口始终为80,Deployment本身无配置变更,重启Pod无法解决Ingress的端口缓存问题。
- 无需重启ALB:ALB配置由Ingress控制器同步,问题根源不在ALB本身,而是Ingress控制器的缓存或配置同步延迟。
- 优先触发Ingress控制器配置刷新:
- 重新应用Ingress资源,强制触发nginx-ingress控制器生成新配置:
若未保存Ingress配置文件,可执行kubectl apply -f <你的Ingress配置文件路径>.yamlkubectl edit ing micro-ingress,修改一个无关配置(如添加空注释)后保存,同样能触发更新。 - 滚动重启nginx-ingress控制器Pod,让其重新加载所有Service和Ingress配置:
(默认命名空间通常为kubectl rollout restart deployment nginx-ingress-controller -n <nginx-ingress部署的命名空间>ingress-nginx,请根据实际部署调整)
- 重新应用Ingress资源,强制触发nginx-ingress控制器生成新配置:
- 验证Service端点状态:确认Service已正确关联Pod的80端口:
输出应显示Pod的IP与80端口,确保无异常。kubectl get endpoints apache-svc
原因分析
nginx-ingress控制器会缓存Service的端口配置,当修改targetPort后回滚,控制器可能未自动触发配置刷新,导致仍使用旧端口转发请求。触发Ingress配置重新生成或重启控制器Pod,会使其重新拉取最新Service配置,更新转发规则。
内容的提问来源于stack exchange,提问作者user2315104
相关产品推荐
相关产品推荐

