上篇文章介绍了 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 <