Multus CNI の連携
    • PDF

    Multus CNI の連携

    • PDF

    Article Summary

    VPC環境で利用できます。

    Multus CNIを使用して多重ネットワークインターフェースを保有する Podの作成方法を説明します。

    Multus CNIの紹介

    Multus CNIは単一 Podに複数のネットワークインターフェースを接続し、それぞれ異なるアドレス範囲で接続できるようにする高度なネットワークの構成機能を提供する CNIプラグインです。

    • Kubernetesで各 Podは基本的に Loopback以外に一つのネットワークインターフェースだけを保有します。Multus CNIを利用すると複数のインターフェースがある Multi-Home Podが作成できます。
    • Multus CNIは他の CNIプラグインを呼び出しできる一種のメタプラグインのロールをします。したがって、Multus CNIと連携する他の CNIを必要とします。
    参考

    Multus CNIの詳しい説明は、Multus CNI保存場所をご参照ください。

    Multus CNIのインストール

    Multus CNIをインストールする方法は、次の通りです。

    1. 以下のコマンドで Cilium CNIの CNI-Exclusiveモードを無効にします。

      kubectl patch daemonset cilium -n kube-system --type='json' -p='[{"op": "replace", "path": "/spec/template/spec/containers/0/lifecycle/postStart/exec/command/2", "value": "--cni-exclusive=false"}]'
      
    2. Multus CNIの Github保存場所をクローンし、Daemonsetをインストールします。

      git clone https://github.com/k8snetworkplumbingwg/multus-cni.git && cd multus-cni
      cat ./deployments/multus-daemonset.yml | kubectl apply -f -
      
      • Multus Daemonsetは各ワーカーノードで Multusの実行ファイルを/opt/cni/binの位置に配置します。そして、CNI構成のための /etc/cni/net.d/00-multus.conf設定ファイルを作成’します。
      • kubectl get pods --all-namespaces | grep -i multusで各ノードに Multus Podが正常に実行されたか確認できます。
      • Multus CNIを通じて連携する ipvlanをワーカーノードにダウンロードします。
        root@afaf-w-1vhl:~# curl -L https://github.com/containernetworking/plugins/releases/download/v1.2.0/cni-plugins-linux-amd64-v1.2.0.tgz | tar zx -C /opt/cni/bin ./host-local ./ipvlan
        
    3. 追加インターフェースを作成します。

      • Serverご利用ガイドの Network Interfaceを参照してネットワークインターフェースを作成した後、次のワーカーノードに割り当てます。
      • 作成されたインターフェースに Secondary IPアドレスを割り当てます。この時、Secondary IPは連続した IPアドレスで構成する必要があります。
      • 以下のように eth1インターフェースの作成が成功しているか確認できます。
        root@afaf-w-1vhl:~# ip a
        ...
        2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc mq state UP group default qlen 1000
            link/ether f2:20:af:24:62:41 brd ff:ff:ff:ff:ff:ff
            inet 192.168.1.104/26 brd 192.168.1.127 scope global eth0
            valid_lft forever preferred_lft forever
        1304: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
            link/ether f2:20:af:a6:0a:e2 brd ff:ff:ff:ff:ff:ff
            inet 192.168.0.12/24 brd 192.168.0.255 scope global eth1
            valid_lft forever preferred_lft forever
        
    4. Network Attachment Definition CRDを作成します。

      • Podで使用する追加 ipvlanインターフェースのための設定を提供するため、Network Attachment Definitionを作成します。Network Attachment Definitionはネットワークを Podに接続する方法を定義する Custom Resource Definitionです。
      • 次のように ipvlanを使用するための設定を作成します。
        apiVersion: "k8s.cni.cncf.io/v1"
        kind: NetworkAttachmentDefinition
        metadata:
          name: ipvlan-conf-1
        spec:
          config: '{
            "cniVersion": "0.3.0",
            "type": "ipvlan",
            "master": "eth1",
            "mode": "l3",
            "ipam": {
                "type": "host-local",
                "subnet": "192.168.1.0/24",
                "rangeStart": "192.168.1.13",
                "rangeEnd": "192.168.1.17",
                "gateway": "192.168.1.1"
            }
          }'
        
      • rangeStart、rangeEndを利用して、先ほどインターフェースに割り当てられた Secondary IPアドレス帯域を指定します。
      • kubectl get network-attachment-definitionsを通じて作成された設定を確認できます。
      • 本ユースケースで使用された host-local ipamはノード単位で IPアドレスプールを管理します。クラスタ範囲全体の IPアドレスプールが必要な場合、whereabouts ipamを使用します。

    Multus CNIの連携

    Multus CNIを連携する方法は次の通りです。

    1. 追加インターフェースを使用する Podを作成します。

      • これで追加インターフェースを使う Podを作成できます。使用する追加インターフェースは、k8s.v1.cni.cncf.io/networksアノテーションで指定できます。当該フィールドに指定される名前は先に作成した Network Attachment Definitionの名前です。
      • 複数のインターフェースを接続するには、このアノテーションにカンマを区切り文字として複数のネットワーク設定を指定します。
      apiVersion: v1
      kind: Pod
      metadata:
        name: sampleapp-1
        annotations:
          k8s.v1.cni.cncf.io/networks: ipvlan-conf-1
      spec:
        containers:
        - name: multitool
          command: ["sh", "-c", "trap : TERM INT; sleep infinity & wait"]
          image: praqma/network-multitool
      ---
      apiVersion: v1
      kind: Pod
      metadata:
        name: sampleapp-2
        annotations:
          k8s.v1.cni.cncf.io/networks: ipvlan-conf-1
      spec:
        containers:
        - name: multitool
          command: ["sh", "-c", "trap : TERM INT; sleep infinity & wait"]
          image: praqma/network-multitool
      
    2. 追加インターフェースを確認します。

      • kubectl describe pod sampleapp-1で k8s.v1.cni.cncf.io/network-statusアノテーションがすべてのネットワークインターフェースを表示していることを確認します。
        $ kubectl describe pod sampleapp-1
        Name:         sampleapp-1
        Namespace:    default
        Priority:     0
        Node:         afaf-w-293f/192.168.1.104
        Start Time:   Mon, 06 Feb 2023 16:18:38 +0900
        Labels:       <none>
        Annotations:  k8s.v1.cni.cncf.io/networks: ipvlan-conf-1
                    k8s.v1.cni.cncf.io/networks-status:
                        [{
                            "name": "cilium",
                            "interface": "eth0",
                            "ips": [
                                "198.18.1.173"
                            ],
                            "mac": "12:7d:62:5b:2e:57",
                            "default": true,
                            "dns": {}
                        },{
                            "name": "default/ipvlan-conf-1",
                            "interface": "net1",
                            "ips": [
                                "192.168.1.13"
                            ],
                            "mac": "f2:20:af:a6:0a:e2",
                            "dns": {}
                        }]
        
      • 実際に Podに接続された追加インターフェース(net1)が上記の IPアドレスで実行中か確認します。
        $ kubectl exec -it sampleapp-1 -- ip a
        ...
        2: net1@if1304: <BROADCAST,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default
            link/ether f2:20:af:a6:0a:e2 brd ff:ff:ff:ff:ff:ff
            inet 192.168.1.13/24 brd 192.168.1.255 scope global net1
            valid_lft forever preferred_lft forever
        1975: eth0@if1976: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue state UP group default
            link/ether 12:7d:62:5b:2e:57 brd ff:ff:ff:ff:ff:ff link-netnsid 0
            inet 198.18.1.173/32 scope global eth0
            valid_lft forever preferred_lft forever
        
      • 追加された net1インターフェースのルーティング情報と通信可否を確認します。
        # kubectl exec -it sampleapp-1 -- route -n
        Kernel IP routing table
        Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
        0.0.0.0         198.18.1.209    0.0.0.0         UG    0      0        0 eth0
        192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 net1
        198.18.1.209    0.0.0.0         255.255.255.255 UH    0      0        0 eth0
        
        # kubectl exec -it sampleapp-1 -- ping -I net1 192.168.1.14
        PING 192.168.1.14 (192.168.1.14) from 192.18.1.13 net1: 56(84) bytes of data.
        64 bytes from 192.168.1.14: icmp_seq=1 ttl=64 time=0.055 ms
        64 bytes from 192.168.1.14: icmp_seq=2 ttl=64 time=0.055 ms
        

    注意事項

    手動で追加された Network Interfaceは、新しく増設されるワーカーノードには適用されません。また、ノードプールを変更する過程で追加 Network Interfaceが割り当てられたワーカーノードから削除される場合、運用中の Podに影響を与えることがあります。


    この記事は役に立ちましたか?

    Changing your password will log you out immediately. Use the new password to log back in.
    First name must have atleast 2 characters. Numbers and special characters are not allowed.
    Last name must have atleast 1 characters. Numbers and special characters are not allowed.
    Enter a valid email
    Enter a valid password
    Your profile has been successfully updated.