基於envoy的分散式閘道器-contour

contour

Contour是開源的Kubernetes入口控制器,

為Envoy邊緣和服務代理提供控制平面。

Contour支援動態配置更新和多團隊入口委託,同時保持輕量級配置檔案。

特點

內建envoy

Contour是基於Envoy,高效能L7代理和負載均衡器的控制平面

靈活的架構

輪廓可以部署為Kubernetes部署或守護程式集

TLS證書授權

管理員可以安全地委派萬用字元證書訪問

架構原理

Envoy,提供高效能的反向代理。

Contour,充當Envoy的管理伺服器併為其提供配置。

基於envoy的分散式閘道器-contour

部署

kubectl apply -f https://projectcontour。io/quickstart/contour。yaml

HTTPProxy

除了支援原生的ingres規則外,因為ingress-nginx 註解很駁雜,不利於使用,

contour還抽象了HTTPProxy概念,

HTTPProxy的主要優勢

安全地支援多團隊Kubernetes叢集,並具有限制哪些名稱空間可以配置虛擬主機和TLS憑據的能力。

允許包括來自另一個HTTPProxy(可能在另一個名稱空間中)的路徑或域的路由配置。

在一條路由中接受多種服務,並在它們之間負載均衡流量。

本機允許定義服務加權和負載平衡策略而無需註釋。

在建立時驗證HTTPProxy物件,併為建立後的有效性進行狀態報告。

如下ingress配置

apiVersion: networking。k8s。io/v1beta1kind: Ingressmetadata: name: basicspec: rules: - host: foo-basic。bar。com http: paths: - backend: serviceName: s1 servicePort: 80

可以用以下httpproxy規則表示

apiVersion: projectcontour。io/v1kind: HTTPProxymetadata: name: basicspec: 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/v1kind: HTTPProxymetadata: name: weight-shifting namespace: defaultspec: virtualhost: fqdn: weights。bar。com routes: - services: - name: s1 port: 80 weight: 10 - name: s2 port: 80 weight: 90

請求和響應頭策略

服務或路由還支援操作標頭。可以按照以下步驟設定標頭或從請求或響應中刪除標頭

apiVersion: projectcontour。io/v1kind: HTTPProxymetadata: name: header-manipulation namespace: defaultspec: 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/v1kind: HTTPProxymetadata: name: traffic-mirror namespace: defaultspec: virtualhost: fqdn: www。example。com routes: - conditions: - prefix: / services: - name: www port: 80 - name: www-mirror port: 80 mirror: true

響應超時

可以將每個路由配置為具有超時策略和重試策略,如下所示:

# httpproxy-response-timeout。yamlapiVersion: projectcontour。io/v1kind: HTTPProxymetadata: name: response-timeout namespace: defaultspec: virtualhost: fqdn: timeout。bar。com routes: - timeoutPolicy: response: 1s idle: 10s retryPolicy: count: 3 perTryTimeout: 150ms services: - name: s1 port: 80

負載均衡策略

支援以下負載均衡演算法

可供選擇的選項:

RoundRobin:按迴圈順序選擇每個正常的上游端點(如果未選擇,則為預設策略)。

WeightedLeastRequest:最少請求策略使用O(1)演算法,該演算法選擇兩個隨機的健康端點,並選擇活動請求較少的端點。注意:此演算法非常簡單,足以進行負載測試。如果需要真正的加權最小請求行為,則不應使用它。

Random:隨機策略選擇隨機的健康端點。

apiVersion: projectcontour。io/v1kind: HTTPProxymetadata: name: lb-strategy namespace: defaultspec: 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。yamlapiVersion: projectcontour。io/v1kind: HTTPProxymetadata: name: httpbin namespace: defaultspec: virtualhost: fqdn: httpbin。davecheney。com routes: - services: - name: httpbin port: 8080 loadBalancerPolicy: strategy: Cookie

還有其他的一些功能,見官方文件

跨叢集流量管理gimbal

透過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,但是對於部分功能例如限流,並沒有進行支援,在使用中我們自行實現了這部分功能。

掃描關注我:

基於envoy的分散式閘道器-contour