上篇文章介绍了 Contour 分布式架构的工作原理,顺便简单介绍了下 IngressRoute 的使用方式。本文将探讨 IngressRoute 更高级的用法,其中级联功能是重点。
1. IngressRoute 大入门上篇文章在 examples/example-workload 目录下创建了一个示例应用,我们来回顾一下它的 IngressRoute 配置:
apiVersion: contour.heptio.com/v1beta1 kind: IngressRoute metadata: labels: app: kuard name: kuard namespace: default spec: virtualhost: fqdn: kuard.local routes: - match: / services: - name: kuard port: 80virtualhost : 该字段是 root IngressRoute,表示此域的顶级入口点。
fqdn : 该字段指定了完整的域名,可以通过在 HTTP 请求头中指定 Host: 字段来访问该服务。
这是最简单是使用方法,看起来没什么特别的,我们来稍作修改一下:
apiVersion: contour.heptio.com/v1beta1 kind: IngressRoute metadata: labels: app: kuard name: kuard namespace: default spec: virtualhost: fqdn: kuard.local routes: - match: /test services: - name: kuard port: 80将 match: / 改为 match: /test,然后重新应用新规则。这时如果你访问 url kuard.local/test 是不通的,因为 kuard 服务本身并没有 /test 这个路径,我们可以强制将路径重写为 /:
apiVersion: contour.heptio.com/v1beta1 kind: IngressRoute metadata: labels: app: kuard name: kuard namespace: default spec: virtualhost: fqdn: kuard.local routes: - match: /test prefixRewrite: "http://www.likecs.com/" services: - name: kuard port: 80重新 apply 之后,再次访问 url kuard.local/test 就通了。
这里可以和标准的 ingress 对象对比一下,IngressRoute 的优势在于它可以分别对每个路由设置 rewrite 规则,而 Nginx Ingress Controller 只能设置全局的 rewrite 规则,因为它用的是 annotations。虽然可以通过其他手段来实现,但相对来说会比较麻烦。
2. 级联功能介绍下面我们来看看 IngressRoute 的级联功能,这是个非常有特色的功能,你可以通过级联多个路由规则,上层 IngressRoute 的配置被下层继承。例如,我们可以将 url 路径 / 的路由规则级联到其他的 IngressRoute 中,其他的 IngressRoute 可以来自不同的 namespace。
举个例子,我们可以先创建一个这样的 IngressRoute:
$ cat > delegate-from-main.yaml <<EOF apiVersion: contour.heptio.com/v1beta1 kind: IngressRoute metadata: name: delegate-from-main spec: routes: - match: / services: - name: kuard port: 80 EOF $ kubectl apply -f delegate-from-main.yaml $ kubectl get ingressroute delegate-from-main -o jsonpath='{.status.currentStatus}' orphaned该 IngressRoute 的状态为 orphaned,因为它没有包含一个合法的 fqdn。接下来需要创建一个 root IngressRoute 来和它进行级联:
apiVersion: contour.heptio.com/v1beta1 kind: IngressRoute metadata: labels: app: kuard name: kuard namespace: default spec: virtualhost: fqdn: kuard.local routes: - match: / delegate: name: delegate-from-main namespace: default这时如果再检查 IngressRoute delegate-from-main 的状态,就会发现它从 orphaned 状态变成了 valid 状态,kuard.local 也能够顺利访问。
了解了级联功能的用法之后,下面就来看看它的应用场景。
场景一:可以使用级联功能来做蓝绿部署和灰度发布,只需要在上层 IngressRoute 中稍作修改,切换到另一个下层 IngressRoute,就可以切换流量的处理规则。
场景二:管理员可以利用级联功能将部分 ingress 的权限放行到其他的 namespace 中,在这些 namespace 中,用户可以自由更新与 root IngressRoute 级联的相关的 IngressRoute。例如,如果管理员想防止其他用户配置非法的域名或路径,可以将该部分的配置权限放到 root IngressRoute 中,其他 namespace 中的下层 IngressRoute 中只能配置各自的路径相关信息。
接下来主要探讨场景一。
3. 蓝绿部署蓝绿部署简单来讲就是在生产环境中有两套系统:一套是正在提供服务的系统,标记为“绿色”;另一套是准备发布的系统,标记为“蓝色”。两套系统都是功能完善的,并且正在运行的系统,只是系统版本和对外服务情况不同。
最初,没有任何系统,没有蓝绿之分。
然后,第一套系统开发完成,直接上线,这个过程只有一个系统,也没有蓝绿之分。
后来,开发了新版本,要用新版本替换线上的旧版本,在线上的系统之外,搭建了一个使用新版本代码的全新系统。 这时候,一共有两套系统在运行,正在对外提供服务的老系统是绿色系统,新部署的系统是蓝色系统。
蓝色系统不对外提供服务,用来做啥?