CNI - コンテナネットワークインターフェイス(コンテナネットワークインタフェース)
CNI(コンテナネットワークインターフェイス)は、プロジェクトのCNCFで、Linuxのコンテナを設定するための仕様では、ネットワークインタフェースとライブラリで構成され、だけでなく、プラグインの数が含まれています。CNI流通ネットワークのコンテナが作成されるだけのケア、ネットワークリソースのリリースとなったコンテナが削除されます。このリンクから閲覧プロジェクト:https://github.com/containernetworking/cni。
Kubernetesのソースvendor/github.com/containernetworking/cni/libcni
ディレクトリには、すでにCNIを構築していkubernetesを言うことですCNIコードが含まれています。
インタフェース定義
CNIインタフェースは次のメソッドが含まれます。
type CNI interface {
AddNetworkList(net *NetworkConfigList, rt *RuntimeConf) (types.Result, error) DelNetworkList(net *NetworkConfigList, rt *RuntimeConf) error AddNetwork(net *NetworkConfig, rt *RuntimeConf) (types.Result, error) DelNetwork(net *NetworkConfig, rt *RuntimeConf) error }
インターフェイスは、唯一の4つの方法、ネットワークを追加したネットワークを削除し、ネットワークリストを追加し、ネットワークリストを削除します。
設計上の考慮事項
CNIの設計時には、以下の問題を考慮します
- あなたは、コンテナの任意のプラグインを呼び出す前に、新しいネットワーク名前空間コンテナのランタイムを作成する必要があります。
- その後、あなたはコンテナに属し、およびプラグインは、各ネットワークの実行のために実行しなければならないかを決定すべきネットワークを決定しなければなりません。
- JSON形式のネットワーク構成は、容易にファイルに格納することができます。ネットワーク構成は、次のような必要なフィールドを含み
name
、およびtype
プラグ(タイプ)。ネットワーク構成は、呼び出しの間、フィールドの値を変更することができます。このため、オプションのフィールドがありますargs
異なる情報が含まれている必要があります。 - ランタイムコンテナは、各ネットワークにコンテナを追加して、各プラグインのネットワークの順序で実行されなければなりません。
- 容器のライフサイクルが終了した後、プラグは逆の順序で実行されているネットワークから切断容器に(容器の添加の実行順序に関して)実行されなければなりません。
- コンテナが実行されている場合には、同じ容器の並列動作と呼ぶことはできないが、動作が異なる容器の並列に呼び出すことができます。
- 追加し、次は必ず対応するADD DELが続いているので、DEL操作は、コンテナが実行されているコンテナに登録する必要があります。DELは、追加DELが続いてもよいが、複数のプラグインDEL(すなわちプラグ-DELは冪等でなければならない)を処理することができなければなりません。
- コンテナは一意にContainerIDので識別されなければなりません。メモリ状態のプラグは、完全に、主キーの(ネットワーク名、コンテナID)を使用すべきです。
- 同じ名前は、ネットワークIDまたはコンテナを行う2つのADD(該当DEL)オペレーションを呼び出すことはできません。換言すれば、所与のコンテナIDは、特定のネットワークに追加することができます。
CNIプラグ
CNIプラグインは、コンテナ管理システム(例えば、RKTまたはKubernetes)コールすることができる実行可能ファイルを、実装しなければなりません。
容器にCNIネットワーク・インターフェース・ウィジェットは、ネットワーク名前空間(一対のveth例えば、端)に責任がある、ホスト上の任意の必要な変更を加え(例えばのveth他端がブリッジに接続されています)。次に、IPは、インターフェイスに割り当てられ、適切なプラグインIPAMを呼び出すことにより、同じルートの「IPアドレスの管理」セクションを設定します。
パラメータ
CNIのプラグインは、次のアクションをサポートする必要があります。
コンテナのネットワークを追加
パラメータ:
- バージョン。発信者は、CNI仕様のバージョン使用して(容器管理システムまたはプラグインを呼び出す)されます。
- コンテナID。ランタイムコンテナによって割り当てられた平文一意の識別子。それは空にすることはできません。
- ネットワークパスを名前空間。あなたは、それを追加したいパスネットワークの名前空間
/proc/[pid]/ns/net
、またはバインドマウント/リンクを。 - ネットワーク構成。JSONドキュメントは、コンテナがネットワークに参加することができますについて説明します。次のような構造です。
- 追加のパラメータ。これは、各容器に簡単な構成CNIプラグを可能にする別のメカニズムを提供します。
- コンテナインターフェイスに名前を付けます。これは、コンテナを作成するために割り当てられるべきである名前(ネットワーク名前空間)内であるため、それは、Linuxのインターフェイス名の基準や規制を満たす必要があります。
結果:
- インターフェイスのリスト。詳細については、(例えば、容器又はハイパバイザなど)サンドボックスインタフェース名および/またはホストインターフェース名、各インターフェースのハードウェア・アドレスならびにサンドボックスインタフェース(もしあれば)を含むことができる、プラグインに応じ。
- 各インターフェイスに割り当てられたIP設定。IPv4および/またはIPv6アドレス、ゲートウェイルーティングインタフェースサンドボックス、および/またはホストを割り当て。
- DNS情報。辞書には、オプションのネームサーバ、ドメイン、検索ドメインとDNS情報が含まれています。
コンテナネットワークから削除
パラメータ:
- バージョン。発信者は、CNI仕様のバージョン使用して(容器管理システムまたはプラグインを呼び出す)されます。
- コンテナIDは、上記のように説明しました。
- 上記で定義されたようなネットワークは、パス名前空間。
- ネットワーク構成は、上述したように。
- 追加のパラメータは、前述しました。
- 上記で定義されたコンテナ内のインターフェースの名前。
- すべてのパラメータは同じパラメータに対応する追加操作に渡す必要があります。
- ネットワークの構成は、ContainerIDのすべてのリソースを持って解放する必要があります削除します。
レポートのバージョン
- パラメータ:なし。
- 結果:プラグインがサポートCNI仕様のバージョン情報を。
{
“cniVersion”:“0.3.1”,//此输出使用的CNI规范的版本
“supportedVersions”:[“0.1.0”,“0.2.0”,“0.3.0”,“0.3.1”] //此插件支持的CNI规范版本列表 }
:詳細は、プラグインCNIを参照してくださいCNI SPEC。
IPの割り当て
ネットワーク容器管理の一環として、CNIプラグインインターフェイスに関連付けられているすべての必要なルートを界面(及び維持)IPアドレスに割り当てる必要があり、そしてインストールします。これは大きな柔軟性CNIのプラグインを提供するだけでなく、それに大きな負担を与えます。CNI多数のプラグインがIP管理プログラムのユーザニーズの多様性をサポートするために、同じコードを記述する必要があり(例えば、DHCP、ホストローカル)。
負担、IP管理戦略とCNIのプラグ型デカップリングを容易にするために、我々は、管理プラグイン(IPAMプラグイン)のIPアドレスを定義します。CNI業務プラグが適切にIPAMプラグインの実行を起動されます。IPAMプラグインターフェースIP /サブネット、ゲートウェイを決定し、ルーティング、および構成プラグを適用するために「マスター」にこの情報を返す必要があります。IPAMプラグイン(例えばDHCP)、ローカルファイルシステムに格納されたデータ、情報または契約によりを得るために、上記ネットワークプロファイル「IPAM」セクションの組み合わせ。
IPAMプラグイン
CNIのように、プラグインのように、IPAMプラグインの実行可能ファイルを呼び出します。実行可能ファイルのリストパスはによって事前に定義されたに位置しCNI_PATH
CNIプラグに示します。すべて同じ環境変数受信する必要がありIPAMプラグインは、CNIプラグインを通過しました。CNIプラグ、IPAMプラグインを介して、STDINのようなネットワーク構成を受け取ります。
使用可能なプラグイン
メイン:インターフェースが作成します
- 橋:橋を作成し、橋やコンテナにホストを追加
- ipvlan:コンテナに追加ipvlanインタフェース
- ループバック:ループバックインターフェイスを作成します
- macvlan:コンテナにすべてのトラフィックを転送するには、新しいMACアドレスを作成します。
- PTP:のvethを作成します
- VLAN:分配装置のVLAN
IPAM:IPアドレスの割り当て
- DHCPは、ホスト上で実行中のデーモン、コンテナの代わりに、DHCPリクエストを送信します
- ホスト - ローカル:IP割り当てローカルデータベースのメンテナンス
メタ:その他のプラグイン
- フランネル:フランネルプロファイルに基づいてインターフェイスを作成
- チューニング:既存のインタフェースパラメータのsysctlを調整
- ポートマップ:ベースポートマッピングプラグiptablesの。コンテナにホストアドレス空間からのポートマッピング。