6.3. 追加のネットワークインターフェースの作成
Pod の追加インターフェースは、カスタムリソース (CR) として保存される CNI 設定で定義されます。これらの CR は、oc
ツールを使用して作成し、一覧表示し、編集し、削除できます。
以下の手順は、Pod に macvlan
インターフェースを設定します。この設定は、すべての実稼働環境に適用されない可能性がありますが、他の CNI プラグインに同じ手順を使用できます。
6.3.1. 追加インターフェースの CNI 設定の CR としての作成
追加インターフェースを Pod に割り当てる必要がある場合、インターフェースを定義する CR は Pod と同じプロジェクト (namespace) に置かれる必要があります。
CNI 設定を CR として保存するプロジェクト、およびその CR を使用する Pod を作成します。
$ oc new-project multinetwork-example
追加のネットワークインターフェースを定義する CR を作成します。以下の内容を含む、
macvlan-conf.yaml
という YAML ファイルを作成します。apiVersion: "k8s.cni.cncf.io/v1" kind: NetworkAttachmentDefinition 1 metadata: name: macvlan-conf 2 spec: config: '{ 3 "cniVersion": "0.3.0", "type": "macvlan", "master": "eth0", "mode": "bridge", "ipam": { "type": "host-local", "subnet": "192.168.1.0/24", "rangeStart": "192.168.1.200", "rangeEnd": "192.168.1.216", "routes": [ { "dst": "0.0.0.0/0" } ], "gateway": "192.168.1.1" } }'
設定はプラグインに固有のものです。CNI 設定部分の
type
行に注意してください。CNI 設定の部分のtype
行をメモしてください。 この例では、ネットワーク用の IPAM (IP アドレス管理) パラメーターのほかに、master
フィールドは、Pod をホストするノードにあるネットワークインターフェースを参照する必要があります。以下のコマンドを実行して CR を作成します。
$ oc create -f macvlan-conf.yaml
この例は、macvlan
CNI プラグインをベースにしています。AWS 環境では、macvlan トラフィックはフィルターされる可能性があるため、必要な宛先に到達しない可能性があります。
6.3.2. 追加インターフェースの CR の管理
追加インターフェースの CR は、oc
CLI を使用して管理できます。
以下のコマンドを使用して、追加リソースの CR を一覧表示します。
$ oc get network-attachment-definitions.k8s.cni.cncf.io
以下のコマンドを使用して、追加インターフェースの CR を削除します。
$ oc delete network-attachment-definitions.k8s.cni.cncf.io macvlan-conf
6.3.3. CR を使用するアノテーション付き Pod の作成
追加インターフェースを使用する Pod を作成するには、CR を参照するアノテーションを使用します。以下の内容を含む Pod についての samplepod.yaml
という YAML ファイルを作成します。
apiVersion: v1
kind: Pod
metadata:
name: samplepod
annotations:
k8s.v1.cni.cncf.io/networks: macvlan-conf 1
spec:
containers:
- name: samplepod
command: ["/bin/bash", "-c", "sleep 2000000000000"]
image: centos/tools
- 1
annotations
フィールドには、k8s.v1.cni.cncf.io/networks: macvlan-conf
が含まれます。 これは、先に定義した CR のname
フィールドに相関します。
以下のコマンドを実行して samplepod
Pod を作成します。
$ oc create -f samplepod.yaml
追加のネットワークインターフェースが作成され、Pod に割り当てられているのを確認するには、以下のコマンドを使用して IPv4 アドレス情報を一覧表示します。
$ oc exec -it samplepod -- ip -4 addr
3 つのインターフェースが出力に一覧表示されます。
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000 1 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 3: eth0@if6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP link-netnsid 0 2 inet 10.244.1.4/24 scope global eth0 valid_lft forever preferred_lft forever 4: net1@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN link-netnsid 0 3 inet 192.168.1.203/24 scope global net1 valid_lft forever preferred_lft forever
6.3.3.1. 複数インターフェースの Pod への割り当て
複数の追加インターフェースを Pod に割り当てるには、複数の名前を、Pod 定義の annotations
フィールドにカンマ区切りの形式で指定します。
Pod 定義の以下の annotations
フィールドは、追加インターフェースの複数の異なる CR を指定します。
annotations: k8s.v1.cni.cncf.io/networks: macvlan-conf, tertiary-conf, quaternary-conf
Pod 定義の以下の annotations
フィールドは、追加インターフェースに同じ CR を指定します。
annotations: k8s.v1.cni.cncf.io/networks: macvlan-conf, macvlan-conf
6.3.4. 実行中の Pod のインターフェース設定の表示
Pod の実行後に、作成された追加インターフェースの設定を確認できます。先の例と同じ Pod を表示するには、以下のコマンドを実行します。
$ oc describe pod samplepod
出力の metadata
セクションには、JSON 形式で表示されるアノテーションの一覧が含まれます。
Annotations: k8s.v1.cni.cncf.io/networks: macvlan-conf k8s.v1.cni.cncf.io/networks-status: [{ "name": "openshift-sdn", "ips": [ "10.131.0.10" ], "default": true, "dns": {} },{ "name": "macvlan-conf", 1 "interface": "net1", 2 "ips": [ 3 "192.168.1.200" ], "mac": "72:00:53:b4:48:c4", 4 "dns": {} 5 }]
最初のアノテーション k8s.v1.cni.cncf.io/networks: macvlan-conf
は、例で作成された CR を参照します。このアノテーションは Pod 定義で指定されています。
2 つ目のアノテーションは、 k8s.v1.cni.cncf.io/networks-status
です。k8s.v1.cni.cncf.io/networks-status
には 2 つのインターフェースが一覧表示されます。
-
最初のインターフェースは、デフォルトネットワーク
openshift-sdn
のインターフェースを記述します。このインターフェースはeth0
として作成されます。これは、クラスター内の通信に使用されます。 -
2 つ目のインターフェースは、作成した追加インターフェース
net1
です。上記の出力は、Pod に割り当てられた IP アドレスなど、インターフェースの作成時に設定されたいくつかのキーの値を一覧表示しています。