5.2. 複数のネットワークの設定と使用
MicroShift Multus Container Network Interface (CNI) をインストールした後、設定を使用して他のネットワークプラグインを使用できます。
5.2.1. IP アドレス管理タイプと追加ネットワーク
IP アドレスは、設定した IP アドレス管理 (IPAM) CNI プラグインを通じて追加のネットワークにプロビジョニングされます。MicroShift でサポートされている IP アドレスのプロビジョニングタイプは host-local
、static
、および 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) を使用するここでのサンプルワークフローを使用して、サポートされているその他の追加ネットワークタイプを設定することもできます。
bridge
と dhcp
IPAM を使用する場合は、ブリッジされたネットワークでリッスンする DHCP サーバーが必要です。ファイアウォールも使用している場合は、ネットワークゾーンで DHCP トラフィックを許可するように firewalld サービスを設定することも必要です。この場合は、firewall-cmd --remove-service=dhcp
コマンドを実行できます。
前提条件
- MicroShift Multus CNI がインストールされている。
-
OpenShift CLI (
oc
) がインストールされている。 - クラスターが実行されている。
手順
オプション: 次のコマンドを実行して、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
次のコマンドを実行し、次のサンプルファイルを参照して
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" } }'
注記ブリッジの名前の使用は、プラグインの
bridge
タイプに固有です。他のプラグインはNetworkAttachmentDefinitions
で異なるフィールドを使用します。たとえば、macvlan
およびipvlan
設定はmaster
を使用して、割り当てるホストインターフェイスを指定します。
5.2.3. Pod の追加ネットワークへの追加
Pod を追加のネットワークに追加できます。Pod が作成されると、追加のネットワークが Pod に接続されます。Pod は、デフォルトネットワークで通常のクラスター関連のネットワークトラフィックを継続的に送信します。
すでに実行中の Pod に追加のネットワークを接続する場合は、Pod を再起動する必要があります。
前提条件
-
OpenShift CLI (
oc
) がインストールされている。 - クラスターが実行されている。
-
Pod を接続する
NetworkAttachmentDefinition
オブジェクトによって定義されたネットワークが存在します。
手順
Pod
YAML ファイルにアノテーションを追加します。以下のアノテーション形式のいずれかのみを使用できます。カスタマイズせずに追加ネットワークを割り当てるには、以下の形式でアノテーションを追加します。
<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 # ...
カスタマイズして追加のネットワークを割り当てるには、以下の形式でアノテーションを追加します。
apiVersion: v1 kind: Pod metadata: annotations: k8s.v1.cni.cncf.io/networks: |- [ { "name": "<network>", 1 "namespace": "<namespace>", 2 "default-route": ["<default-route>"] 3 } ] # ...
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
NetworkAttachmentDefinition
アノテーションが正しいことを確認します。NetworkAttachmentDefinition
アノテーションの例apiVersion: v1 kind: Pod metadata: annotations: k8s.v1.cni.cncf.io/networks: bridge-conf # ...
オプション:
NetworkAttachmentDefinition
アノテーションがPod
YAML に存在することを確認するには、<name>
を Pod の名前に置き換えて次のコマンドを実行します。$ oc get pod <name> -o yaml 1
- 1
<name>
を、使用する Pod 名に置き換えます。以下の例では、test-bridge が使用されます。
次の例では、
test-bridge
がnet1
の追加ネットワークに接続されています。$ 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 に割り当てられる追加のネットワークのステータスを説明します。アノテーションの値はプレーンテキストの値として保存されます。
以下のコマンドを使用して、Pod が実行されていることを確認します。
$ oc get pod
出力例
NAME READY STATUS RESTARTS AGE test_bridge 1/1 Running 0 81s
5.2.4. 追加のネットワークの設定
NetworkAttachmentDefinition オブジェクトを作成して適用した後、次の例の手順に従って追加のネットワークを設定します。この例では、bridge
タイプの追加ネットワークが使用されます。このワークフローは、他の追加のネットワークタイプにも使用できます。
前提条件
-
NetworkAttachmentDefinition
オブジェクト設定を作成して適用しました。
手順
以下のコマンドを実行して、ブリッジがホストに作成されていることを確認します。
$ 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
次のコマンドを実行して、ブリッジの IP アドレスを設定します。
$ sudo ip addr add 10.10.0.10/24 dev br-test
次のコマンドを実行して、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 アドレスは想定どおりに設定されています。
次のコマンドを実行して、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
- ブリッジの追加ネットワークは想定どおりに接続されます。
オプション:
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 アドレスに接続されます。
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 を作成し、適用します。