上篇文章介绍了 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: 80 virtualhost : 该字段是 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: "/" 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 <