Contour 是heptio公司开发的,这是一家做 kubernetes 解决方案的公司,Making it easy to use Envoy as a Kubernetes load balancer介绍了 Contour 的诞生过程,从介绍中可以感受到 Contour 就是单纯的要用 envoy 替代 nginx ,提供一个基于 envoy 的 ingress:
Example-workload/ingressroute是 Contour 的使用示例。
yaml 文件不复杂,就是定义 CRD、创建 Deployment、设置 RBAC 等,镜像在 gcr.io 上需要翻Q:
$ ./kubectl.sh apply -f https://j.hept.io/contour-deployment-rbac
Contour 部署在名为 heptio-contour 的 namespace 中:
$ ./kubectl.sh -n heptio-contour get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
contour NodePort 172.16.9.36 <none> 80:30587/TCP,443:30961/TCP 114s
为了便于查看 envoy 的配置,将 envoy 的admin-adress设置为0.0.0.0,并暴露 9001 端口:
initContainers:
- args:
- bootstrap
- --admin-address=0.0.0.0
- /config/contour.json
...省略...
containers:
- envoy
image: docker.io/envoyproxy/envoy:v1.10.0
...
ports:
- containerPort: 9001
name: admin
protocol: TCP
...
在svc中添加9001端口:
apiVersion: v1
kind: Service
metadata:
name: contour
...
spec:
ports:
- port: 9001
name: admin
protocol: TCP
targetPort: 9001
...
然后就可以通过9001查看envoy的状态:
$ ./kubectl.sh -n heptio-contour get svc -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
contour NodePort 172.16.9.36 <none> 80:30587/TCP,443:30961/TCP,9001:32051/TCP 22h app=contour
创建一个IngressRoute,IngressRoute的用法和Ingress类似,只不过功能更多:
apiVersion: contour.heptio.com/v1beta1
kind: IngressRoute
metadata:
name: contour-echo-demo
spec:
virtualhost:
fqdn: echo.com
routes:
- match: /
services:
- name: echo
port: 80
通过contour访问:
$ curl -H "Host:echo.com" 10.10.64.58:30587
Hostname: echo-7df87d5c6d-s4vhq
Pod Information:
-no pod information available-
......
envoy中route的EDS是指向contour:
contour向envoy下发的是pod的ip:
从 Contour Servie的代码注释可以知道,service 是 endpoints 的名称:
// Service defines an upstream to proxy traffic to
type Service struct {
// Name is the name of Kubernetes service to proxy traffic.
// Names defined here will be used to look up corresponding endpoints which contain the ips to route.
Name string `json:"name"`
// Port (defined as Integer) to proxy traffic to since a service can have multiple defined
代理到集群外部,要创建一个包含外部服务 IP 的 endpoints,然后在 IngressRoute 中指向它。
Contour 的 IngressRoute Delegation 比较有特色,定义了 IngressRoute 的级联关系:一个 IngressRoute 可以指向另一个 IngressRoute(支持跨 namespace ),上层 IngressRoute 的配置被下层继承。
IngressRoute Delegation 的典型用法是,在最上层的 IngressRoute 中配置域名等通用信息,在下层 IngressRoute 中只配置各自的路径相关信息,无需重复设置通用信息。
用 IngressRoute Delegation 实现蓝绿部署非常方便!只需要在上层 IngressRoute 中稍作修改,切换到另一个下级 IngressRoute,例如:
apiVersion: contour.heptio.com/v1beta1
kind: IngressRoute
metadata:
name: blue-green-root
namespace: default
spec:
virtualhost:
fqdn: blue-green.bar.com
routes:
- match: /
delegate:
name: blue # Changing this to `green` will immediately switch to the other ingressroute object
# This can be helpful for testing different ingressroute configs
# or for improved UX doing blue/green application deployments
Contour 是一个很简练的项目,它的定位是 kubernetes 的一个附加组件,专注发挥 envoy 自身的功能,没有繁杂花哨的设计。