見出し画像

CNI と nerdctl の併用

はじめに 本文章は、 containerdプロジェクトが公開しているLinuxでコンテナーを操作するためのコマンド nerdctl のマニュアルを独自に翻訳したものです。 オリジナルの著作権はcontainerdプロジェクトが保有しておりApache-2.0ライセンスで頒布されています。本翻訳と編集の著作権は編訳者が保有しています。オリジナルの英語ドキュメントはこちらで参照できます。



nerdctlはコンテナネットワークにCNIプラグインを使用しており、 --network または --net オプションのいずれかを使用してネットワークの設定をおこなえます。

基本ネットワーク

nerdctlは、いくつかの基本的なタイプのCNIプラグインを構成なしでサポートします。 Linuxシステムの場合(CNIプラグインがインストールされている必要があります)、基本的な CNI プラグインの種類は、bridge、portmap、firewall、tuningです。 Windows の場合、サポートされているCNIプラグインタイプはnatのみです。

Linux のデフォルトのネットワークbridgeと Windows の nat ( ネットワーク オプションは設定しないでください。

Linuxのデフォルトのネットワークbridgeの設定:

{
  "cniVersion": "1.0.0",
  "name": "bridge",
  "plugins": [
    {
      "type": "bridge",
      "bridge": "nerdctl0",
      "isGateway": true,
      "ipMasq": true,
      "hairpinMode": true,
      "ipam": {
        "type": "host-local",
        "routes": [{ "dst": "0.0.0.0/0" }],
        "ranges": [
          [
            {
              "subnet": "10.4.0.0/24",
              "gateway": "10.4.0.1"
            }
          ]
        ]
      }
    },
    {
      "type": "portmap",
      "capabilities": {
        "portMappings": true
      }
    },
    {
      "type": "firewall",
      "ingressPolicy": "same-bridge"
    },
    {
      "type": "tuning"
    }
  ]
}

ブリッジの分離

nerdctl >= 0.18 は、ファイアウォール プラグイン >= 1.1.0 がインストールされている場合、ingressPolicy を same-bridge に設定します。 この ingressPolicy は、nerdctl <= 0.17 で使用される CNI 分離プラグインを置き換えます。

分離プラグインが見つかった場合、nerdctl は ingressPolicy の代わりに分離プラグインを使用します。 分離プラグインは非推奨となり、nerdctlの将来のバージョンではingressPolicyのみがサポートされます。

ファイアウォールプラグイン >= 1.1.0 も分離プラグインも見つからない場合、nerdctl はブリッジ分離を有効にしません。 つまり、--net=foo のコンテナは --net=bar のコンテナに接続できます。

macvlan/IPvlan ネットワーク

nerdctlは、macvlanおよびIPvlanネットワークドライバもサポートしています。

特定の物理ネットワークインターフェースとブリッジする macvlan ネットワークを作成するには、--driver macvlan を nerdctl network create コマンドを実行します。

# nerdctl network create mac0 --driver macvlan \
  --subnet=192.168.5.0/24
  --gateway=192.168.5.2
  -o parent=eth0

トラフィックがホスト上で物理的に通過するインターフェイスである親を指定できます。 デフォルトはデフォルト・ルート・インターフェースです。

また、サブネットはネットワークインターフェイスと同じネットワークの下にある必要があります。 より簡単な方法は、DHCPを使用してIPを割り当てることです。

# nerdctl network create mac0 --driver macvlan --ipam-driver=dhcp

--driver ipvlan を使用するとipvlanネットワークを作成でき、IPvlanのデフォルトモードはl2です。

カスタムネットワーク

また、構成ファイルを提供することで、CNI ネットワークをカスタマイズすることもできます。 たとえば、1 つの構成ファイル (/etc/cni/net.d/10-mynet.conf) があるとします。 bridgeネットワークの場合:

{
  "cniVersion": "1.0.0",
  "name": "mynet",
  "type": "bridge",
  "bridge": "cni0",
  "isGateway": true,
  "ipMasq": true,
  "ipam": {
    "type": "host-local",
    "subnet": "172.19.0.0/24",
    "routes": [
      { "dst": "0.0.0.0/0" }
    ]
  }
}

mynet という名前の新しい CNI ネットワークが構成され、 このネットワークを使用してコンテナを作成します。

# nerdctl run -it --net mynet --rm alpine ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
3: eth0@if6120: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
    link/ether 5e:5b:3f:0c:36:56 brd ff:ff:ff:ff:ff:ff
    inet 172.19.0.51/24 brd 172.19.0.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::5c5b:3fff:fe0c:3656/64 scope link tentative
       valid_lft forever preferred_lft forever

この記事が気に入ったらサポートをしてみませんか?