Contour是开源的Kubernetes入口控制器,
为Envoy边缘和服务代理提供控制平面.
Contour支持动态配置更新和多团队入口委托,同时保持轻量级配置文件。
Contour是基于Envoy,高性能L7代理和负载均衡器的控制平面
轮廓可以部署为Kubernetes部署或守护程序集
管理员可以安全地委派通配符证书访问
kubectl apply -f https://projectcontour.io/quickstart/contour.yaml
除了支持原生的ingres规则外,因为ingress-nginx 注解很驳杂,不利于使用,
contour还抽象了HTTPProxy概念,
如下ingress配置
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: basic
spec:
rules:
- host: foo-basic.bar.com
http:
paths:
- backend:
serviceName: s1
servicePort: 80
可以用以下httpproxy规则表示
apiVersion: projectcontour.io/v1
kind: HTTPProxy
metadata:
name: basic
spec:
virtualhost:
fqdn: foo-basic.bar.com
routes:
- conditions:
- prefix: /
services:
- name: s1
port: 80
protocol: h2c
如果要支持gprc等http2流量只需要设置 spec.routes[].conditions.services[].protocol
contour支持多上游配置,方便的实现多版本流量控制
apiVersion: projectcontour.io/v1
kind: HTTPProxy
metadata:
name: weight-shifting
namespace: default
spec:
virtualhost:
fqdn: weights.bar.com
routes:
- services:
- name: s1
port: 80
weight: 10
- name: s2
port: 80
weight: 90
服务或路由还支持操作标头。可以按照以下步骤设置标头或从请求或响应中删除标头
apiVersion: projectcontour.io/v1
kind: HTTPProxy
metadata:
name: header-manipulation
namespace: default
spec:
virtualhost:
fqdn: headers.bar.com
routes:
- services:
- name: s1
port: 80
requestHeadersPolicy:
set:
- name: X-Foo
value: bar
remove:
- X-Baz
responseHeadersPolicy:
set:
- name: X-Service-Name
value: s1
remove:
- X-Internal-Secret
每个路由都可以将服务指定为镜像。镜像服务将接收发送到任何非镜像服务的读取流量的副本。镜像流量被视为只读,镜像的任何响应都将被丢弃。
该服务对于记录流量以供以后重播或对新部署进行冒烟测试很有用。
apiVersion: projectcontour.io/v1
kind: HTTPProxy
metadata:
name: traffic-mirror
namespace: default
spec:
virtualhost:
fqdn: www.example.com
routes:
- conditions:
- prefix: /
services:
- name: www
port: 80
- name: www-mirror
port: 80
mirror: true
可以将每个路由配置为具有超时策略和重试策略,如下所示:
# httpproxy-response-timeout.yaml
apiVersion: projectcontour.io/v1
kind: HTTPProxy
metadata:
name: response-timeout
namespace: default
spec:
virtualhost:
fqdn: timeout.bar.com
routes:
- timeoutPolicy:
response: 1s
idle: 10s
retryPolicy:
count: 3
perTryTimeout: 150ms
services:
- name: s1
port: 80
支持以下负载均衡算法
可供选择的选项:
apiVersion: projectcontour.io/v1
kind: HTTPProxy
metadata:
name: lb-strategy
namespace: default
spec:
virtualhost:
fqdn: strategy.bar.com
routes:
- conditions:
- prefix: /
services:
- name: s1-strategy
port: 80
- name: s2-strategy
port: 80
loadBalancerPolicy:
strategy: WeightedLeastRequest
会话亲缘关系(也称为粘性会话)是一种负载平衡策略,通过该策略,
来自单个客户端的一系列请求将始终路由到同一应用程序后端。
Contour支持基于的每个路由的会话相似性loadBalancerPolicy strategy: Cookie
。
# httpproxy-sticky-sessions.yaml
apiVersion: projectcontour.io/v1
kind: HTTPProxy
metadata:
name: httpbin
namespace: default
spec:
virtualhost:
fqdn: httpbin.davecheney.com
routes:
- services:
- name: httpbin
port: 8080
loadBalancerPolicy:
strategy: Cookie
还有其他的一些功能,详见httpproxy说明
通过gimbal可以实现夸集群的流量统一管理,
通过监视单个Kubernetes群集的可用服务和端点并将它们同步到主机Gimbal群集中来实现此目的。 Discoverer将利用Kubernetes API的监视功能来动态接收更改,而不必轮询API。
所有可用的服务和端点都将同步到与源系统匹配的相同名称空间。 发现者将仅负责一次监视单个集群。如果需要监视多个集群,则将需要部署多个发现者。
# Sample secret creation
$ kubectl create secret generic remote-discover-kubecfg --from-file=./config --from-literal=backend-name=nodek8s -n gimbal-discovery
contour 做为envoy的控制平面,可以动态下发各种流量管理策略,其实现的功能都是较为常用的功能保证了envoy的高性能
,可以轻松实现一个分布式gateway,但是对于部分功能例如限流,并没有进行支持,在使用中我们自行实现了这部分功能.
扫描关注我: