コンテンツにスキップ

Vpc

Vpcは、論理的に分離されたプライベートネットワーク環境を表します。

Juneauでは、PodやSubnetはVpcに所属し、異なるVpc間ではネットワークを分離して扱います。 Vpcは、どのSubnet同士が同じネットワーク空間に属するかを決めるための単位です。

VpcとSubnetの関係

1つのVpcには、複数のSubnetを所属させられます。 default 以外のVpcでも、複数のSubnetを持つことを前提としています。

各Subnetは1つのVpcに属し、VpcがSubnet群の論理的なまとまりを表します。

default Vpc

default Vpcは、クラスタに最初から存在する特別なVpcです。

Pod作成時にVPCやSubnetを指定するannotationが存在しない場合、そのPodは default Vpcに属する default Subnetを利用します。

そのため、明示的にネットワークを分けない限り、クラスタ内のワークロードはまず default Vpcを利用することになります。

bootstrap 時の default Vpc には Service 関連の opt-in (spec.service.consume: true および spec.service.provider.natSourceSubnet: default) があらかじめ設定されています。

ルートテーブル

すべてのVpcには、メインルートテーブルが1つ存在します。

Subnetごとに個別のルートテーブルでoverrideしない場合、そのVpcのメインルートテーブルが利用されます。 つまり、Vpcのメインルートテーブルは、そのVpcに属するSubnetに対するデフォルトの経路制御を表します。

Service ルーティング

spec.service は、その Vpc が Service ルーティングにどのように関与するかを決める設定です。spec.service が未設定の Vpc では、その Vpc に属する Pod はいかなる ClusterIP にも到達できません (メインルートテーブルにも Service 用の経路が注入されません)。

spec.service の中の以下のいずれかが設定されると、その Vpc は Service ルーティング有効として扱われ、メインルートテーブルに Service CIDR 向けの経路が自動で注入されます。

フィールド 役割
spec.service.consume 自 Vpc の Pod が他 Vpc の共有Service に到達することを許可します
spec.service.provider.natSourceSubnet 自 Vpc の Service を共有Service として公開するときに、SNAT のソースアドレスを払い出す Subnet を指定します

両方を同時に設定することもできます。

具体的な構築手順は次を参照してください。

Provider Subnet の制約

spec.service.provider.natSourceSubnet には、同じ Vpc に属する既存の Subnet の名前を指定する必要があります (webhook で検証されます)。指定した Subnet からは、Node ごとに 1 つの SNAT アドレスが払い出されます。Pod 用の払い出しと同じ Subnet を共有することもできますが、運用上は Service NAT 専用の Subnet を分けると衝突を避けられます。

Consumer の ACL

spec.service.consume: true を設定すると、その Vpc の Pod は他 Vpc の共有Service にデフォルトで到達できます。Service 側で juneau.loutres.me/shared-service-allowed-consumer-vpcs annotation を指定すると、Service 単位で許可する caller Vpc を whitelist で絞り込めます。