如何通过Kubernetes Nginx-Ingress实现特定路径反向代理配置?
搞定Nginx Ingress特定路径反向代理到CDN的配置
嘿,我刚好碰到过类似的需求,给你两种靠谱的解决方案,帮你实现/about/*路径转发到CDN、其余路径指向内部服务的需求:
方法一:用ExternalName Service + Rewrite注解(推荐,更符合K8s规范)
因为Ingress的backend只能指向集群内的Service,所以我们先创建一个ExternalName类型的Service来映射外部CDN地址,再配合Ingress的重写注解实现路径转发:
1. 先创建指向CDN的ExternalName Service
apiVersion: v1 kind: Service metadata: name: cdn-service namespace: my-service spec: type: ExternalName externalName: your-cdn-domain.com # 替换成你的CDN实际域名,比如cdn.example.com
2. 修改Ingress配置
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: my-service-web namespace: my-service annotations: kubernetes.io/ingress.class: nginx-ingress # 重写路径:把 /about/xxx 转换成 /xxx 转发给CDN nginx.ingress.kubernetes.io/rewrite-target: /$1 # 添加你需要的代理配置(比如请求头、缓存规则等) nginx.ingress.kubernetes.io/proxy-snippet: | proxy_set_header Host your-cdn-domain.com; proxy_cache_bypass $http_upgrade; # 这里可以加其他proxy配置,比如proxy_connect_timeout等 spec: rules: - host: myservice.com http: paths: # 优先匹配所有 /about/ 开头的子路径 - path: /about/(.*) backend: serviceName: cdn-service servicePort: 443 # CDN用HTTPS填443,HTTP填80 # 其余所有路径转发到内部服务 - path: / backend: serviceName: my-service-web servicePort: 80
方法二:直接用server-snippet定义Location(更灵活)
如果你不想额外创建Service,可以直接在Ingress的server-snippet里写Nginx原生的Location规则,直接代理到CDN:
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: my-service-web namespace: my-service annotations: kubernetes.io/ingress.class: nginx-ingress nginx.ingress.kubernetes.io/server-snippet: | # 精确匹配所有 /about/ 开头的路径 location ~ ^/about/(.*) { proxy_pass https://your-cdn-domain.com/$1$is_args$args; proxy_set_header Host your-cdn-domain.com; proxy_cache_bypass $http_upgrade; # 这里添加你需要的其他代理配置 } spec: rules: - host: myservice.com http: paths: # 兜底匹配所有路径,转发到内部服务 - path: / backend: serviceName: my-service-web servicePort: 80
关键注意点
- 匹配优先级:Nginx Ingress会按Ingress里
paths的定义顺序匹配,所以要把更具体的路径(比如/about/(.*))放在前面;用server-snippet的话,正则Location的优先级高于Ingress生成的前缀Location,所以没问题。 - 参数传递:
$is_args$args用来正确传递URL里的查询参数(比如/about/test?foo=bar会把?foo=bar转发给CDN)。 - HTTPS代理:如果CDN用HTTPS,要确保Ingress Controller所在的节点能访问CDN的443端口,没有网络防火墙限制。
- 配置验证:可以用
kubectl describe ingress my-service-web -n my-service查看Ingress状态,或者进入Ingress Controller的Pod里查看/etc/nginx/nginx.conf,确认生成的Nginx配置符合预期。
内容的提问来源于stack exchange,提问作者highalps
相关产品推荐
相关产品推荐

