使用 Contour 作为 Kubernetes上的 Ingress 控制器

Contour 是 Kubernetes 上的一个 Ingress 控制器(Ingress Controller),使用 Envoy 作为边缘代理(edge proxy)。

Kubernetes 中提供了 Ingress 资源,通常作为外部访问 Kubernetes 中服务的入口。仅有 Ingress 资源的声明是不够的,还需要相应的 Ingress 控制器的支持。

目前已经有非常多的 Ingress 控制器实现,Contour 就是其中的一种。下图列出了大部分可用的 Ingress 控制器。

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
版权所有 © 2024 灵动代码