CNCFのTechnical Steering Committee (TOC)が、Contourをインキュベーションプロジェクトとして受け入れると発表した。Contourは、Envoy Layer 7 (L7) プロキシをデータプレーンとして使用した、Kubernetes Ingressコントローラだ。
Contourは、外部トラフィックをクラスタ内に受け入れる、Kubernetesクラスタ用のIngressコントローラである。Envoyの"管理サーバ(management server)" — Envoy用語 — として機能することによってEnvoyと連携し、実質上、Envoyプロキシ内でのトラフィックの管理方法を指示するコントロールプレーンの働きをする。ContourはKubernetesのCustom Resource Definition (CRD) として実装されており、通常のKubernetes Ingress仕様よりも高度なルーティング機能を提供する。他の同様なIngressコントローラは、高度なルーティング機能の提供をアノテーションに頼っているのだ。
Contourは2017年、標準的なKubernetes Ingress仕様の制限(PDF)を回避するためにHeptioで開発され、同社が2018年にVMWareに買収された以降はその一部になっていた。ContourはリバースプロキシとロードバランサとしてEnvoyをデプロイし、動的なコンフィギュレーション更新をEnvoyに提供する。
標準的なKubernetes Ingress仕様 — 現在はまだベータ版である — の制限を回避するため、ContourのCRD (Custom Resource Definition)としてIngressRouteが開発され、その後HTTPProxyという別のCRDに引き継がれている。HTTPProxyもまだベータ版だが、バックエンドサービス用のTLSコンフィギュレーション、HTTPヘッダフィルタと操作ポリシ、単一パスを対象とした複数の重み付きアップストリーム、トラフィックモニタ、コンフィギュレーションの可能なロード・バランシングストラテジなどを備えている。HTTPProxyオブジェクトを別のHTTPProxyにインクルードすることが可能で、ネームスペースは同じものにも、違うものにもすることができる。後者の機能は複数チームのIngress管理に対応するためのもので、別々のチームが同じKubernetesクラスタ内で、ネームスペースを使って棲み分けを行うことが可能になる。
Envoyは"ユニバーサルデータプレーン"として設計されていることから、コントロールプレーンサービスを実装可能なプロバイダによって実装されることを意図したAPIセットを提供している。これらのAPIを使えば、Envoyの動的コンフィギュレーションが可能になるのだ。コントロールプレーンでも他と同じように、Envoyのリクエストが通過するフィルタチェーンを設定する。Envoyのコントロールプレーンの開発活動としては、他にAmbassadorやGlooなどがある。
推奨されるデプロイメントトポロジは、DeploymentとしてContourを、セキュアなgRPCコミュニケーションを間に持ったDaemonSetとしてEnvoyを、それぞれデプロイする方法である。Contourはinitコンテナとして"ブートストラップ"モードで動作し、テンポラリボリュームにconfigを書き込む。このボリュームをEnvoyが"ブートストラップコンフィギュレーション"として使用することで、Contourが管理サーバとして機能するようになるのだ。管理サーバはEnvoyのルート決定に対して、gRPCを使って動的コンフィギュレーションをランタイムで提供する。さらにContourは、IngressやHTTPProxy(廃止されたIngressRouiteの後継)、Secret、Service、Endpointといったオブジェクト内の変化を、ShareInformerフレームワークを使って監視する。
プレスリリースの中では、Cloud Native Computing FoundationのCTOであるChris Aniszczyk氏が、"ContourはEnvoyの論理的補足であり、クラウドネイティブなマルチチーム環境での利用を容易にする"ものだ、と記している。
Contourは、KinvolkやReplicated、AdobeのProject Ethos、Kintone、PhishLabsなど、多くの企業やサービスが採用している。本記事執筆時点において、Contourは50リリースを数えている。1.6.1リリースはKubernetes バージョン1.16~1.18をサポートしており、ソースコードはGitHubにホストされている。