Kubernetes Ingress Nginx返回404问题排查(Les Jackson教程场景)
Ingress Nginx 返回404问题排查与修复
配置中存在3个明确问题,直接对应404故障:
- Commands服务Dockerfile入口配置错误
你提供的Commands服务Dockerfile中,启动入口写的是ENTRYPOINT [ "dotnet", "PlatformService.dll" ],Commands服务对应的启动程序集应为CommandsService.dll,当前配置会导致Commands服务容器运行的是PlatformService代码,对应路径请求必然返回404。 - Ingress资源配置不兼容新版控制器
你部署的是v1.3.0版本的Ingress Nginx Controller,旧版kubernetes.io/ingress.class: nginx注解已被废弃,控制器不会接管未指定ingressClassName字段的Ingress规则。同时当前rewrite-target配置直接将所有路径重写到根目录,会丢失接口路径前缀,不符合.NET Core路由匹配逻辑。 - Ingress Controller部署版本不匹配本地环境
你执行的是云服务商场景的部署清单,本地单机集群(Docker Desktop/Minikube等)需要使用裸机(baremetal)版本的部署清单,否则LoadBalancer类型的控制器服务无法正确绑定本地80/443端口,会出现请求未被控制器正确转发的情况。
修复步骤
1. 修复Commands服务镜像
修改Commands服务的Dockerfile入口配置为正确的程序集:
ENTRYPOINT [ "dotnet", "CommandsService.dll" ]
重新构建Commands服务镜像,更新本地镜像缓存或推送至私有镜像仓库后,滚动更新commands-depl部署。
2. 重新部署适配本地环境的Ingress Nginx Controller
先删除之前错误部署的云版本控制器:
kubectl delete namespace ingress-nginx
部署v1.3.0版本的baremetal适配清单(本地环境专用),部署完成后执行端口映射,将本地80端口转发到控制器服务的80端口:
# 端口映射命令,执行后保持窗口运行 kubectl port-forward -n ingress-nginx svc/ingress-nginx-controller 80:80
3. 替换为修正后的Ingress配置
删除原有Ingress资源,应用以下修正后的配置:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ingress-srv annotations: nginx.ingress.kubernetes.io/use-regex: 'true' nginx.ingress.kubernetes.io/rewrite-target: /$2 spec: ingressClassName: nginx rules: - host: acme.com http: paths: - path: /api/platforms(/|$)(.*) pathType: Prefix backend: service: name: platforms-clusterip-srv port: number: 80 - path: /api/c/platforms(/|$)(.*) pathType: Prefix backend: service: name: commands-clusterip-srv port: number: 80
配置说明:
- 新增
ingressClassName: nginx字段替代废弃的注解,确保控制器接管规则 - 路径增加正则捕获组,配合
rewrite-target: /$2将路径前缀后的真实路径转发给后端服务,避免路径被完全重写丢失 - 移除废弃的Ingress类注解
4. 连通性验证
先在集群内部验证两个业务服务的可用性,排除业务本身的问题:
# 临时启动curl容器测试Platforms服务 kubectl run curltest --image=curlimages/curl -it --rm -- curl http://platforms-clusterip-srv/api/platforms # 临时启动curl容器测试Commands服务 kubectl run curltest --image=curlimages/curl -it --rm -- curl http://commands-clusterip-srv/api/c/platforms
两个请求都能正常返回业务数据后,再在本机访问http://acme.com/api/platforms和http://acme.com/api/c/platforms即可正常响应。
补充排查点
- 用
netstat -ano | findstr :80命令确认本地80端口无其他进程占用(除了port-forward进程),排除端口冲突 - 临时关闭系统代理、VPN软件,避免请求被代理拦截导致无法打到本地端口映射
- 若WSL2环境运行集群出现端口转发异常,可先直接访问
http://localhost/api/platforms测试,排除hosts解析问题
内容的提问来源于stack exchange,提问作者Maarten Vissers
相关产品推荐
相关产品推荐

