5.2. 複数のネットワークの設定と使用


MicroShift Multus Container Network Interface (CNI) をインストールした後、設定を使用して他のネットワークプラグインを使用できます。

5.2.1. IP アドレス管理タイプと追加ネットワーク

IP アドレスは、設定した IP アドレス管理 (IPAM) CNI プラグインを通じて追加のネットワークにプロビジョニングされます。MicroShift でサポートされている IP アドレスのプロビジョニングタイプは host-localstatic、および dhcp です。

5.2.1.1. ブリッジインターフェイスの詳細

bridge タイプのインターフェイスと dhcp IPAM を使用する場合は、ブリッジネットワークでリッスンする DHCP サーバーが必要です。ファイアウォールを使用している場合は、ネットワークゾーンで DHCP トラフィックを許可するために、firewall-cmd --remove-service=dhcp コマンドを実行して、firewalld サービスを設定することも必要です。

5.2.1.2. macvlan インターフェイスの詳細

macvlan タイプのインターフェイスは、ホストが接続されているネットワークにアクセスします。つまり、dhcp IPAM プラグインが使用されている場合、インターフェイスがホストネットワーク上の DHCP サーバーから IP アドレスを受信できます。

5.2.1.3. ipvlan インターフェイスの詳細

ipvlan インターフェイスは、ホストネットワークにも直接アクセスできますが、ホストインターフェイスと MAC アドレスを共有します。共有 MAC アドレスにより、ipvlan タイプのインターフェイスは、dhcp プラグインでは使用できません。IPAM プラグインは、ClientID を使用した DHCP プロトコルをサポートしていません。

5.2.2. 追加ネットワーク用の NetworkAttachmentDefinition の作成

追加のネットワークの NetworkAttachmentDefinition 設定ファイルを作成するには、次の手順に従います。この例では、bridge-type インターフェイスを使用します。また、host-local IP アドレス管理 (IPAM) を使用するここでのサンプルワークフローを使用して、サポートされているその他の追加ネットワークタイプを設定することもできます。

重要

bridgedhcp IPAM を使用する場合は、ブリッジされたネットワークでリッスンする DHCP サーバーが必要です。ファイアウォールも使用している場合は、ネットワークゾーンで DHCP トラフィックを許可するように firewalld サービスを設定することも必要です。この場合は、firewall-cmd --remove-service=dhcp コマンドを実行できます。

前提条件

  • MicroShift Multus CNI がインストールされている。
  • OpenShift CLI (oc) がインストールされている。
  • クラスターが実行されている。

