GKE负载均衡器未重写URL致非根应用404,如何配置URL重写?
解决GKE GCE Ingress的URL路径重写问题
核心问题分析
你的场景是GKE集群中,通过GCE内部Ingress将/doc路径转发到静态文档应用,但应用收到的请求仍带有/doc前缀,导致Nginx去查找/usr/share/nginx/html/doc/index.html,而实际静态文件都放在/usr/share/nginx/html/根目录,因此返回404。直接修改GCP HTTP负载均衡器的routeAction.urlRewrite会被GKE Ingress控制器(GLBC)覆盖,必须通过Ingress配置实现重写。
可行方案
方案1:使用GKE专属FrontendConfig实现重写
GCE Ingress控制器不兼容通用的rewrite-target注解,需使用GKE提供的FrontendConfig资源配置URL重写:
- 给Ingress添加关联FrontendConfig的注解:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: # 新增此注解关联重写配置 networking.gke.io/v1beta1.FrontendConfig: "doc-rewrite-config" # 保留原其他注解... kubernetes.io/ingress.class: gce-internal kubernetes.io/ingress.regional-static-ip-name: myapp-internal-load-balancer # 保留原其他metadata内容... spec: # 保留原spec内容...
- 创建对应的
FrontendConfig资源,定义路径重写规则:
apiVersion: networking.gke.io/v1beta1 kind: FrontendConfig metadata: name: doc-rewrite-config spec: urlRewrite: pathPrefixRewrite: "/" pathRedirect: "/"
部署后,GLBC会自动将该规则同步到GCP HTTP负载均衡器的URL映射中,实现/doc路径请求转发到应用时重写为/。
方案2:应用侧Nginx配置适配(备选)
如果无法使用FrontendConfig,可通过修改Nginx配置实现路径重写:
- 为文档应用创建Nginx配置文件
default.conf:
server { listen 80; server_name localhost; location /doc { rewrite ^/doc(/.*)$ $1 break; root /usr/share/nginx/html; index index.html; } location / { root /usr/share/nginx/html; index index.html; } }
- 修改文档应用的Dockerfile,注入该配置:
FROM blabla.artifactory.mycompany.net/nginx:latest COPY ./doc/html/ /usr/share/nginx/html/ COPY ./default.conf /etc/nginx/conf.d/default.conf
重新构建镜像并部署后,Nginx会自动将/doc开头的请求路径重写为根路径,匹配静态文件的实际存储位置。
关键说明
你之前使用的ingress.kubernetes.io/rewrite-target是NGINX Ingress Controller的专属注解,而你使用的是gce-internal类型Ingress,由GLBC管理,不兼容该注解,这是旧配置无效的核心原因。
内容的提问来源于stack exchange,提问作者Vulpo
相关产品推荐
相关产品推荐

