Kubernetesでマルチクラスタネットワークを実現する方法について簡単に調査した。鋭意更新中。
skupper
- SSL
- ハブ&スポーク/フルメッシュ
- VAN
- Skupper - Multicloud communication
Submariner
- Gateway node間ではったIPsecを経由したクラスタ間通信を実現
- Flattenなセグメント設計(クラスタ間でのIP被りNG)だが、Globalnetオプションを有効にすると被りが許容される
- フルメッシュ
- 2021/01/28現在 hub and spokeについても議論がされている模様
- Add support for finer-grained cluster connectivity options · Issue #533 · submariner-io/submariner · GitHub
- 参考
Istio
Istioはリモートクラスタに対する名前解決・通信の制御を提供してくれるが、リモートクラスタに対するunderlay network(VPNやSSL-VPN)は実現してくれないのでそこは他の方法でカバーする必要がある。
IstioとSubmarinerを併用したケースはググっても発見できなかった。お互いに通信をねじ曲げようとするので、どのように連携させればいいのか?が不明。
複数のコントロールプレーントポロジ
Pod NW/Cluster NWのIPバッティング可能。
Istio Gatewayがreachabilityのあるendpointを有することで、mTLS経由で通信を行うことが可能。(Istio sidecarがねじ曲げてくれる)
ただしIstio controle planeは各クラスタに独立して存在するので、ユーザはService ObjectとIstio Configration ObjectをReplicateすることが求められる。
またお互いのクラスタは共通のRootCAを使うこと。
単一のコントロールプレーントポロジ
VPN接続を備えた単一のコントロールプレーン
IstioではVPN機能は提供されないのでユーザで個別に各クラスタでVPN接続を行う必要がある。(もし全てのクラスタ間で接続する場合はDMVPNをつかったDynamicなVPNができないと、必然的にフルメッシュな構成になりそう)
クラスタを跨いだセグメントが作成され(/16)、各クラスタごとに異なるPod NWが必要となる。(Cluster CIDRも被り不可)
単一のIstio コントロールプレーンが1つのクラスタにデプロイされることになり、ほかのクラスタのAPIサーバに対して命令を飛ばす。
単一のクラスタがSPOFとなる。
VPN接続のない単一のコントロールプレーン
Istio Pilotのロケーション認識サービスルーティング機能(別名スプリットホライズンEDS)を使うことでVPNなしで構成することが可能。
通信としてはリモートクラスタ宛のトラフィックを、リモートのIstio Gatewayに送信し対象のpodやserviceに届ける。
そのためIstio Gatewayに対するreachabilityは何らかの方法で確立しておく必要がある。(VPNが使えない状況ということは、AWSにおけるVPC PeeringやDirect Connectのような別手段での回線接続が必要)
また すべてのクラスターからKubernetesAPIサーバーに接続する必要がある
こちらのサイトにて詳しい比較をしている * マルチクラスタにすべきか、そうではないか - サービスメッシュを使ったクラスタ間通信
そのほか
- Kubernetes multi-cluster networking made simple | by Nicolas Leiva | ITNEXT
- IPv6使えばNW構成シンプルになるよ