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

Kubernetes反向代理:同子域名路由至外部集群应用的问题

可行解决方案

核心思路

问题根源在于ExternalService是四层转发机制,无法修改HTTP请求/响应头,导致外部服务返回的重定向会指向自身域名。需要借助Ingress控制器的七层反向代理能力,修改请求Host头并替换响应中的重定向地址,从而保持原域名web.omer.com不变。


方案1:基于NGINX Ingress Controller(最常用)

无需依赖ExternalService,直接通过Ingress注解+配套Service/Endpoint实现反向代理:

步骤1:创建指向外部服务的Service和Endpoint

# 外部服务的ClusterIP Service(Ingress需要后端Service关联)
apiVersion: v1
kind: Service
metadata:
  name: external-signup-svc
spec:
  type: ClusterIP
  ports:
  - port: 443
    targetPort: 443
    protocol: TCP
---
# 关联外部服务的Endpoint(替换为omer.webflow.com的实际IP,可通过nslookup获取)
apiVersion: v1
kind: Endpoints
metadata:
  name: external-signup-svc
subsets:
- addresses:
  - ip: 192.0.2.1 # 示例IP,请替换为真实IP
  ports:
  - port: 443
    protocol: TCP

步骤2:配置Ingress规则及关键注解

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: web-ingress
  annotations:
    nginx.ingress.kubernetes.io/proxy-set-header: "Host web.omer.com"
    nginx.ingress.kubernetes.io/proxy-redirect-from: "https://omer.webflow.com"
    nginx.ingress.kubernetes.io/proxy-redirect-to: "https://web.omer.com"
    nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
  ingressClassName: nginx
  rules:
  - host: web.omer.com
    http:
      paths:
      # 路由到K8s内部Pod
      - path: /dashboard(/|$)(.*)
        pathType: ImplementationSpecific
        backend:
          service:
            name: k8s-dashboard-svc # 替换为你的内部服务名
            port:
              number: 80
      # 路由到外部服务
      - path: /sign-up(/|$)(.*)
        pathType: ImplementationSpecific
        backend:
          service:
            name: external-signup-svc
            port:
              number: 443

注解说明:

  • proxy-set-header: Host web.omer.com:强制外部服务收到的Host头为原域名,避免其返回自身域名的重定向
  • proxy-redirect-from/to:自动替换外部服务响应中的重定向地址,确保用户始终看到web.omer.com
  • rewrite-target:处理路径重写,确保外部服务收到正确的请求路径

方案2:自定义NGINX配置片段(更灵活)

如果上述注解无法满足需求,可直接插入原生NGINX配置,跳过Service层直接反向代理:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: web-ingress
  annotations:
    nginx.ingress.kubernetes.io/server-snippet: |
      location /sign-up {
        proxy_pass https://omer.webflow.com;
        proxy_set_header Host web.omer.com;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_redirect https://omer.webflow.com/ https://web.omer.com/;
        proxy_redirect http://omer.webflow.com/ https://web.omer.com/;
      }
spec:
  ingressClassName: nginx
  rules:
  - host: web.omer.com
    http:
      paths:
      - path: /dashboard
        pathType: ImplementationSpecific
        backend:
          service:
            name: k8s-dashboard-svc
            port:
              number: 80

方案3:基于Traefik Ingress Controller

若集群使用Traefik,配置更简洁:

apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: web-ingress
spec:
  entryPoints:
    - websecure
  routes:
    # 内部Pod路由
    - match: Host(`web.omer.com`) && PathPrefix(`/dashboard`)
      kind: Rule
      services:
        - name: k8s-dashboard-svc
          port: 80
    # 外部服务路由
    - match: Host(`web.omer.com`) && PathPrefix(`/sign-up`)
      kind: Rule
      services:
        - name: external-signup-svc
          port: 443
          serverName: omer.webflow.com # 指定后端SNI
---
# 外部服务的ExternalName Service
apiVersion: v1
kind: Service
metadata:
  name: external-signup-svc
spec:
  type: ExternalName
  externalName: omer.webflow.com
  ports:
  - port: 443

关键注意事项

  • 确认外部服务omer.webflow.com允许Kubernetes集群Ingress控制器的IP访问,无白名单限制
  • 若外部服务为HTTPS,需确保Ingress控制器能验证后端证书;若为自签名证书,需导入CA证书到Ingress控制器(生产环境不建议跳过验证)
  • 测试时可通过curl -v https://web.omer.com/sign-up检查重定向地址是否正确

内容的提问来源于stack exchange,提问作者Omer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 10:23:10