K8s v1.20.5中通过ingress-nginx访问后端报500错误求助
问题分析与解决
核心问题原因
- Ingress未关联正确控制器:Kubernetes 1.19+版本中,
networking.k8s.io/v1API的Ingress资源必须显式指定ingressClassName字段,否则ingress-nginx控制器不会处理该Ingress规则,导致请求被错误转发到不存在的默认后端。 - 默认后端服务缺失:控制器日志提示找不到
@custom_upstream-default-backend_404,同时kubectl describe ingress显示default-http-backend端点不存在,说明控制器配置的默认后端服务未部署或名称不匹配。
解决步骤
1. 为Ingress添加ingressClassName字段
修改Ingress YAML配置,添加ingressClassName: nginx(ingress-nginx控制器默认class名称为nginx):
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: test-ingress spec: ingressClassName: nginx rules: - host: "test.com" http: paths: - pathType: Prefix path: "/test" backend: service: name: http-svc port: number: 80
应用修改:
kubectl apply -f <你的Ingress配置文件路径>
2. 修复默认后端问题
方案一:为Ingress配置显式默认后端
在Ingress中指定默认后端,避免控制器使用不存在的默认服务:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: test-ingress spec: ingressClassName: nginx defaultBackend: service: name: http-svc port: number: 80 rules: - host: "test.com" http: paths: - pathType: Prefix path: "/test" backend: service: name: http-svc port: number: 80
方案二:修正控制器的默认后端参数
检查ingress-nginx控制器的启动参数,确认默认后端服务配置:
kubectl exec -n ingress-nginx ingress-nginx-controller-69695968f9-7dtxf -- ps aux | grep default-backend
如果参数为--default-backend-service=default/default-http-backend且该服务不存在,修改控制器Deployment,将其指向ingress-nginx命名空间下的默认后端服务:
kubectl edit deployment -n ingress-nginx ingress-nginx-controller
找到args中的--default-backend-service参数,修改为ingress-nginx/ingress-nginx-defaultbackend(默认部署的后端服务名称)。
3. 验证配置
- 检查Ingress是否被控制器正确识别:
kubectl get ingress test-ingress
查看ADDRESS字段是否已填充(hostNetwork模式下通常显示节点IP)。
- 测试访问:确保本地
/etc/hosts中添加test.com指向ingress-nginx控制器所在节点IP,执行:
curl http://test.com/test
应返回hello。
内容的提问来源于stack exchange,提问作者Peter Pan
相关产品推荐
相关产品推荐

