Kubernetes前書きKubernetesは、サーバーのクラスター全体でコンテナー化されたアプリケーションの展開と操作を管理できる強力なコンテナーオーケストレーションシステムです。Kubernetesは、コンテナワークロードの調整に加えて、アプリケーションとサービス間の信頼性の高いネットワーク接続を維持するために必要なインフラストラクチャとツールを提供します。documentationは、Kubernetesネットワークの基本的な要件は次のとおりであると述べています。すべてのコンテナは、NATなしで他のすべてのコンテナと通信できます。すべてのノードは、NATなしですべてのコンテナと通信できます(逆も同様です)。コンテナがそれ自体を見るIPは、他の人がそれを見ると同じIP_この記事では、Kubernetesがクラスター内のこれらのネットワーク要件をどのように満たすかについて説明します。ポッド内、ポッド間、ノード間でのデータの移動方法です。*がアプリケーションに単一の静的IPアドレスとDNSエントリを提供し、複数の絶えずスケーリングおよびシフトするポッドに分散される可能性のあるサービスとの通信を容易にする方法も示します。Kubernetes]で一般的なアーキテクチャと関連するコンポーネント。1つのポッド内のネットワークの状況を見てみましょう。ポッドネットワーキングKubernetesでは、_pod_は組織の最も基本的な単位です。すべての密接に関連し、単一の機能またはサービスを実行する密結合コンテナのグループです。ネットワークに関しては、Kubernetesは従来の仮想マシンまたは単一のベアメタルホストと同様にポッドを処理します。*ホスト名を使用したインターフェース。これは、ポッドのすべてのコンテナーを同じネットワークスタックに割り当てることで実現されます。この状況は、コンテナ化の数日前に単一のホストに複数のサービスを展開した人なら誰でも知っているはずです。すべてのサービスは、リッスンするために一意のポートを使用する必要がありますが、それ以外の場合、通信は単純でオーバーヘッドが低くなります。ポッドツーポッドネットワーキングほとんどのKubernetesクラスターでは、ノードごとに複数のポッドを展開する必要があります。ポッドからポッドへの通信は、同じノード上の2つのポッド間、または2つの異なるノード間で発生する場合があります。単一のノードで、互いに直接通信する必要がある複数のポッドを使用できます。ポッド間のパケットのルートをトレースする前に、ノードのネットワーク設定を調べてみましょう。次の図は概要を示しており、詳細に説明します。*ネットワーク名前空間内にあります。これは、Linux上のネットワークデバイスのデフォルトのネームスペースです。プロセス名前空間によってコンテナが実行中のアプリケーションを相互に分離できるように、ネットワーク名前空間はインターフェイスやブリッジなどのネットワークデバイスを分離します。ノード上の各ポッドには、独自の分離されたネットワーク名前空間が割り当てられます。名前空間に接続されます。*を使用しています)ポッド内)。*などを使用する場合があります)。ブリッジは基本的に物理的なイーサネットスイッチのように機能し、ARP(アドレス解決プロトコル)またはIPベースのルーティングを使用して、トラフィックを転送する他のローカルインターフェイスを検索します。*にトレースしてみましょう。*のIPを宛先とするパケットを作成しますパケットは、仮想イーサネットペアを介してルートネットワーク名前空間に移動します。*ネットワークインターフェイスに移動します。ノード内のポッドからポッドへのパケットをトレースしたので、ノード間のポッドトラフィックの流れを見てみましょう。2つのノード間のポッド間通信クラスター内の各ポッドには固有のIPがあり、すべてのポッドは他のすべてのポッドと直接通信できるため、2つの異なるノード上のポッド間を移動するパケットは前のシナリオと非常に似ています。*にパケットをトレースしてみましょう。*のIPを宛先とするパケットを作成しますパケットは、仮想イーサネットペアを介してルートネットワーク名前空間に移動します。*に向けて送信されます_オプション:_ノードにパケットを適切にルーティングするためにクラスターがネットワークオーバーレイを必要とする場合、パケットはネットワークに向かう前にVXLANパケット(またはその他のネットワーク仮想化技術)にカプセル化されます。ネットワーク自体に適切な静的ルートを設定することもできます。その場合、パケットはeth0に移動し、ネットワークから変更されません。パケットはクラスターネットワークに入り、正しいノードにルーティングされます。_services_と、このインフラストラクチャ上でのパケットの構築方法を見てみましょう。サービスネットワーキングへのポッドKubernetesクラスターの動的な性質により、ポッドを移動、再起動、アップグレード、またはスケールイン/スケールアウトできるため、ポッドIPのみを使用して特定のアプリケーションにトラフィックを送信することは困難です。一部のサービスには多数のレプリカがあるため、それらの間で負荷を分散する方法が必要です。Kubernetesは、_Services_でこの問題を解決します。サービスは、単一の仮想IP(VIP)をポッドIPのセットにマッピングするAPIオブジェクトです。Kubernetesは各サービスの名前と仮想IPのDNSエントリを提供するため、サービスは名前で簡単にアドレス指定できます。+」プロセスによって調整されます。[iptables]またはIPVSを設定して、パケットを送信する前にVIPをポッドIPに自動的に変換します。クラスターネットワークへ。個々の接続が追跡されるため、パケットが戻ったときに適切に変換解除できます。IPVSとiptablesはどちらも、単一のサービス仮想IPを複数のポッドIPにロードバランシングできますが、IPVSには使用できるロードバランシングアルゴリズムの柔軟性がはるかにあります。*に到達するまでのルートを見てみましょう。*のIPを宛先としてパケットを作成しますパケットは、仮想イーサネットペアを介してルートネットワーク名前空間に移動します。+」で設定されたiptablesまたはIPVSは、利用可能なまたは指定されたロードバランシングアルゴリズムを使用して、パケットの宛先IPを一致させ、仮想IPからサービスのポッドIPの1つに変換します_オプション:_前のセクションで説明したように、この時点でパケットがカプセル化される場合がありますパケットはクラスターネットワークに入り、正しいノードにルーティングされます。*を介して仮想イーサネットペアに送信されます。*に戻ると、VIPからポッドへのIP変換が逆になり、パケットはブリッジおよび仮想インターフェイスを介して正しいポッドに戻ります。結論この記事では、Kubernetesクラスターの内部ネットワークインフラストラクチャを確認しました。ネットワークを構成する構成要素について説明し、さまざまなシナリオでのホップごとのパケットの旅を詳しく説明しました。Kubernetesの公式ドキュメント]。