Nginx Ingress配置报configuration-snippet含无效proxy_pass且关准入后404如何处理
Nginx Ingress 404 问题排查解决步骤
根因说明
你遇到的准入webhook报错是因为新版ingress-nginx(v0.49及以上)默认开启了annotation安全校验,proxy_pass属于默认拦截的敏感关键字。你直接关闭准入webhook的操作会跳过配置合法性校验,导致Ingress生成的Nginx配置规则异常,最终触发404响应。
排查&解决步骤
- 修复Ingress规则冲突
你当前配置中同一路径/同时绑定了服务的80和443两个端口,会导致Nginx location规则匹配优先级混乱,直接删除443端口对应的path配置即可,Ingress本身会负责TLS卸载,后端服务走HTTP 80端口即可完成转发。 - 修正annotation配置,不要直接关闭准入webhook
直接关闭准入webhook会带来安全风险,同时会导致非法配置无法被提前拦截,你有两种方案解决之前的snippet校验报错:
方案1:安装ingress-nginx时放行snippet注解权限,修改helm安装参数如下:
方案2:替换configuration-snippet为原生annotation实现相同能力,完全不需要自定义snippet:helm install nginx-ingress ingress-nginx/ingress-nginx \ --namespace ingress \ --set controller.replicaCount=2 \ --set controller.nodeSelector."beta\.kubernetes\.io/os"=linux \ --set defaultBackend.nodeSelector."beta\.kubernetes\.io/os"=linux \ --set controller.allowSnippetAnnotations=true \ --set controller.config.annotation-value-word-blocklist=""
把原来的nginx.ingress.kubernetes.io/configuration-snippet注解替换为以下配置即可实现Authorization头透传:nginx.ingress.kubernetes.io/proxy-set-header: Authorization $http_authorization - 验证Ingress资源状态
执行kubectl describe ingress blabla-data-api-ingress -n <你的服务命名空间>,查看Events字段是否有配置加载报错,同时执行kubectl get ingress确认ADDRESS字段已经正常分配Ingress控制器的IP。 - 查看Ingress控制器日志
执行kubectl logs -n ingress <nginx-ingress-controller-pod名称>,查看请求的路由匹配日志,确认你访问的域名、路径能匹配到当前的Ingress规则。 - 验证后端服务可用性
执行kubectl port-forward svc/blabla-data-api 8080:80 -n <你的服务命名空间>,本地访问127.0.0.1:8080确认后端服务本身可以正常响应,排除服务自身故障。 - 校验TLS配置
如果你是HTTPS访问返回404,执行kubectl get secret blabla-data-api-certification-staging -n <你的服务命名空间>确认证书已正常签发,访问的域名和Ingress配置的host完全一致。
内容的提问来源于stack exchange,提问作者soling
相关产品推荐
相关产品推荐

