使用 Contour 作为 Kubernetes上的 Ingress 控制器
Contour 是 Kubernetes 上的一个 Ingress 控制器(Ingress Controller),使用 Envoy 作为边缘代理(edge proxy)。
Kubernetes 中提供了 Ingress 资源,通常作为外部访问 Kubernetes 中服务的入口。仅有 Ingress 资源的声明是不够的,还需要相应的 Ingress 控制器的支持。
目前已经有非常多的 Ingress 控制器实现,Contour 就是其中的一种。下图列出了大部分可用的 Ingress 控制器。
Contour 使用 Envoy,为 Envoy 提供控制平面 API。
下面以 k3s 作为 Kubernetes 集群来说明 Contour 的用法。
Contour 可以使用 Helm 安装。安装的配置针对 k3s 有所调整。
$ helm install --set envoy.useHostPort=false --set envoy.service.type=NodePort contour bitnami/contour
k3s 自带了 Traefix 作为 Ingress 控制器。在使用 k3d 创建 k3s 集群时,可以选择关闭 Traefix。示例的命令是:
k3d cluster create --k3s-arg "--disable=traefik@server:0"
。
作为测试时使用的是 httpbin 提供的镜像。
最基本的用法是创建 Ingress 资源。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: basic-ingress
spec:
ingressClassName: contour
rules:
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: httpbin
port:
number: 80
属性 ingressClassName
的值 contour
,声明了使用 Contour 作为对应的控制器。
接着以 port-forward 的方式在本地访问 Envoy,可以成功看到 httpbin 的界面,说明 Ingress 工作正常。
Ingress 资源所提供的配置比较有限,Contour提供了自定义资源类型 HTTPProxy
,可以进行更多的配置。
比如,同样的 Ingress 资源,可以用如下的 HTTPProxy
资源来定义。
apiVersion: projectcontour.io/v1
kind: HTTPProxy
metadata:
name: basic-contour
spec:
ingressClassName: contour
virtualhost:
fqdn: www.example.com
routes:
- conditions:
- prefix: /
services:
- name: httpbin
port: 80
在资源定义中,指定了虚拟主机的名称。在访问时,需要指定 HTTP 请求的 Host
头。
$ curl -i -H "Host:www.example.com" localhost:8080
除了基本的定义之外,Contour 的 HTTPProxy
还提供了非常多的配置项,对应不同的功能,包括:
- TLS配置
- 请求路由
- 请求重写
- CORS支持
- Websockets 支持
- 限流
- 客户端认证
- Cookie重写
下面是一个请求重写的示例:
apiVersion: projectcontour.io/v1
kind: HTTPProxy
metadata:
name: rewrite-example
spec:
ingressClassName: contour
virtualhost:
fqdn: httpbin.example.com
routes:
- services:
- name: httpbin
port: 80
conditions:
- prefix: /httpbin
pathRewritePolicy:
replacePrefix:
- prefix: /httpbin
replacement: /
对于路径前缀为 /httpbin
的请求,把前缀重写为 /
。可以使用下面的命令来进行测试。
$ curl -i -H "Host:httpbin.example.com" localhost:8080/httpbin
可以使用 kubectl
来查看 HTTPProxy
资源。
$ kubectl get httpproxy
NAME FQDN TLS SECRET STATUS STATUS DESCRIPTION
rewrite-example httpbin.example.com valid Valid HTTPProxy
basic-contour www.example.com valid Valid HTTPProxy