Help us improve your experience.

Let us know what you think.

Do you have time for a two-minute survey?

複数のインターフェイスポッドを Contrail

 

通常、Kubernetes クラスターの各ポッドには、ネットワークインターフェイスが1つしかありません (ループバックインターフェイスは除きます)。実際には、複数のインターフェイスが必要なシナリオもあります。たとえば、VNF (仮想化されたネットワーク機能) では、通常、ネットワーク機能を完成させるための管理インターフェイスを左、右、オプションで必要としています。ポッドには、データトラフィックを伝送するデータインターフェイスと、到達可能性検知のための管理インターフェイスが必要になる場合があります。また、サービスプロバイダは、分離と管理の目的で管理とテナントのネットワークに依存しないようにしている傾向があります。複数のインターフェイスにより、コンテナを複数のネットワーク内の複数のデバイスに同時に接続することができます。

CNI としての Contrail

コンテナ技術において、仮想イーサネットのペアは、ネットワーク名前空間間のトンネルを作成するために使用できる仮想ケーブルとほぼ同じように機能します。一方の端がコンテナーに接続され、もう一方の端がホストまたは docker ブリッジの名前空間にあります。

Contrail CNI plugin は、ネットワークインターフェイス (veth ペアの片方の端) をコンテナネットワーク名前空間に挿入するとともに、ホストに必要なすべての変更も行います。また、その他の終端のブリッジへの接続、IP の割り当て、ルートの設定などを行います。

CNI プラグインの実装には、現在、一般に公開されているものが数多くあります。Contrail は、お気に入りの1つです。包括的なリストについては、 https://github.com/containernetworking/cniをご確認ください。

Figure 1: コンテナと veth のペア
コンテナと veth のペア

別の CNI プラグイン、multus-CNI を使用すると、ポッドに複数のネットワークインターフェイスを接続できます。Multus-cni のマルチネットワークサポートは、他の CNI プラグインを複数回呼び出す Multus によって実現されます。各プラグインが独自のネットワークを作成するため、複数のプラグインで、pod に複数のネットワークを構築できます。Contrail が提供する主 Contrail なメリットの1つとして、mutus cni との比較、および業界でのその他の現在のすべての実装は、他のプラグインを呼び出さずに、Kubernetes ポッドに複数のネットワークインターフェイスを接続する機能を提供することです。これにより、真のマルチホームポッドがサポートされます。

ネットワーク添付ファイルの定義 CRD

Contrail CNI は、Kubernetes CRD (カスタムリソース定義) のネットワーク添付ファイルの定義に従って、追加のネットワークインターフェイスの設定を指定するための標準化された方法を提供します。標準の Kubernetes アップストリーム Api を変更する必要はなく、最も compatibilities に実装されています。

Contrail では、kube マネージャー (KM) によって、ネットワークアタッチメント定義の CRD が作成されます。起動すると、KM は、ネットワーク CRD network-attachment-definitions.k8s.cni.cncf.io が Kubernetes API サーバーで見つかったかどうかを検証し、存在’しない場合はそれを作成します。

以下に、CRD オブジェクト YAML ファイルを示します。

Contrail Kubernetes セットアップでは、CRD が作成され、検証できるようになりました。

上記の CRD から作成された、この新しいタイプのネットワーク添付ファイルを使用して、Contrail Kubernetes 環境で仮想ネットワークを作成できるようになりました。

Kubernetes から仮想ネットワークを作成するには、YAML テンプレートを次のように使用します。

他の多くの標準 Kubernetes オブジェクトと同様に、仮想ネットワーク名、メタデータの下にある名前空間、およびネットワークに関する追加情報の送信に使用される注釈を指定します。Contrail では、次の注釈が、NetworkAttachmentDefinition CRD で使用され、仮想ネットワークの特定の属性を有効にします。

  • opencontrail.org/cidr: この CIDR では、仮想ネットワークのサブネットを定義します。

  • opencontrail.org/ip_fabric_forwarding: このフラグは、ip ファブリック転送機能を有効または無効にするために使用されます。

  • opencontrail.org/ip_fabric_snat: Ip ファブリック snat の機能を有効または無効にするためのフラグです。

Contrail では、ip ファブリック転送機能によって、仮想ネットワークにトンネリングせずに IP ファブリックベースの転送が可能になります。2つの ip_fabric_forwrding が有効になっている場合、仮想ネットワークは相互に通信します。オーバーレイトラフィックはアンダーレイを使用して直接転送されます。

Contrail ip ファブリック (snat) 機能を使用すると、オーバーレイ内のポッドは、floating IPs や論理ルーターを使用せずにインターネットにアクセスできます。Ip ファブリック snat 機能は、コンピューティングノードの IP を使用して、必要なサービスに到達するソース NAT を作成します。

このガイドでは、ip ファブリック転送と ip ファブリック snat の機能については説明していないことに注意してください。

また、既存の仮想ネットワークを参照して、新しい仮想ネットワークを定義することもできます。

