You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

修改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 ing
    
    输出:
    NAME            CLASS    HOSTS               ADDRESS                                                                 PORTS   AGE
    micro-ingress            abc.example.com     a4bbbe78e1a68478ea345rt567yu7-518c5fa564c5ce6c.elb.us-east-1.amazonaws.com   80      23h
    

排查与解决步骤

  1. 无需重启Deployment:所有Pod已处于运行状态,且容器端口始终为80,Deployment本身无配置变更,重启Pod无法解决Ingress的端口缓存问题。
  2. 无需重启ALB:ALB配置由Ingress控制器同步,问题根源不在ALB本身,而是Ingress控制器的缓存或配置同步延迟。
  3. 优先触发Ingress控制器配置刷新:
    • 重新应用Ingress资源,强制触发nginx-ingress控制器生成新配置:
      kubectl apply -f <你的Ingress配置文件路径>.yaml
      
      若未保存Ingress配置文件,可执行kubectl edit ing micro-ingress,修改一个无关配置(如添加空注释)后保存,同样能触发更新。
    • 滚动重启nginx-ingress控制器Pod,让其重新加载所有Service和Ingress配置:
      kubectl rollout restart deployment nginx-ingress-controller -n <nginx-ingress部署的命名空间>
      
      (默认命名空间通常为ingress-nginx,请根据实际部署调整)
  4. 验证Service端点状态:确认Service已正确关联Pod的80端口:
    kubectl get endpoints apache-svc
    
    输出应显示Pod的IP与80端口,确保无异常。

原因分析

nginx-ingress控制器会缓存Service的端口配置,当修改targetPort后回滚,控制器可能未自动触发配置刷新,导致仍使用旧端口转发请求。触发Ingress配置重新生成或重启控制器Pod,会使其重新拉取最新Service配置,更新转发规则。

内容的提问来源于stack exchange,提问作者user2315104

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 18:17:33