一、应用场景
·网站支持 HTTP 和 HTTPS,例如 http://tencent.com 和 https://tencent.com 需要访问到同一个 Web 服务。
·网站更换过域名,例如 https://tengxun.com 更换为 https://tencent.com,两个域名访问到同一个 Web 服务。
·网站部分内容做过调整,原始 URL 已经无法访问,可以重定向到一个新的提供服务的 URL。
注意:ingress.cloud.tencent.com/rewrite-support: "true"
二、重定向方式
重定向有如下两种方式:
·自动重定向:用户需要先创建出一个 HTTPS:443 监听器,并在其下创建转发规则。通过调用本接口,系统会自动创建出一个 HTTP:80 监听器(如果之前不存在),并在其下创建转发规则,与 HTTPS:443 监听器下的域名等各种配置对应。
·手动重定向:用户手动配置原访问地址和重定向地址,系统自动将原访问地址的请求重定向至对应路径的目的地址。同一域名下可以配置多条路径作为重定向策略,实现 HTTP 和 HTTPS 之间请求的自动跳转。
三、注意事项
·若你没有 TKE Ingress 重定向注解声明,会兼容原有不管理重定向规则的逻辑,即:你可以在负载均衡 CLB 的控制台里面配置重定向规则,TKE Ingress 不处理用户在 CLB 控制台配置的这些重定向规则。
·若你没有 TKE Ingress 重定向注解声明,因为 CLB 的重定向保护限制,如果转发配置 A 重定向到转发配置 B,此时无法直接删除转发配置 B,必须先删掉该重定向规则,才能删除转发配置 B。
·若你使用 TKE Ingress 重定向注解声明,CLB 下所有重定向规则都是由 TKE Ingress 管理,所有重定向规则仅在 TKE Ingress 里面的相关 Annotation 里面生效,此时用户在 CLB 控制台如果修改重定向配置,最终会被 TKE Ingress 里配置的重定向规则覆盖。
·当前基于 CLB 的 TKE Ingress 暂不支持 nginx-ingress 的 rewrite-target功能,无法重写路径。
四、操作步骤
Ingress 支持通过控制台和 YAML 两种方式进行重定向,具体步骤如下:
通过控制台通过 YAML
1. 登录容器服务控制台,选择左侧导航栏中的 集群。
2. 在集群页面,单击目标集群 ID,进入集群基本信息页。
3. 在服务与路由中,选择 Ingress 页签,单击新建。如下:
4. 在新建服务与路由中配置相关重定向规则。配置规则说明如下:
·无:不使用重定向规则。
·手动:会在转发配置下方出现一栏重定向转发配置。
·转发配置里面填写的方式和普通 Ingress 的转发配置一样,后端是某个服务。
·重定向转发配置里面填写的方式和普通 Ingress 的转发配置一样,但后端是某个“转发配置”里的某条路径。
·自动:仅对转发配置里的协议为 “HTTPS” 的路径生效,都将自动生成一个 “HTTP” 的路径,路径完全一样,只有协议不一样。“HTTP” 的路径的转发规则自动重定向到 “HTTPS” 的路径。
五、自动重定向:HTTP 重定向到 HTTPS
注意:仅对 HTTPS 协议的转发规则生效。
在 Ingress YAML 中配置如下注解:
ingress.cloud.tencent.com/rewrite-support: "true" # 表示允许重定向ingress.cloud.tencent.com/auto-rewrite: "true" # 表示自动重定向
配置该注解之后,转发路径中的所有 HTTPS 监听器中存在的七层转发规则都将被对应到 HTTP 监听器中作为重定向规则。域名与路径都保持一致。
六、手动重定向
手动重定向需要增加一个 annotation ,修改一个 annotation:
·增加的 annotation:
ingress.cloud.tencent.com/rewrite-support: "true" # 表示允许重定向
·修改的 annotation:
# 原注解 格式:{ "host": "<domain>", "path": "<path>", "backend": { "serviceName": "<service name>", "servicePort": "<service port>" }}# 新注解格式:{ "host": "<domain>", "path": "<path>", "backend": { "serviceName": "<service name>", "servicePort": "<service port>" }, "rewrite": { "port": "<rewrite-port>", "host": "<rewrite-domain>", "path": "<rewrite-path>" }}
七、示例
某服务之前通过 121.4.25.44/path2 进行访问,在发布新版本之后,期望通过 121.4.25.44/v2/path2 进行访问。可以进行如下修改:
1. 增加一条 annotation:
ingress.cloud.tencent.com/rewrite-support: "true" # 允许重定向
2. 修改原 annotation:
# 将 /v1/path1 替换为 /path1 80端口;把 /v2/path2 替换为 /path2 80端口。注意:host 可以省略kubernetes.io/ingress.http-rules: '[ { "path": "/path1", "backend": { "serviceName": "path1", "servicePort": "80" } }, { "path": "/path2", "backend": { "serviceName": "path2", "servicePort": "80" } }, { "path": "/v1/path1", "rewrite": { "port": 80, "path": "/path1" } }, { "path": "/v2/path2", "rewrite": { "port": 80, "path": "/path2" } }]'
修改后的 YAML:
apiVersion: networking.k8s.io/v1kind: Ingressmetadata: annotations: description: test ingress.cloud.tencent.com/rewrite-support: "true" kubernetes.io/ingress.class: qcloud kubernetes.io/ingress.http-rules: '[{"path":"/path1","backend":{"serviceName":"path1","servicePort":"80"}},{"path":"/path2","backend":{"serviceName":"path2","servicePort":"80"}},{"path":"/v1/path1","rewrite":{"port":80,"path":"/path1"}},{"path":"/v2/path2","rewrite":{"port":80,"path":"/path2"}}]' kubernetes.io/ingress.https-rules: "null" kubernetes.io/ingress.rule-mix: "true" name: test namespace: defaultspec: rules: – http: paths: – backend: service: name: path1 port: number: 80 path: /path1 pathType: ImplementationSpecific – http: paths: – backend: service: name: path2 port: number: 80 path: /path2 pathType: ImplementationSpecificstatus: loadBalancer: ingress: – ip: 121.4.25.44
完整 Ingress Annotation 说明请参见 Ingress Annotation 说明 文档。