Kubernetes におけるネットワーク その 1

Kubernetes におけるネットワーク その 1

今回は Kubernetes におけるネットワークについてまとめます。 具体的な実装方法については Azure Kubernetes Service (AKS) のところを絡めていきます。

Pod のネットワーク

Pod は 1 つ以上のコンテナーで構成される Kubernetes ワークロードの最小単位です。 Pod 内のコンテナーはそれぞれ異なるポートを利用することで localhost 宛の通信が可能です。 逆を言えば、1 つの Pod 内で同じポートを利用することはできません。

また、IP アドレスは Pod ごとに割り当てられます。 Pod 外から特定のコンテナーに通信する際は、Pod の IP アドレスとコンテナーのポート番号を指名することになります。

Pod – Podネットワーク

Pod 間のネットワーク

Kubernetes ではクラスター内に分散して Pod を稼働するため、ノード間を通信できる仕組みが必要となります。 Kubernetes クラスターでのネットワークを構築するモデルとしては、最低限次の条件を満たしている必要があります。

  • ノード上の Pod が、NAT なしですべてのノード上のすべての Pod と通信できること
  • systemd や kubelet などノード上にあるエージェントが、そのノード上のすべての Pod と通信できること

これらの条件を満たし、様々なプラットフォーム上で Kubernetes を稼働させるために多くの実装方法が用意されています。 実装方法としては次のようなものがあります。

クラスターのネットワーク – Kubernetesネットワークモデルの実装方法

AKS においては、次の 2 種類でクラスター ネットワークを実装可能です。

  • kubenet
  • Azure CNI

AKS NW の前提

AKS クラスターではネットワークでの前提条件として次の項目が定められています。

  • AKS クラスターから外部インターネット通信が必要
  • サービス CIDR、ポッド CIDR、クラスターを配置する仮想ネットワークのアドレスとして使用できないネットワーク アドレス範囲
    • 169.254.0.0/16
    • 172.30.0.0/16
    • 172.31.0.0/16
    • 192.0.2.0/24
  • クラスター ID に、配置する仮想ネットワークへ対する次のアクション権限が必要
    • Microsoft.Network/virtualNetworks/subnets/join/action
    • Microsoft.Network/virtualNetworks/subnets/read

kubenet

kubenet では、既定でAKS クラスター作成時に AKS ノード用の仮想ネットワークとサブネットを自動作成します。 作成時のオプションによって既存の仮想ネットワークに AKS クラスターを作成できます。 この場合、ノードには仮想ネットワークから IP アドレスが割り当てられます。 Pod には仮想ネットワークと分離した論理ネットワークから IP アドレスが割り当てられます。 なお、Pod からの外部へ通信が発生する際はノードの IP アドレスに NAT されます。

kubenet のネットワーク構成
kubenet でのネットワーク制御

前述の通り、Pod がノード外部と通信する際にはノードの IP アドレスに NAT が行われる。 ノード間の Pod で通信する際には、ユーザー定義ルート (UDR) と IP 転送が利用されます。 UDR には各ノード上の Pod ネットワーク宛ルートが各ノードへ転送されるように経路情報が登録されます。 Azure でサポートされる UDR のルート数は 400 が上限なので、kubenet で作成できる AKS ノードの上限も 400 になります。

kubenet で独自の仮想ネットワークを利用する

既定では自動で仮想ネットワークとルート テーブルが作成されますが、独自に作成したリソースを利用することもできます。 カスタム ルート テーブルを利用することはできますが、AKS によって自動で作成されたルートを変更したり削除することはサポートされません。 また、独自の仮想ネットワークに対して AKS クラスターのクラスター ID にアクセス許可を割り当てることができます。

Azure Kubernetes Service (AKS) で kubenet ネットワークを構成する – kubenet で独自のサブネットとルート テーブルを使用する

kubenet での制限事項

  • kubenet では複数の AKS クラスターを同じサブネットで共有することはできない
  • kubenet では次の機能がサポートされていない
    • Azure ネットワーク ポリシー
    • Windows ノード
    • 仮想ノード アドオン

Azure CNI

Azure CNI では、独自に作成した仮想ネットワークに AKS ノードを作成します。 この場合、ノードと Pod の両方に仮想ネットワークから IP アドレスが割り当てられます。 ノードごとに実行できる Pod の最大サイズを指定できるため、ノード数ごとに仮想ネットワークから IP アドレスが予約されます。

これらのアドレスは、他の仮想ネットワークや仮想ネットワークに接続されているネットワークのアドレスを重複しない範囲を指定します。 Pod 用の IP アドレスはセカンダリ IP アドレスとしてノードに割り当てられ、仮想ネットワーク内で予約されます。 そのため、ノードごとの最大 Pod 数と用意するノード数を考慮したアドレスを用意しておく必要があります。 また、ノードのアップグレードに備え、n ノード利用する場合は n + 1 ノード分のアドレスが必要になります。

Azure Kubernetes サービス (AKS) で Azure CNI ネットワークを構成する – Azure Kubernetes Service | Microsoft Docs クラスターのネットワーク – Azure CNI for Kubernetes

Azure CNI の構成

kubenet と Azure CNI の比較

kubenet 利用における考慮事項

kubenete では Pod に割り当てられる IP アドレスは論理的に分離されているため、AKS クラスター外部から Pod へ通信することができません。 また、Azure ネットワーク ポリシー、Windows ノードや仮想ノード アドオンなど、一部の機能が利用できません。 さらに、クラスター内の最大ノード数には 400 という上限があります。

仮想ネットワーク内のアドレスをしないため、アドレス数の節約を図ることができます。 しかしながら、サービス CIDR のアドレス範囲は他の接続されているネットワークと重複しないようにします。

Azure CNI における考慮事項

仮想ネットワークから Pod 用のアドレスを払い出すため、利用可能なアドレス数に注意しなければいけません。 また、アップグレード時を考慮して余分なノード分のアドレスが必要になります。

外部送信時のトラフィック

AKS 作成時、自動的にロードバランサーが作成されます。 このロードバランサーは AKS ノードからインターネットなどの外部通信と、外部から AKS 上のサービスへ通信する際に利用されます。

AKS クラスター作成時、パブリックロードバランサーを作成しないことも選択可能です (–outbound-type に userDefinedRouting を指定する)。 しかしながらこの場合、AKS ノードは外部との通信が必要になるので、別途 Azure FW や NVA などのネットワーク コンポーネントを用意する必要があります。

ロック ダウンされたトポロジ

Standard ロードバランサーの場合、アタッチされているパブリック IP アドレスに SNAT されます。この場合、Standard パブリック IP アドレスの SNAT に使えるポート上限 64,000 が同時接続送信セッション数になります。この上限を回避するには Azure FW などを用いて複数のパブリック IP アドレスを割り当てる構成にする必要があります。