Hatでコンサルタントをしている織です。本記事では、KubernetesのPodに複数のNICを接続するための、MultusというCNIプラグインについてご紹介します。プラグインのひとつです。典型的なKubernetesの構成では、PodにはひとつのNICしかアサインされませんが、Multusを使うとPodに追加のNICを生やして、複数のネットワークに接続することができるようになります。内部的には、Multusは複数のCNIプラグインを同時に稼働させるための「メタCNIプラグイン」として稼働します。いう標準にしたがっており、その参照実装として開発されてきました。v1.17を使って、動作検証環境を準備します。workerノード2台のクラスタを作成します。Multusでは複数のCNIプラグインを併用しますが、そのうちのひとつをDefault(もしくはMaster)プラグインと呼びます。Probe等、従来のPod接続で行っていた通信は、基本的にDefaultプラグインを使います。以下の操作では、DefaultのプラグインとしてFlannelを使います。その準備として、まず(Multusではない)普通のCNIプラグインとしてFlannelをインストールします。https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.ymlデフォルトゲートウェイが設定されているNIC(手元の環境ではeth0)でFlannelを使うように設定されます。他方のNIC(手元の環境ではeth1)を、Podを接続するもうひとつのネットワーク接続に使用します。次に、Multusに必要な諸々を入れます[1]。Resourceとして表現します。Definition)や、MultusのCNIデーモンをデプロイするDaemonSet等をインストールします。https://raw.githubusercontent.com/intel/multus-cni/master/images/multus-daemonset.yml以上で準備は完了です。インストールが完了すると、下記のような感じになります。<none>この手順で作成されたCNIプラグインとしてのMultusの設定は、下記のようになります。以下にそのまま入っている形になっています。普通のPodのデプロイまずは従来どおり、NICをひとつだけ持つPodをデプロイします。この場合、DefaultプラグインであるFlannelのネットワークに接続します。trueのようなmanifestを作ってデプロイします。インターフェースがあることがわかります。forevervlanで追加ネットワークに接続Multusを使って、コンテナホストのeth1にVLANサブインターフェースを作成し、それをPodの2つ目のNICとしてアサインします。Resourceとして定義します。vlan-conf)。VLANを使うことを意味します。NetworkAttachmentDefinitionオブジェクトを作成します。次のようなmanifestでPodをデプロイします。IPアドレスをアサインしたPodをデプロイします。インターフェースを確認します。DefaultプラグインであるFlannelにつながるインターフェースです。100のvlanインターフェースが追加され、manifestで指定したIPアドレス(172.16.2.201)が付与されていることがわかります。念の為確認しておきます。アサインされています。インターフェースは下記のようになっています。あることがわかります。してPodを起動しているので、Pod内で下記のようにして、ホスト上の物理インターフェースを確認することもできます。同士で通信できることを確認します。間で通信することができます。msmacvlanで追加ネットワークに接続macvlanとはmacvlanは、物理インターフェースに対して、異なるMACアドレスとIPアドレスを持つ複数のサブインターフェースを作成する仕組みです。Learning、STP等、いわゆるL2スイッチと同じ動きをする。LeariningやSTPは必要ないmacvlanサブインターフェースと親の物理インターフェースは直接は通信できないという違いがあります。vlanサブインターフェースとはvlanサブインターフェースは親インターフェースと同じMACアドレスを持ち、VLANタグを使って異なるL2ドメインに接続するのに対して、macvlanサブインターフェースは親インターフェースとは異なるMACアドレスを持ち、外部ネットワークに直接接続するという違いがあります。macvlanでは、親インターフェースが複数のMACアドレス宛てのパケットを受信する必要があります。サポートする場合は、受信を許可する(macvlanサブインターフェースの)MACアドレスを明示的に登録します。filteringをサポートしない場合は親インターフェースをPromiscuousモードにします。filteringをサポートしています(ので、以下の例では親インターフェースはPromiscuousにはなっていません)。Resourceとして定義します。macvlan-conf)。modeのmacvlanインターフェースを作成し、それをPodをアサインします。8sPodの作成さらに次のようなmanifestでPodをデプロイします。IPアドレスをアサインしたPodをデプロイします。createdPodが2個デプロイされました。付与されていることがわかります。foreverデプロイしたPod間の疎通を確認します。アサインしています)。msipvlanで追加ネットワークに接続ipvlanとはipvlanは、macvlanととてもよく似ています。macvlanとの違いは、サブインターフェースごとに固有のMACアドレスが付与されず、サブインターフェースは親インターフェースと同じMACアドレスを持つことです。ipvlanには、親インターフェースとMACアドレスを共有することに起因する、いくつかの考慮点があります。サブインターフェースのIPアドレスをDHCPで取得するには工夫が必要。IDに対してIPアドレスを割り当てるようにする。サブインターフェースのMACアドレスが共通であるため、MACアドレスからEUI-64フォーマットでインターフェースIDを生成するSLAACによるIPv6の自動設定は使えない一方で、いくつかのユースケースではmacvlanよりもipvlanの方が適しているとカーネルのドキュメントに記載されています。例として挙げられているのは下記です。(MACアドレスを書き換えたりしてほしくない)カーネルの準備CentOS7のカーネル(確認したバージョンは3.10.0-957.27.2.el7)は、ipvlanが有効になっていません。使ってipvlanの動作を確認しました。実際に使ったバージョンは5.4.10-1.el7.elrepoです。Resourceとして定義します。ipvlan-conf)。親インターフェースとして、ipvlanインターフェースを作成し、それをPodをアサインします。次のようなmanifestでPodをデプロイします。IPアドレスをアサインしたPodをデプロイします。createdPodが2個デプロイされました。付与されていることがわかります。foreverデプロイしたPod間の疎通を確認します。msデプロイしたPodとmasterノードとの疎通を確認します。Resourceとして定義します。bridge-conf)。いう名前のブリッジを作成し、そこにPodのvethを接続します。次のようなmanifestでPodをデプロイします。IPアドレスをアサインしたPodをデプロイします。createdPodが2個デプロイされました。付与されていることがわかります。上で、bridgeインターフェースを確認します。いうブリッジが作成されています。あることがわかります。pairになっていることが確認できます。アップリンクが設定されていないため、異なるノード上のPodとは通信できません。vethe5ca8264こうすることで、デプロイしたPod間で疎通できるようになります。アサインしています)。msIPAMPodに割り当てるIPアドレスの管理方法もプラグイン形式になっており、現時点では3種類から選べるようになっています。manifestに直書きしました。その他の方法については、また別途何か書く...かもしれません。Playbookがここにあります。これを使うと、下記のような感じでKVM環境の仮想マシンとしてNICを2個持つ仮想マシンインスタンスをお手軽に構築できます。HatでNFVPEをしている林さんにいろいろ教えていただきました。ありがとうございました!開発している人が身近にいるのは最高の福利厚生ですね。いうメッセージ)で起動に失敗するかもしれません。変えて試してみてください。Hatでコンサルタントをしている織です。HatでOpenShiftのサポートをしているid:nekopです。各記事は著者の見解によるものでありその所属組織を代表する公式なものではありません。その内容については非公式見解を含みます。スターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。