如何配置Nginx Ingress转发到本地TCP服务解决503访问报错
问题根因
你当前的场景是将K8s的Nginx Ingress转发到集群节点本地通过docker-compose运行的3000端口服务,返回503的核心原因有两个:
- 你创建的Service默认需要通过selector匹配集群内的Pod作为后端,而你的服务跑在K8s集群调度的Pod之外,没有对应匹配的Pod,Service不存在可用后端端点
- 你的Ingress资源部署在
ingress-basic命名空间,但你提供的Service配置没有指定命名空间,默认会创建在default命名空间,Ingress找不到对应Service资源
解决步骤
1. 调整docker-compose服务监听范围
修改docker-compose配置中的端口映射规则,将仅监听本地回环的127.0.0.1:3000:3000改为监听所有网卡:
services: 你的服务名称: ports: - "3000:3000" # 等价于0.0.0.0:3000:3000
修改后重启docker-compose服务,执行curl 节点内网IP:3000验证可以正常访问。
2. 重新部署同命名空间的无选择器Service
创建不带selector的Service,不需要匹配集群内Pod,后续手动绑定后端地址:
apiVersion: v1 kind: Service metadata: name: e-frontend-saleor namespace: ingress-basic # 必须与Ingress同命名空间 spec: ports: - protocol: TCP port: 80 targetPort: 3000
3. 创建Endpoint绑定本地服务地址
创建同名Endpoint资源,将服务后端指向运行docker-compose的节点内网IP+3000端口:
apiVersion: v1 kind: Endpoints metadata: name: e-frontend-saleor namespace: ingress-basic subsets: - addresses: - ip: 替换为跑docker-compose服务的K8s节点内网IP,不可填127.0.0.1 ports: - port: 3000
验证与排查
- 执行
kubectl get endpoints e-frontend-saleor -n ingress-basic确认端点已正常绑定 - 进入Nginx Ingress Controller的Pod内部,执行
curl <节点内网IP>:3000确认网络连通,无防火墙拦截 - 等待1分钟左右访问域名验证是否正常返回内容
内容的提问来源于stack exchange,提问作者inyourmind
相关产品推荐
相关产品推荐

