contour
Contour是開源的Kubernetes入口控制器,
為Envoy邊緣和服務代理提供控制平面。
Contour支援動態配置更新和多團隊入口委託,同時保持輕量級配置檔案。
特點
內建envoy
Contour是基於Envoy,高效能L7代理和負載均衡器的控制平面
靈活的架構
輪廓可以部署為Kubernetes部署或守護程式集
TLS證書授權
管理員可以安全地委派萬用字元證書訪問
架構原理
Envoy,提供高效能的反向代理。
Contour,充當Envoy的管理伺服器併為其提供配置。
部署
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,但是對於部分功能例如限流,並沒有進行支援,在使用中我們自行實現了這部分功能。
掃描關注我: