You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 13:52:41