Whereabouts は IP アドレス管理 (IPAM) CNI プラグインで、クラスタ内のすべてのノードのポッドに IP アドレスを動的に割り当てます。同じノード上のポッドにのみ IP アドレスを割り当てる host-local
などのその他の IP アドレス管理プラグインと比べて、whereabouts
はクラスタ全体に IP アドレスを割り当てます。
このトピックでは、whereabouts
を使用して指定した範囲内で IP アドレスが割り当てられたポッドにセカンダリ ネットワーク インターフェイスを接続する方法について説明します。たとえば、プライマリ CNI として Antrea または Calico、macvlan または ipvlan を使用して作成されたセカンダリ インターフェイス、および IP アドレス管理 CNI としての Whereabouts を指定します。
kubectl
。large
または extra-large
のワークロード クラスタ ワーカー ノードが必要です。ワークロード クラスタに Whereabouts パッケージをインストールし、それを使用するようにクラスタを構成するには、次の手順を実行します。
Whereabout を構成してインストールします。
Whereabouts パラメータを取得する構成ファイルを作成します。
tanzu package available get whereabouts.tanzu.vmware.com/PACKAGE-VERSION --default-values-file-output FILE-PATH
注
whereabouts
コンポーネントを展開する名前空間はkube-system
である必要があります。カスタマイズされた名前空間のインストールは失敗します。
ここで、PACKAGE-VERSION
はインストールする Whereabouts パッケージのバージョンで、FILE-PATH
は whereabouts-data-values.yaml
などの構成ファイルを保存する場所です。上記のコマンドを実行すると、デフォルト値を含む whereabouts-data-values.yaml
という名前の構成ファイルが作成されます。
次のように、tanzu package available list
コマンドを実行して、Whereabouts パッケージの使用可能なバージョンを一覧表示します。
tanzu package available list whereabouts.tanzu.vmware.com -A
NAME VERSION RELEASED-AT NAMESPACE
whereabouts.tanzu.vmware.com 0.5.1+vmware.2-tkg.1 2022-30-04 18:00:00 +0000 UTC tanzu-package-repo-global
注ネットワークが制限された環境で動作している場合は、カスタム イメージ レジストリにアクセスできることを確認します。
--values-schema
を使用して tanzu package available get
コマンドを実行し、設定可能なフィールド値を確認します。
tanzu package available get whereabouts.tanzu.vmware.com/VERSION --values-schema -o FORMAT
ここで、- VERSION
は、tanzu package available list
出力 - FORMAT
は、yaml
または json
に表示されるバージョンです
whereabouts-data-values.yaml
構成ファイルに必要なフィールド値を入力します。
whereabouts-data-values.yaml
ファイルからすべてのコメントを削除します。
yq -i eval '... comments=""' whereabouts-cni-default-values.yaml
tanzu package install
を実行してパッケージをインストールします。
tanzu package install whereabouts --package whereabouts.tanzu.vmware.com --version AVAILABLE-PACKAGE-VERSION --values-file whereabouts-data-values.yaml --namespace TARGET-NAMESPACE
ここで、
TARGET-NAMESPACE
は、Whereabouts パッケージをインストールする名前空間です。たとえば、my-packages
または tanzu-cli-managed-packages
名前空間などです。
--namespace
フラグが指定されていない場合、Tanzu CLI は default
名前空間にパッケージをインストールします。kubectl create namespace my-packages
を実行することによってすでに存在している必要があります。AVAILABLE-PACKAGE-VERSION
は、前述の手順で取得したバージョンです。例:0.5.1+vmware.2-tkg.1
。tanzu package installed get
を実行して、インストール済みパッケージのステータスを確認します。
tanzu package installed get whereabouts -o <json|yaml|table>
NetworkAttachmentDefinition
のカスタム リソース定義 (CRD) を作成します。この CRD は、Whereabouts を IP アドレス管理タイプとして使用する Multus CNI で使用されるネットワーク インターフェイスの CNI 構成を定義します。
CRD 仕様を作成します。たとえば、この multus-cni-crd.yaml
は、macvlan
CNI を構成し、whereabouts
を IP アドレス管理タイプとして持つ macvlan-conf
という名前の NetworkAttachmentDefinition
を指定します。
---
apiVersion: "k8s.cni.cncf.io/v1"
kind: NetworkAttachmentDefinition
metadata:
name: macvlan-conf
spec:
config: '{
"cniVersion": "0.3.1",
"plugins": [
{
"type": "macvlan",
"capabilities": { "ips": true },
"master": "eth0",
"mode": "bridge",
"ipam": {
"type": "whereabouts",
"range": "192.168.20.0/24",
"range_start": "192.168.20.10",
"range_end": "192.168.20.100",
"gateway": "192.168.20.1"
}
} ]
}'
リソースを作成します(例:kubectl create -f multus-cni-crd.yaml
)。
注釈 k8s.v1.cni.cncf.io/networks
を使用してポッドを作成し、追加するネットワークを指定します。
ポッド仕様を作成します(例:my-multi-cni-pod.yaml
)。
apiVersion: v1
kind: Pod
metadata:
name: pod0
annotations:
k8s.v1.cni.cncf.io/networks: macvlan-conf
spec:
containers:
- name: pod0
command: ["/bin/ash", "-c", "trap : TERM INT; sleep infinity & wait"]
image: docker.io/kserving/tools:latest
ポッドを作成します。たとえば、kubectl create -f my-multi-cni-crd.yaml
はポッド pod0
を作成します。
ポッドが作成されると、次の 3 つのネットワーク インターフェイスが作成されます。
lo
:ループバック インターフェイスeth0
:Antrea または Calico CNI によって管理されるデフォルトのポッド ネットワークnet1
:注釈 k8s.v1.cni.cncf.io/networks: macvlan-conf
を介して作成された新しいインターフェイス。注デフォルトのネットワークは
eth0
という名前を取得し、追加のネットワーク ポッド インターフェイスはnet1
、net2
などの名前を取得します。
pod0
で kubectl describe pod
を実行し、注釈 k8s.v1.cni.cncf.io/network-status
にすべてのネットワーク インターフェイスが一覧表示されていることを確認します。
例:
$ kubectl describe pod pod0
Name: pod0
Namespace: default
Priority: 0
Node: tcecluster-md-0-6476897f75-rl9vt/10.170.109.225
Start Time: Thu, 25 August 2022 15:31:20 +0000
Labels: <none>
Annotations: k8s.v1.cni.cncf.io/network-status:
[{
"name": "",
"interface": "eth0",
"ips": [
"100.96.1.80"
],
"mac": "66:39:dc:63:50:a3",
"default": true,
"dns": {}
},{
"name": "default/macvlan-conf",
"interface": "net1",
"ips": [
"192.168.20.11"
],
"mac": "02:77:cb:a0:60:e3",
"dns": {}
}]
k8s.v1.cni.cncf.io/networks: macvlan-conf
次に、kubectl exec sample-pod -- ip a show dev net1
を実行して、上記の注釈にリストされている IP アドレスを使用してターゲット インターフェイスが起動し、実行されているかどうかを確認します。この手順を繰り返して、次の手順で作成する他のポッドの構成を検証します。
同じノードに pod1
、別のノードに pod2
の 2 つの追加ポッドを作成します。これらのポッドを使用して、クラスタ全体の単一ノードおよびノード内のネットワーク アクセスを確認します。
同じノード内のポッドとクラスタ全体のポッド間のネットワーク アクセスを確認できるようになりました。
同じノード上のポッド間のネットワーク アクセスが機能することを確認します。たとえば、次のコマンドは、pod0
が割り当てられた IP アドレスを介して pod1
にアクセスできることを確認します。
kubectl exec -it pod0 -- ping -c 3 192.168.20.12
PING 192.168.20.12 (192.168.20.12) 56(84) bytes of data.
64 bytes from 192.168.20.12: icmp_seq=1 ttl=64 time=0.237 ms
64 bytes from 192.168.20.12: icmp_seq=2 ttl=64 time=0.215 ms
64 bytes from 192.168.20.12: icmp_seq=3 ttl=64 time=0.156 ms
--- 192.168.20.12 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2030ms
rtt min/avg/max/mdev = 0.156/0.202/0.237/0.037 ms
異なるノードのポッド間のネットワーク アクセスが機能することを確認します。たとえば、次のコマンドは、pod0
が割り当てられた IP アドレスを介して pod2
にアクセスできることを確認します。
kubectl exec -it pod0 -- ping -c 3 <192.168.20.13
PING 192.168.20.13 (192.168.20.13) 56(84) bytes of data.
64 bytes from 192.168.20.13: icmp_seq=1 ttl=64 time=0.799 ms
64 bytes from 192.168.20.13: icmp_seq=2 ttl=64 time=0.626 ms
64 bytes from 192.168.20.13: icmp_seq=3 ttl=64 time=0.655 ms
--- 192.168.20.13 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2030ms
rtt min/avg/max/mdev = 0.626/0.693/0.799/0.078 ms