K8s Ingress更新后/api路径指向错误IP,客户端访问正常如何排查
可能的原因
- Service
server-server的标签选择器与实际运行的服务端Pod标签不匹配,导致Endpoints/EndpointSlice未同步最新的PodIP,仍残留已经销毁的旧PodIP - Nginx Ingress Controller配置缓存未同步,集群更新后Controller未拉取到最新的Endpoints数据,仍使用旧的上游后端地址
- 存在同域名、同路径的冲突Ingress规则,优先级更高的规则将
/api路径转发到了错误的服务 - 集群EndpointSlice同步机制异常,Endpoints数据正确但EndpointSlice未更新,导致依赖EndpointSlice的Ingress Controller拿到错误地址
- Service
server-server的端口配置错误,targetPort与Pod实际监听端口不匹配,导致转发失败(你提到端口转发服务正常,该概率较低)
排查步骤
- 核对Service关联的Endpoints/EndpointSlice数据
执行以下命令查看server-server服务的后端地址是否和实际运行的服务端PodIP一致:
# 查看Endpoints kubectl get endpoints server-server -n badvla # 查看EndpointSlice(K8s 1.21+默认使用该资源做服务发现) kubectl get endpointslice -n badvla -l kubernetes.io/service-name=server-server -o yaml
如果地址不符,执行kubectl describe svc server-server -n badvla查看Selector字段,再执行kubectl get pods -n badvla --show-labels核对服务端Pod的标签是否和Service选择器匹配,修正标签或选择器即可恢复。
- 核对Ingress Nginx实际生成的配置
如果Endpoints数据正确,说明Ingress Controller未同步到最新配置,执行以下命令查看Nginx实际的上游规则:
# 替换为你的Ingress Controller所在命名空间和Pod名 kubectl exec -n ingress-nginx <ingress-controller-pod-name> -- cat /etc/nginx/nginx.conf | grep -A30 '/api'
如果输出中的上游代理地址是错误IP,先重启Ingress Controller Pod触发配置全量刷新:
kubectl rollout restart deployment/ingress-nginx-controller -n ingress-nginx
重启后仍未恢复的话查看Controller日志排查同步错误:
kubectl logs -n ingress-nginx <ingress-controller-pod-name> --since=1h | grep -i error
重点查看是否有kube-apiserver连接失败、Endpoints拉取权限不足类报错。
- 检查是否存在冲突Ingress规则
执行以下命令查看集群中所有绑定了该域名的Ingress资源,确认是否有其他Ingress配置了同域名的/api路径且使用相同的ingress.class:
kubectl get ingress -A -o wide | grep <你的业务域名>
如果有冲突规则,调整路径优先级或者删除无效规则即可。
- 核对Service端口配置
执行kubectl describe svc server-server -n badvla查看Port和TargetPort配置,确认TargetPort和服务端Pod实际监听的4000端口一致,避免端口映射错误。
内容的提问来源于stack exchange,提问作者Kiwi
相关产品推荐
相关产品推荐

