Multus CNI の連携
- 印刷する
- PDF
Multus CNI の連携
- 印刷する
- PDF
記事の要約
この要約は役に立ちましたか?
ご意見ありがとうございます
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をインストールする方法は、次の通りです。
以下のコマンドで 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"}]'
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
追加インターフェースを作成します。
- 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
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を連携する方法は次の通りです。
追加インターフェースを使用する 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
追加インターフェースを確認します。
- 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
- kubectl describe pod sampleapp-1で k8s.v1.cni.cncf.io/network-statusアノテーションがすべてのネットワークインターフェースを表示していることを確認します。
注意事項
手動で追加された Network Interfaceは、新しく増設されるワーカーノードには適用されません。また、ノードプールを変更する過程で追加 Network Interfaceが割り当てられたワーカーノードから削除される場合、運用中の Podに影響を与えることがあります。
この記事は役に立ちましたか?