TKG 1.6 で Whereabouts を検証してみる

# はじめに
本記事は、「[TUNA-JP Advent Calendar 2022](https://qiita.com/advent-calendar/2022/tuna-jp)」20日目のエントリです。

こんにちは、@yama-s です。
本日は以下についてご紹介します！

* **Whereabouts**

# Whereabouts とは
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2317898/95bade8d-a81f-81f5-d018-5617da439321.png)

TKG 1.6 リリースより **Whereabouts** がプラグインとして導入可能となりました。**Whereabouts** とは所在、居場所などを意味する単語です。
**Whereabouts** は クラスター全体に IP アドレスを割り当てる IP アドレス管理 (IPAM) CNI プラグインとして動作するものです。
# Whereabouts の役割
TKG で Multus によって与えられる2つ目の NIC に与える IP アドレスを動的に管理できます。
Multus でもレンジで管理しているのになぜ必要なのでしょうか？
Multus の IP 管理を `host-local` で指定している場合、ホスト間での重複が許されてしまうため、バッティングの危険性があります。
Whereabouts を使えば DHCP を利用せずに簡単に動的に IP 管理ができます。


# 導入方法
**Multus** が導入の前提条件となっています。
**Multus** については昨年のアドベントカレンダーの記事にもなっていますので [こちら](https://qiita.com/tarowork64/items/c0aad20bfa5c4d5672c7) をご確認ください。


まず、`tanzu package` コマンドを使用して、利用可能な whereabouts のバージョンを確認します。
```
user@boot:~$ 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-08-26 07:44:23 +0900 JST  tanzu-package-repo-global
user@boot:~$
```

確認した内容を元に、whereabouts をインストールします。
```
user@boot:~$ tanzu package install whereabouts --package-name whereabouts.tanzu.vmware.com --version 0.5.1+vmware.2-tkg.1
 Installing package 'whereabouts.tanzu.vmware.com'
 Getting package metadata for 'whereabouts.tanzu.vmware.com'
 Creating service account 'whereabouts-default-sa'
 Creating cluster admin role 'whereabouts-default-cluster-role'
 Creating cluster role binding 'whereabouts-default-cluster-rolebinding'
 Creating package resource
 Waiting for 'PackageInstall' reconciliation for 'whereabouts'
 'PackageInstall' resource install status: Reconciling
 'PackageInstall' resource install status: ReconcileSucceeded

 Added installed package 'whereabouts'
user@boot:~$
```
インストール完了しました！
インストール後の確認をします。"ReconcileSucceeded" が確認できました。
```
user@boot:~$ tanzu package installed get whereabouts

NAME:                    whereabouts
PACKAGE-NAME:            whereabouts.tanzu.vmware.com
PACKAGE-VERSION:         0.5.1+vmware.2-tkg.1
STATUS:                  Reconcile succeeded
CONDITIONS:              [{ReconcileSucceeded True  }]
USEFUL-ERROR-MESSAGE:
user@boot:~$
```

Multus のネットワーク定義ファイルを作成します。以下は例です。
```
user@boot:~$ vim multus-cni-crd.yaml
apiVersion: "k8s.cni.cncf.io/v1"
kind: NetworkAttachmentDefinition
metadata:
  name: macvlan-conf
spec:
  config: '{
      "cniVersion": "0.3.0",
      "type": "macvlan",
      "master": "eth0",
      "mode": "bridge",
      "ipam": {
        "type": "whereabouts",
        "range": "192.168.1.70-192.168.1.80/24"
      }
    }'
```
master に指定する インターフェースは実際のノードが持つものと一致している必要があります。
spec.config 内の ipam では multus と異なり一部のオプションしかサポートしていないため注意が必要です。
（現状、参考資料の Docs 上の表記では使えないオプションが含まれています）

作成したファイルを使用して、ネットワーク定義を適用します。
```
user@boot:~$ kubectl create -f multus-cni-crd.yaml
networkattachmentdefinition.k8s.cni.cncf.io/macvlan-conf created
user@boot:~$
```

# 確認方法

テスト用の pod を 2つ作成します。今後の検証に備え、node にラベルを付与し、pod に nodeSelector で node の指定も行いました。

1つ目
```
user@boot:~$ cat pod0.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: alpine
  nodeSelector:
    for: pod0
user@boot:~$
```
2つ目
```
user@boot:~$ cat pod1.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod1
  annotations:
    k8s.v1.cni.cncf.io/networks: macvlan-conf
spec:
  containers:
  - name: pod1
    command: ["/bin/ash", "-c", "trap : TERM INT; sleep infinity & wait"]
    image: alpine
  nodeSelector:
    for: pod1
user@boot:~$
```

pod を作成します。
```
user@boot:~$ kubectl create -f pod0.yaml -f pod1.yaml
pod/pod0 created
pod/pod1 created
user@boot:~$
```

`kubectl describe pod` で Whereabouts で取得した IP アドレスを確認します。
設定した IP レンジから、"net1" というインターフェース名で 2つ目の IP アドレスが設定されているのが確認できました！
* pod0: 192.168.1.70
* pod1: 192.168.1.71
```
Name:             pod0
（中略）
                    [{
                        "name": "antrea",
                        "interface": "eth0",
                        "ips": [
                            "100.96.2.55"
                        ],
                        "mac": "9e:f8:aa:91:df:18",
                        "default": true,
                        "dns": {},
                        "routes": [
                            {
                                "dst": "0.0.0.0/0",
                                "gw": "100.96.2.1"
                            }
                        ]
                    },{
                        "name": "default/macvlan-conf",
                        "interface": "net1",
                        "ips": [
                            "192.168.1.70"
                        ],
                        "mac": "a2:00:ba:ef:1e:6a",
                        "dns": {}
                    }]
（中略）

Name:             pod1
（中略）
                    [{
                        "name": "antrea",
                        "interface": "eth0",
                        "ips": [
                            "100.96.1.156"
                        ],
                        "mac": "de:c5:eb:b0:bb:b6",
                        "default": true,
                        "dns": {},
                        "routes": [
                            {
                                "dst": "0.0.0.0/0",
                                "gw": "100.96.1.1"
                            }
                        ]
                    },{
                        "name": "default/macvlan-conf",
                        "interface": "net1",
                        "ips": [
                            "192.168.1.71"
                        ],
                        "mac": "aa:b9:f4:d9:b2:ee",
                        "dns": {}
                    }]
```

# さいごに

Whereabouts を使用して、pod に対して 2つ目の IP アドレスを指定したレンジから設定することができました！

なにか少しでも参考にしていただける部分があったら嬉しいです。
記事を読んでいただきありがとうございました。


---
参考資料
https://docs.vmware.com/en/VMware-Tanzu-Kubernetes-Grid/1.6/vmware-tanzu-kubernetes-grid-16/GUID-packages-cni-multus.html
https://docs.vmware.com/en/VMware-Tanzu-Kubernetes-Grid/1.6/vmware-tanzu-kubernetes-grid-16/GUID-packages-cni-whereabouts.html