如何在Kubernetes中实现跨域名URL重定向(含公网转内网)
场景1:公网域名A(https://example.com)重定向到公网域名B(https://sample.com)
在Kubernetes中实现域名重定向,主流方案是通过Ingress控制器搭配中间件/注解完成,以下是两种常用实现方式:
方案1:使用Traefik的RedirectRegex中间件
Traefik原生支持Middleware资源处理重定向逻辑,步骤如下:
- 创建RedirectRegex中间件,匹配域名A的请求并跳转至域名B:
apiVersion: traefik.containo.us/v1alpha1 kind: Middleware metadata: name: redirect-example-to-sample spec: redirectRegex: regex: ^https://example.com/(.*) replacement: https://sample.com/$1 permanent: true # 启用301永久重定向,改为false则为302临时重定向
- 将中间件关联到域名A的IngressRoute:
apiVersion: traefik.containo.us/v1alpha1 kind: IngressRoute metadata: name: example-ingress spec: entryPoints: - websecure routes: - match: Host(`example.com`) kind: Rule middlewares: - name: redirect-example-to-sample services: - name: dummy-service # 只需存在的服务,重定向会优先触发 port: 80 tls: certResolver: default # 配置你的证书解析器,确保HTTPS正常运行
方案2:使用Nginx Ingress注解
Nginx Ingress可通过注解直接配置重定向,无需额外中间件资源:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: example-ingress annotations: nginx.ingress.kubernetes.io/permanent-redirect: "https://sample.com$request_uri" # 若需临时重定向,替换为:nginx.ingress.kubernetes.io/temporary-redirect: "https://sample.com$request_uri" spec: tls: - hosts: - example.com secretName: example-tls # 绑定你的HTTPS证书Secret rules: - host: example.com http: paths: - path: / pathType: Prefix backend: service: name: dummy-service # 只需存在的服务 port: number: 80
场景2:公网域名A重定向至内网域名B
这种场景需注意:内网域名B必须确保请求发起方(用户客户端)能够访问到,如果内网域名仅在Kubernetes集群内部或企业内网可解析,公网用户直接访问会失败。若仅需集群内部流量重定向,或客户端处于可访问内网域名的环境,可按以下方式配置:
方案1:Traefik中间件实现
与场景1逻辑一致,仅修改重定向目标为内网域名:
apiVersion: traefik.containo.us/v1alpha1 kind: Middleware metadata: name: redirect-example-to-internal-sample spec: redirectRegex: regex: ^https://example.com/(.*) replacement: https://internal.sample.com/$1 permanent: true
随后将该中间件关联到域名A的IngressRoute即可,配置同场景1,仅需替换中间件名称。
方案2:Nginx Ingress注解实现
直接修改重定向目标为内网域名:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: example-internal-ingress annotations: nginx.ingress.kubernetes.io/permanent-redirect: "https://internal.sample.com$request_uri" spec: tls: - hosts: - example.com secretName: example-tls rules: - host: example.com http: paths: - path: / pathType: Prefix backend: service: name: dummy-service port: number: 80
补充说明
如果内网域名B仅能被Kubernetes集群内部访问,公网用户无法直接访问,此时URL重定向无法满足需求,需要改为反向代理(将请求转发至内网服务,而非让客户端跳转)。以Nginx Ingress为例,配置如下:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: example-proxy-to-internal annotations: nginx.ingress.kubernetes.io/rewrite-target: /$1 spec: tls: - hosts: - example.com secretName: example-tls rules: - host: example.com http: paths: - path: /(.*) pathType: Prefix backend: service: name: internal-sample-service # 若内网域名对应集群内Service,可直接指向该Service port: number: 443
内容的提问来源于stack exchange,提问作者kishore pv
相关产品推荐
相关产品推荐

