フラミナル

考え方や調べたことを書き殴ります。IT技術系記事多め

Kubernetesでマルチクラスタネットワークを実現する方法

Kubernetesでマルチクラスタネットワークを実現する方法について簡単に調査した。鋭意更新中。

skupper

f:id:lirlia:20210128015045p:plain

Submariner

Istio

Istioはリモートクラスタに対する名前解決・通信の制御を提供してくれるが、リモートクラスタに対するunderlay network(VPNやSSL-VPN)は実現してくれないのでそこは他の方法でカバーする必要がある。

IstioとSubmarinerを併用したケースはググっても発見できなかった。お互いに通信をねじ曲げようとするので、どのように連携させればいいのか?が不明。

複数のコントロールプレーントポロジ

f:id:lirlia:20210128005056p:plain

Pod NW/Cluster NWのIPバッティング可能。

Istio Gatewayがreachabilityのあるendpointを有することで、mTLS経由で通信を行うことが可能。(Istio sidecarがねじ曲げてくれる)

ただしIstio controle planeは各クラスタに独立して存在するので、ユーザはService ObjectとIstio Configration ObjectをReplicateすることが求められる。

またお互いのクラスタは共通のRootCAを使うこと。

単一のコントロールプレーントポロジ

VPN接続を備えた単一のコントロールプレーン

f:id:lirlia:20210128005411p:plain

IstioではVPN機能は提供されないのでユーザで個別に各クラスタでVPN接続を行う必要がある。(もし全てのクラスタ間で接続する場合はDMVPNをつかったDynamicなVPNができないと、必然的にフルメッシュな構成になりそう)

クラスタを跨いだセグメントが作成され(/16)、各クラスタごとに異なるPod NWが必要となる。(Cluster CIDRも被り不可)

単一のIstio コントロールプレーンが1つのクラスタにデプロイされることになり、ほかのクラスタのAPIサーバに対して命令を飛ばす。

単一のクラスタがSPOFとなる。

VPN接続のない単一のコントロールプレーン

f:id:lirlia:20210128011233p:plain

Istio Pilotのロケーション認識サービスルーティング機能(別名スプリットホライズンEDS)を使うことでVPNなしで構成することが可能。

通信としてはリモートクラスタ宛のトラフィックを、リモートのIstio Gatewayに送信し対象のpodやserviceに届ける。

そのためIstio Gatewayに対するreachabilityは何らかの方法で確立しておく必要がある。(VPNが使えない状況ということは、AWSにおけるVPC PeeringやDirect Connectのような別手段での回線接続が必要)

また すべてのクラスターからKubernetesAPIサーバーに接続する必要がある

こちらのサイトにて詳しい比較をしている * マルチクラスタにすべきか、そうではないか - サービスメッシュを使ったクラスタ間通信

そのほか