一般的に、Alibaba Cloud において Kubernetes クラスター作成時には、VPC (Virtual Private Cloud) の自動作成を選択でき、デフォルトネットワークアドレスを利用することができます。 いつくかの複雑なシナリオでは、ユーザーが ECS (Elastic Compute Service) アドレス、Kubernetes ポッドアドレスおよび Kubernentes サービスアドレスを設定します。 このドキュメントでは、Alibaba Cloud VPC 環境下での Kubernetes でアドレスがどのように使用され、CIDR をどのように設定するかを紹介します。

Kubernetes CIDR ブロックの基本概念

IP アドレスに関連する概念は以下のようになります。

VPC CIDR ブロック

CIDR ブロックは VPC 作成時に選択されます。 VPC CIDR ブロックは "10.0.0.0/8"、"172.16.0.0/12" および "192.168.0.0/16" から選択します。

VSwitch CIDR ブロック

CIDR ブロックは VPC での VSwitch 作成時に指定されます。 VSwitch CIDR ブロックは、現在お使いの VPC CIDR ブロックのサブセットである必要があります。これにより、VPC CIDR ブロックと同様のものになりますがこの範囲を超えることはありません。 VSwitch での ECS インスタンスへ割り当てられたアドレスは、VSwitch CIDR ブロックから取得されます。 複数の VSwitch を 1 つの VPC下で作成することができますが、VSwitch CIDR ブロックは重複できません。

VPC CIDR ブロックの構造は以下のようになります。

ポッド CIDR ブロック

Kubernetes においてポッドは 1 つの概念となります。 それぞれのポッドは 1 つの IP アドレスを持ちます。 Alibaba Cloud Container Service で Kubernetes クラスター作成時に、ポッド CIDR ブロックを指定することができますが、ポッド CIDR ブロックは重複できません。たとえば、VPC CIDR ブロックが "172.16.0.0/12" であれば、Kubernetes のポッド CIDR ブロックに "172.16.0.0/16"、"172.17.0.0/16" および "172.16.0.0/12" に含まれるどのアドレスも使用することができません。

サービス CIDR ブロック

Kubernetes においてサービスは 1 つの概念となります。 それぞれのサービスはそれぞれにアドレスを持ちます。 サービス CIDR ブロックは VPC CIDR ブロックまたはポッド CIDR ブロックと重複できません。 サービスアドレスは Kubernetes クラスターでのみ使用され、Kubernetes クラスター外では使用できません。

Kubernetes CIDR ブロックおよび VPC CIDR ブロックの関係は以下のようになります。

CIDR ブロックの選択方法

1 つの VPC と 1 つの Kubernetes クラスターでのシナリオ

これは最もシンプルなシナリオです。 VPC アドレスは VPC 作成時に決められます。 Kubrenetes クラスターの作成時に現在のVPCとは異なるCIDR ブロックを選択します。

1 つの VPC と 複数の Kubernetes クラスターでのシナリオ

1 つの VPC 下に複数の Kubernetes クラスターを作成します。 デフォルトネットワークモード (Flannel) で、ポッドメッセージは VPC によりルーティングされる必要があり、Container Service により自動的に VPC ルート上のそれぞれの CIDR ブロックに対してルートテーブルが設定されます。 全ての Kubernetes クラスターのポッド CIDR ブロックは重複できませんが、サービス CIDR ブロックの重複は可能です。

VPC アドレスは VPC 作成時に決められます。 Kubernetes クラスター作成時に、VPC アドレスと重複しない CIDR ブロックを選択するか、それぞれの Kubernetes クラスター向けの他のポッド CIDR ブロックを選択します。

そのような状況では、Kubernetes クラスターのパートは相互接続されています。 1 つの Kubernetes クラスターのポッドは ポッドおよび 他の Kubernetes クラスターの ECS インスタンスへ直接アクセスできますが、他のKubernetesクラスターのサービスへはアクセスできません。

VPC 相互接続のシナリオ

2 つの VPC が相互接続されているとき、ルートテーブルを使用することにより、どのメッセージを相手の VPC へ送るかを設定できます。 以下のシナリオを例にとります: "VPC 1" が CIDR ブロック "192.168.0.0/16" を使用し、"VPC 2" が CIDR ブロック "172.16.0.0/12" を使用しているとします。 ルートテーブルを使用することにより、"VPC 1" における "172.16.0.0/12" のメッセージを "VPC 2" に送信することを指定します。

このような状況において、"VPC 1" で作成された Kubernetes クラスターの CIDR ブロックは "VPC 1" の CIDR ブロックまたは "VPC 2" へルーティングされた CIDR ブロックと重複できません。"VPC 2" で Kubernetes クラスターを作成した際のシナリオを適用します。 この例では、Kubernetes クラスターのポッド CIDR ブロック は "10.0.0.0/8" 下の小区分を選択できます。

"VPC 2" へルーティングされている CIDR ブロックは使用中のアドレスとみなすことができます。 Kubernetes クラウターは使用中のアドレスと重複できません。

"VPC 2" において "VPC 1" の Kubernetes ポッドへのアクセスには、"VPC 2" での Kubernetes クラスターへのルーティングを設定します。

VPC から IDC のシナリオ

VPC 相互接続のシナリオと同様に、VPC での CIDR ブロックのパーツが IDC へルーティングされている場合、Kubernetes クラスターのポッドアドレスは IDC での Kubernetes クラスターのポッドアドレスと重複できません。 IDC の専用回線 VBR (virtual border router) へのルートテーブルの設定が必要です。