## あいさつをいれる
本記事は、「[TUNA-JP Advent Calendar 2022](https://qiita.com/advent-calendar/2022/tuna-jp)」21日目のエントリです。
こんにちは、@yama-s です。
本日は以下についてご紹介します!
* **Whereabouts**
# Whereabouts とは
https://github.com/k8snetworkplumbingwg/whereabouts/blob/master/doc/logo.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:~$
```
インストール完了しました!
インストール後の確認をします。
```
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 と異なり一部のオプションしかサポートしていませんので注意が必要です。(現状 VMware の docs が誤っています。。)
作成したファイルを使用して、ネットワーク定義を適用します。
```
user@boot:~$ kubectl create -f multus-cni-crd.yaml
networkattachmentdefinition.k8s.cni.cncf.io/macvlan-conf created
user@boot:~$
```
# 確認方法
テスト用の pod を 2つ作成します。今回は node 間での疎通を確認するため、node にラベルを付与し、pod に nodeSelector で指定を行いました。
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` というインターフェース名で以下が設定されているのが確認できました。
* 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": {}
}]
```
ノードが異なる pod 間で疎通確認をします。