Kubernetes中配置host的ingress-2无法访问而ingress-1正常问题排查
问题根因
你遇到的404报错是Ingress路径转发时未做重写,后端服务不存在对应请求路径导致的,具体逻辑如下:
- Ingress规则默认会将完整的请求路径原封不动转发给后端服务,你访问
myapp.com/nginx时,后端nginx服务收到的请求路径是/nginx,而你部署的官方默认nginx、httpd镜像的站点根目录下没有/nginx、/httpd的对应路径,因此返回404。 - 你之前使用
ingress-1时正常,是因为ingress-1为无host匹配的默认Ingress规则,你大概率为该规则配置了nginx.ingress.kubernetes.io/rewrite-target: /的路径重写注解,你贴出的ingress-1配置未完整展示注解部分;当你切换到ingress-2时未同步配置该注解,因此触发404。
修复方案
给ingress-2加上nginx ingress controller的路径重写注解即可,修改后的完整配置参考:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ingress-2 annotations: # 重写规则:把/nginx、/httpd开头的路径重写到根路径/转发给后端 nginx.ingress.kubernetes.io/rewrite-target: / spec: rules: - host: "myapp.com" http: paths: - pathType: Prefix path: "/nginx" backend: service: name: nginx-svc port: number: 80 - pathType: Prefix path: "/httpd" backend: service: name: httpd-svc port: number: 80
如果需要支持/nginx/xxx转发到后端/xxx的场景,改用如下重写规则即可:
annotations: nginx.ingress.kubernetes.io/rewrite-target: /$2 spec: rules: - host: "myapp.com" http: paths: - pathType: Prefix path: "/nginx(/|$)(.*)" backend: service: name: nginx-svc port: number: 80 # httpd路径配置同理
验证方法
配置更新后,你可以直接进入后端nginx pod执行curl 127.0.0.1/nginx验证,原生默认镜像会直接返回404,说明路径问题和Ingress路由匹配无关,Ingress已经将请求正确转发到了后端服务。
内容的提问来源于stack exchange,提问作者monk
相关产品推荐
相关产品推荐