本書では、1つ目のテンプレートを使用して、すべての例で仮想ネットワークを定義しています。

複数のインターフェイスポッド

複数の仮想ネットワークを作成すると、次のような pod’s yaml ファイルを使用して、任意の接続を pod にアタッチできます (プラグまたは挿入することもできます)。

またはその他の有効な形式:

’おそらく、名前空間内の pod はローカル名前空間で定義されたネットワークだけではなく、完全にスコープが付いた名前を使用して他の名前空間で作成されたネットワークを参照することにも気付きます。これは非常に便利です。同じネットワークを、それを必要とするすべての名前空間で繰り返し複製する必要はありません。一度定義してから、他の場所で参照することができます。

私’たちは基本的な理論について説明し、さまざまなテンプレート’について解説してきました。実際の例を見てみましょう。まず’、仮想ネットワークオブジェクトを検証し、次に、ポッドを作成して2つの仮想ネットワークを接続することによって、2つの仮想ネットワークを作成してみましょう。ここ’では、ポッドインターフェイスと、同じ仮想ネットワークを共有する他のポッドとの接続を検証します。

2つの仮想ネットワークの YAML ファイル (vn-1 および vn) は次のとおりです。

ここで、仮想ネットワークを作成します。

仮想ネットワークを検証します。

仮想ネットワークが予想どおりに作成されます。これは非常に興味深いことではありませんが、Contrail UI にログインすると、次の画面キャプチャで予期しない問題が発生します。Figure 2

Figure 2: Contrail コマンド: メインメニュー > 仮想ネットワーク
Contrail コマンド: メインメニュー > 仮想ネットワーク
Note

適切なプロジェクトが選択されていることを確認してください。この場合は、k8s がデフォルトです。

そして、どの’ような仮想ネットワークも、vn-1 または vn-1 の正確な名前で UI に含まれていないことがわかっています。代わりに、k8s vn-left-1-1u ネットワークと k8s-vn 右ポッドネットワークという2つの仮想ネットワークがあります。

ここには問題はありません。ここでは、Kubernetes から仮想ネットワークを作成するたびに Contrail、Kubernetes のクラスター名 (デフォルト k8s) が、ネットワーク YAML ファイルに指定した仮想ネットワーク名にプレフィックスとして自動的に追加されます。最後にサフィックスが付いています。これは理にかなっていますが、仮想ネットワークはさまざまな方法で作成でき、これらのキーワードが名前に’埋め込まれていることがわかっているので、仮想ネットワークの作成方法 (Kubernetes から、または UI から手動で) をわかりやすくし、どのように使用するかを簡単に知ることができるようになります。また、複数の Kubernetes クラスターで作業している場合は、仮想ネットワーク名の競合を回避することもできます。

次の例は、複数の仮想ネットワークを備えた pod の YAML ファイルです。

Pod 注釈のメタデータで、2つの仮想ネットワークを挿入します。vn-1、vn-右-1。ここで、ブート時に pod が持つインターフェースの数を推測してみましょう。ファイルに指定されたものであるため、2つのことが考えられるかもしれません。ポッド’を作成して検証しましょう。

注釈では、k8s.v1.cni.cncf.io/network-status の下に […] リストが表示されます。これには、3つのアイテムがあり、それぞれの中括弧 {} で表されるキー値マッピングがあります。各波括弧には、1つのインターフェイスに関する情報が含まれます。割り当てられた IP、MAC、および所属する仮想ネットワーク。そのため、2つではなく3つのインターフェイスを pod に作成することになります。

IP アドレス10.47.255.238 を示す2つ目の項目に注目してください。このインターフェイスは、システムによって作成された、クラスター全体のデフォルトと呼ばれるデフォルトの pod ネットワークに接続されています。デフォルトのポッドネットワークは、すべての pod’s ネットワーク名前空間で常に稼働しているため、管理ネットワークとして見ることができます。機能的に’は、ユーザーが作成した仮想ネットワークとは大きく異なります。’ただし、それを削除することはできません。

’次に、ポッドにログインし、インターフェイスをリストして、IP アドレスと MAC を確認します。

1つの lo インターフェイスと3つのインターフェイスを Contrail CNI で接続し、それぞれに対応する仮想ネットワークから IP アドレスが割り当てられていることを確認できます。また、MAC アドレスは、kubectl に’記載されているものと一致することに注意してください。コマンド出力について説明します。

Note

特定の状況下では、注釈に MAC アドレスを持つことが役立ちます。たとえば、サービス連鎖セクションでは、MAC アドレスを使用して適切なインターフェイスを見つける必要があるシナリオが実行されるため、仮想ネットワークから割り当てられた Kubernetes の正しい podIP を割り当てることができます。詳細については、こちらをご覧ください。

この’例では、一般的な Docker の画像ではなく Juniper cSRX の画像に基づいて pod が作成されると、マルチインターフェイスポッドがもう一度見られます。基本的な考え方は変わりません。