手順

  1. オプション: 次のコマンドを実行して、MicroShift クラスターが Multus CNI で実行されていることを確認します。

    $ oc get pods -n openshift-multus

    出力例

    NAME                READY   STATUS    RESTARTS   AGE
    dhcp-daemon-dfbzw   1/1     Running   0          5h
    multus-rz8xc        1/1     Running   0          5h

  2. 次のコマンドを実行し、次のサンプルファイルを参照して NetworkAttachmentDefinition 設定ファイルを作成します。

    $ oc apply -f network-attachment-definition.yaml

    NetworkAttachmentDefinition のファイルの例

    apiVersion: "k8s.cni.cncf.io/v1"
    kind: NetworkAttachmentDefinition
    metadata:
      name: bridge-conf
    spec:
      config: '{
          "cniVersion": "0.4.0",
          "type": "bridge", 1
          "bridge": "br-test", 2
          "mode": "bridge",
          "ipam": {
            "type": "host-local", 3
            "ranges": [
              [
                {
                  "subnet": "10.10.0.0/24",
                  "rangeStart": "10.10.0.20",
                  "rangeEnd": "10.10.0.50",
                  "gateway": "10.10.0.254"
                 }
              ],
              [
                {
                  "subnet": "fd00:IJKL:MNOP:10::0/64", 4
                  "rangeStart": "fd00:IJKL:MNOP:10::1",
                  "rangeEnd": "fd00:IJKL:MNOP:10::9"
            "dataDir": "/var/lib/cni/br-test"
          }
        }'

    1
    type 値は CNI プラグインの名前を指定します。この例では bridge タイプを使用します。
    2
    bridge 値は、使用されている MicroShift ホスト上のブリッジの名前です。Pod の追加インターフェイスはそのブリッジに接続されます。ホスト上にインターフェイスが存在しない場合は、Bridge CNI によって作成されます。インターフェイスがすでに存在する場合は再利用されます。以下の例では、インターフェイスの名前は br-test です。
    3
    IPAM タイプ。
    4
    IPv6 アドレスをセカンダリーインターフェイスに追加できます。
    注記

    ブリッジの名前の使用は、プラグインの bridge タイプに固有です。他のプラグインは NetworkAttachmentDefinitions で異なるフィールドを使用します。たとえば、macvlan および ipvlan 設定は master を使用して、割り当てるホストインターフェイスを指定します。

5.2.3. Pod の追加ネットワークへの追加

Pod を追加のネットワークに追加できます。Pod が作成されると、追加のネットワークが Pod に接続されます。Pod は、デフォルトネットワークで通常のクラスター関連のネットワークトラフィックを継続的に送信します。

すでに実行中の Pod に追加のネットワークを接続する場合は、Pod を再起動する必要があります。

前提条件

  • OpenShift CLI (oc) がインストールされている。
  • クラスターが実行されている。
  • Pod を接続する NetworkAttachmentDefinition オブジェクトによって定義されたネットワークが存在します。

手順

  1. Pod YAML ファイルにアノテーションを追加します。以下のアノテーション形式のいずれかのみを使用できます。

    1. カスタマイズせずに追加ネットワークを割り当てるには、以下の形式でアノテーションを追加します。<network> を、Pod に関連付ける追加ネットワークの名前に置き換えます。

      apiVersion: v1
      kind: Pod
      metadata:
        annotations:
          k8s.v1.cni.cncf.io/networks: <network>[,<network>,...] 1
      # ...
      1
      <network> を、Pod に関連付ける追加ネットワークの名前に置き換えます。複数の追加ネットワークを指定するには、各ネットワークをコンマで区切ります。コンマの間にはスペースを入れないでください。同じ追加ネットワークを複数回指定した場合、Pod は複数のネットワークインターフェイスをそのネットワークに割り当てます。

      ブリッジタイプの追加ネットワークのアノテーションの例

      apiVersion: v1
      kind: Pod
      metadata:
        annotations:
          k8s.v1.cni.cncf.io/networks: bridge-conf
      # ...

    2. カスタマイズして追加のネットワークを割り当てるには、以下の形式でアノテーションを追加します。

      apiVersion: v1
      kind: Pod
      metadata:
        annotations:
          k8s.v1.cni.cncf.io/networks: |-
            [
              {
                "name": "<network>", 1
                "namespace": "<namespace>", 2
                "default-route": ["<default-route>"] 3
              }
            ]
      # ...
      1
      NetworkAttachmentDefinition オブジェクトによって定義される追加のネットワークの名前を指定します。
      2
      NetworkAttachmentDefinition オブジェクトが定義される namespace を指定します。
      3
      オプション: 192.168.17.1 などのデフォルトルートのオーバーライドを指定します。
  2. Pod YAML ファイルを作成し、追加のネットワークの NetworkAttachmentDefinition アノテーションを追加するには、次のコマンドを実行し、サンプル YAML を使用します。

    $ oc apply -f ./<test_bridge>.yaml 1
    1
    <test-bridge> を、使用する Pod 名に置き換えます。

    出力例

    pod/test_bridge created

    test-bridge Pod YAML の例

    apiVersion: v1
    kind: Pod
    metadata:
      name: test_bridge
      annotations:
        k8s.v1.cni.cncf.io/networks: bridge-conf
      labels:
        app: test_bridge
    spec:
      terminationGracePeriodSeconds: 0
      containers:
      - name: hello-microshift
        image: quay.io/microshift/busybox:1.36
        command: ["/bin/sh"]
        args: ["-c", "while true; do echo -ne \"HTTP/1.0 200 OK\r\nContent-Length: 16\r\n\r\nHello MicroShift\" | nc -l -p 8080 ; done"]
        ports:
        - containerPort: 8080
          protocol: TCP
        securityContext:
          allowPrivilegeEscalation: false
          capabilities:
            drop:
            - ALL
          runAsNonRoot: true
          runAsUser: 1001
          runAsGroup: 1001
          seccompProfile:
            type: RuntimeDefault

  3. NetworkAttachmentDefinition アノテーションが正しいことを確認します。

    NetworkAttachmentDefinition アノテーションの例

    apiVersion: v1
    kind: Pod
    metadata:
      annotations:
        k8s.v1.cni.cncf.io/networks: bridge-conf
    # ...

  4. オプション: NetworkAttachmentDefinition アノテーションが Pod YAML に存在することを確認するには、<name> を Pod の名前に置き換えて次のコマンドを実行します。

    $ oc get pod <name> -o yaml 1
    1
    <name> を、使用する Pod 名に置き換えます。以下の例では、test-bridge が使用されます。

    次の例では、test-bridgenet1 の追加ネットワークに接続されています。

    $ oc get pod <test_bridge> -o yaml

    出力例

    apiVersion: v1
    kind: Pod
    metadata:
      annotations:
        k8s.v1.cni.cncf.io/networks: bridge-conf
        k8s.v1.cni.cncf.io/network-status: |- 1
          [{
              "name": "ovn-kubernetes",
              "interface": "eth0",
              "ips": [
                  "10.42.0.18"
              ],
              "default": true,
              "dns": {}
          },{
              "name": "bridge-conf",
              "interface": "net1",
              "ips": [
                  "20.2.2.100"
              ],
              "mac": "22:2f:60:a5:f8:00",
              "dns": {}
          }]
      name: pod
      namespace: default
    spec:
    # ...
    status:
    # ...

    1
    k8s.v1.cni.cncf.io/network-status パラメーターは、オブジェクトの JSON 配列です。各オブジェクトは、Pod に割り当てられる追加のネットワークのステータスを説明します。アノテーションの値はプレーンテキストの値として保存されます。
  5. 以下のコマンドを使用して、Pod が実行されていることを確認します。

    $ oc get pod

    出力例

    NAME          READY   STATUS    RESTARTS   AGE
    test_bridge   1/1     Running   0          81s

5.2.4. 追加のネットワークの設定

NetworkAttachmentDefinition オブジェクトを作成して適用した後、次の例の手順に従って追加のネットワークを設定します。この例では、bridge タイプの追加ネットワークが使用されます。このワークフローは、他の追加のネットワークタイプにも使用できます。

前提条件

  1. NetworkAttachmentDefinition オブジェクト設定を作成して適用しました。

手順

  1. 以下のコマンドを実行して、ブリッジがホストに作成されていることを確認します。

    $ ip a show br-test

    出力例

    22: br-test: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
        link/ether 96:bf:ca:be:1d:15 brd ff:ff:ff:ff:ff:ff
        inet6 fe80::34e2:bbff:fed2:31f2/64 scope link
           valid_lft forever preferred_lft forever

  2. 次のコマンドを実行して、ブリッジの IP アドレスを設定します。

    $ sudo ip addr add 10.10.0.10/24 dev br-test
  3. 次のコマンドを実行して、IP アドレス設定がブリッジに追加されたことを確認します。

    $ ip a show br-test

    出力例

    22: br-test: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
        link/ether 96:bf:ca:be:1d:15 brd ff:ff:ff:ff:ff:ff
        inet 10.10.0.10/24 scope global br-test 1
           valid_lft forever preferred_lft forever
        inet6 fe80::34e2:bbff:fed2:31f2/64 scope link
           valid_lft forever preferred_lft forever

    1
    IP アドレスは想定どおりに設定されています。
  4. 次のコマンドを実行して、Pod の IP アドレスを確認します。

    $ oc get pod test-bridge --output=jsonpath='{.metadata.annotations.k8s\.v1\.cni\.cncf\.io/network-status}'

    出力例

    [{
        "name": "ovn-kubernetes",
        "interface": "eth0",
        "ips": [
            "10.42.0.17"
        ],
        "mac": "0a:58:0a:2a:00:11",
        "default": true,
        "dns": {}
    },{
        "name": "default/bridge-conf", 1
        "interface": "net1",
        "ips": [
            "10.10.0.20"
        ],
        "mac": "82:01:98:e5:0c:b7",
        "dns": {}

    1
    ブリッジの追加ネットワークは想定どおりに接続されます。
  5. オプション: oc exec を使用して Pod にアクセスし、ip コマンドを使用してそのインターフェイスを確認できます。

    $ oc exec -ti test-bridge -- ip a

    出力例

    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue 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
    2: eth0@if21: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
        link/ether 0a:58:0a:2a:00:11 brd ff:ff:ff:ff:ff:ff
        inet 10.42.0.17/24 brd 10.42.0.255 scope global eth0
           valid_lft forever preferred_lft forever
        inet6 fe80::858:aff:fe2a:11/64 scope link
           valid_lft forever preferred_lft forever
    3: net1@if23: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
        link/ether 82:01:98:e5:0c:b7 brd ff:ff:ff:ff:ff:ff
        inet 10.10.0.20/24 brd 10.10.0.255 scope global net1 1
           valid_lft forever preferred_lft forever
        inet6 fe80::8001:98ff:fee5:cb7/64 scope link
           valid_lft forever preferred_lft forever

    1
    予想どおり、Pod は net1 インターフェイス 上の 10.10.0.20 IP アドレスに接続されます。
  6. MicroShift ホストから Pod 内の HTTP サーバーにアクセスして、接続が期待どおりに機能していることを確認します。以下のコマンドを使用します。

    $ curl 10.10.0.20:8080

    出力例

    Hello MicroShift

5.2.5. 追加ネットワークからの Pod の削除

Pod を削除するだけで、追加のネットワークから Pod を削除できます。

前提条件

  • 追加のネットワークが Pod に割り当てられている。
  • OpenShift CLI (oc) がインストールされている。
  • クラスターにログインする。

手順

  • Pod を削除するには、以下のコマンドを入力します。

    $ oc delete pod <name> -n <namespace>
    • <name> は Pod の名前です。
    • <namespace> は Pod が含まれる namespace です。

5.2.6. Multus ネットワークのトラブルシューティング

複数のネットワークの設定が適切に設定されていない場合、Pod が起動に失敗する可能性があります。次の手順は、いくつかの一般的なシナリオを解決するのに役立ちます。

5.2.6.1. Pod のネットワークを設定できない

Multus CNI プラグインが Pod にネットワークアノテーションを適用できない場合、Pod は起動しません。追加のネットワーク CNI のいずれかが失敗した場合、Pod も起動に失敗する可能性があります。

エラーの例

Warning  NoNetworkFound     0s     multus    cannot find a network-attachment-definitio (asdasd) in namespace (default): network-attachment-definitions.k8s.cni.cncf.io "bad-ref-doesnt-exist" not found

この場合、CNI 障害を解決するには次の手順を実行できます。

  • NetworkAttachmentDefinitions とアノテーションの両方の値を確認します。
  • アノテーションを削除して、デフォルトネットワークのみで Pod が正常に作成されたかどうかを確認します。そうでない場合は、Multus 設定以外のネットワークの問題を示している可能性があります。
  • デバイス管理者の場合は、kubelet によって生成されたログに特に注意しながら、crio.service または microshift.service ログを確認してください。

    たとえば、kubelet からの以下のエラーは、プライマリー CNI が実行されていないことを示しています。この状況は、Pod が起動していないこと、または cni_default_network 設定が正しくないことなどの CRI-O の設定ミスが原因で発生する可能性があります。

    kubelet が生成したエラーの例

    Feb 06 13:47:31 dev microshift[1494]: kubelet E0206 13:47:31.163290    1494 pod_workers.go:1298] "Error syncing pod, skipping" err="network is not ready: container runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:Network plugin returns error: No CNI configuration file in /etc/cni/net.d/. Has your network provider started?" pod="default/samplepod" podUID="fe0f7f7a-8c47-4488-952b-8abc0d8e2602"

5.2.6.2. 設定ファイルがない

アノテーションが存在しない NetworkAttachmentDefinition 設定 YAML を参照しているため、Pod を作成できない場合があります。この場合、通常次のようなエラーが発生します。

ログの例

cannot find a network-attachment-definition (bad-conf) in namespace (default): network-attachment-definitions.k8s.cni.cncf.io "bad-conf" not found" pod="default/samplepod"`

エラー出力の例

"CreatePodSandbox for pod failed" err="rpc error: code = Unknown desc = failed to create pod network sandbox k8s_samplepod_default_5fa13105-1bfb-4c6b-aee7-3437cfb50e25_0(7517818bd8e85f07b551f749c7529be88b4e7daef0dd572d049aa636950c76c6): error adding pod default_samplepod to CNI network \"multus-cni-network\": plugin type=\"multus\" name=\"multus-cni-network\" failed (add): Multus: [default/samplepod/5fa13105-1bfb-4c6b-aee7-3437cfb50e25]: error loading k8s delegates k8s args: TryLoadPodDelegates: error in getting k8s network for pod: GetNetworkDelegates: failed getting the delegate: getKubernetesDelegate: cannot find a network-attachment-definition (bad-conf) in namespace (default): network-attachment-definitions.k8s.cni.cncf.io \"bad-conf\" not found" pod="default/samplepod"

このエラーを修正するには、NetworkAttachmentDefinitions YAML を作成し、適用します。

5.2.7. 関連情報

Red Hat logoGithubRedditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

© 2024 Red Hat, Inc.