Kubernetes集群中Nginx Ingress路径重写无法转发至指定端点
解决Nginx Ingress路径重写404问题
首先要确认你的Nginx Ingress Controller版本,不同版本的重写规则语法差异很大,这是导致404的核心原因。
情况1:Nginx Ingress Controller版本 >= 0.22.0
这个版本起采用了新的重写语法,需要用$captured_groups匹配路径捕获组,同时路径需配置正则分组:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: image-self-service-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: /$1 spec: rules: - host: url-to-site http: paths: - path: /profile(/|$)(.*) pathType: Prefix backend: service: name: image-self-service port: number: 8080
- 路径
/profile(/|$)(.*)会匹配/profile、/profile/及/profile/xxx所有相关请求 rewrite-target: /$1会将请求重写到后端根路径/,因为第一个捕获组(/|$)最终拼接后就是根路径
情况2:Nginx Ingress Controller版本 < 0.22.0
旧版本使用传统正则分组引用,用$1、$2对应捕获组内容:
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: image-self-service-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: /$2 spec: rules: - host: url-to-site http: paths: - path: /profile(/|$)(.*) backend: serviceName: image-self-service servicePort: 8080
- 路径
/profile(/|$)(.*)的第二个捕获组(.*)为空时,/+$2就对应后端根路径 - 若有后续子路径,也能自动重写到后端的对应路径
验证步骤
- 检查Ingress部署状态:执行
kubectl get ingress确认状态为READY - 查看Ingress Controller日志:执行
kubectl logs -n <ingress命名空间> <ingress-pod名称>,核对请求路由和重写逻辑是否符合预期 - 验证后端服务连通性:执行
kubectl run -it --rm --image=curlimages/curl curl-test -- curl image-self-service:8080,确认服务本身能正常返回内容
内容的提问来源于stack exchange,提问作者SirHawrk
相关产品推荐
相关产品推荐

