Tanzu Kubernetes Grid v2.4のManagement ClusterとWorkload Clusterを構築する

Tanzu Kubernetes Grid(以下TKG)のv2.4が'23/9/28に[リリースされた](https://docs.vmware.com/en/VMware-Tanzu-Kubernetes-Grid/2.4/tkg-deploy-mc/mgmt-release-notes.html#release-dates-10)。
このメモは、TKG2.4を構築する機会があったので、構築手順を纏めた時のメモ。
TKG2.1とかと比べて大きな変化はないので、主な対象読者は初めてTKGを触る人向けとなる。


なお、今回の検証はUbuntuをBootstrapとして利用するため、Linux環境でのインストール手順となる。
Bootstrapのリソースが貧弱だと構築に失敗するため、メモリは8G以上積んでいることを確認してから進めた方がよい。

## 準備
[Customer ConnectのDownloadページ](https://customerconnect.vmware.com/en/downloads/details?downloadGroup=TKG-240&productId=1400)から以下を入手する。

- Ubuntu 2004 Kubernetes v1.27.5 OVA (PhotonでもOK)
- kubectl cli v1.27.5 for Linux
- TKG Carvel Tools for Linux

OVAに関してはvSphere Clientで`Deploy OVF Template`から転送済みの状態になっているものとし、コマンド類のファイルもbootstrapに転送済みの状態から開始する。
バイナリについては全て${HOME}/bin以下にインストールするものとし、以下でパスを通しておく。
```sh
echo 'export PATH=$PATH:${HOME}/bin' >> ~/.bashrc
. ~/.bashrc
```

また[こちら](https://customerconnect.vmware.com/downloads/details?downloadGroup=TCLI-100&productId=1455&rPId=109066)からTanzu CLIも入手する。

### Carvel Toolsのインストール
正直なところ、普通にクラスタを構築する分にはCarvel Toolsをインストールする必要はない。
ただ、入れとくと便利なこともあるので、ここでは一応入れておく。
```sh
tar xvzfp tkg-carvel-tools-linux-amd64.tar.gz
gunzip cli/*
install cli/imgpkg-linux-amd64-v0.36.0+vmware.2 ~/bin/imgpkg
install cli/kapp-linux-amd64-v0.55.0+vmware.2 ~/bin/kapp
install cli/kbld-linux-amd64-v0.37.0+vmware.2 ~/bin/kbld
install cli/vendir-linux-amd64-v0.33.1+vmware.2 ~/bin/vendir
install cli/ytt-linux-amd64-v0.45.0+vmware.2 ~/bin/ytt
```

### tanzu CLIのインストール
ファイルを展開して`~/bin`以下にシンボリックリンクを張る。
```sh
tar xvzfp tanzu-cli-linux-amd64.tar.gz
mkdir -p ~/bin/tanzucli
mv v1.0.0/ ~/bin/tanzucli/
ln -s ~/bin/tanzucli/v1.0.0/tanzu-cli-linux_amd64 ~/bin/tanzu
```
確認する。
```sh
$ tanzu version
version: v1.0.0
buildDate: 2023-08-08
sha: 006d0429
```
次にPluginをインストールする。
```sh
tanzu plugin install --group vmware-tkg/default:v2.4.0
```
途中でGeneral Termsに同意するかと、カスタマーエクスペリエンス向上プログラムに参加するかを聞かれるので、それぞれ回答して先に進む。

最後に補完が聞くようcompletionを入れる。
```sh
echo "source <(tanzu completion bash)" >> ~/.bashrc
. ~/.bashrc
```

### kubectlのインストール
ファイルを展開して`~/bin`以下にシンボリックリンクを張る。
```sh
gunzip kubectl-linux-v1.27.5+vmware.1.gz
mkdir -p ~/bin/kubectl-bin/v1.27.5
chmod +x kubectl-linux-v1.27.5+vmware.1 
mv kubectl-linux-v1.27.5+vmware.1 ~/bin/kubectl-bin/v1.27.5
ln -s ~/bin/kubectl-bin/v1.27.5/kubectl-linux-v1.27.5+vmware.1 ~/bin/kubectl
```

### dockerのインストール
以下を実行してインストールする。
```sh
sudo apt-get update
sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release -y
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y
sudo systemctl restart docker
```
dockerコマンドが叩けるようにユーザをdockerグループに追加してログインしなおす。
```sh
sudo usermod -aG docker $USER
exit
```

## Management Clusterの作成
公式ドキュメントは[こちら](https://docs.vmware.com/en/VMware-Tanzu-Kubernetes-Grid/2.4/tkg-deploy-mc/mgmt-index.html)。
ここではUIからインストールを行う。
なお、[こちら](https://docs.vmware.com/en/VMware-Tanzu-Kubernetes-Grid/2.4/tkg-deploy-mc/mgmt-deploy-index.html#installer-ui-vs-cli-1)の記載によると、以下のようなケースではCLIからインストールする必要がある。
- IPv6やDual-Stackネットワークの利用
- `VSPHERE_STORAGE_POLICY_ID`を使ったカスタムストレージポリシーの利用
- [Node IPAM](https://docs.vmware.com/en/VMware-Tanzu-Kubernetes-Grid/2.4/tkg-deploy-mc/mgmt-deploy-config-vsphere.html#configure-node-ipam-10)の利用

`tanzu`コマンドを実行してインストール用のUIを立ち上げる。
```
tanzu mc create --bind 10.180.81.126:9999 --ui -v9
```
インストール時の設定については[TKG2.1の時](https://qiita.com/ipppppei/items/7b9b82bc242e8c293b90)とほとんど変わっていないので割愛する。
ただ、TKG2.1と比べてAvailability Zone（AZ）が選べるようになっている点は変更点となる。
![1696305833561.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/15b606e4-d36f-33fe-d6d3-ad5b1898d36c.png)


AZに関してはここでは触れないが、利用する際は以下を読むと良い。
- [Prepare Availability Zones](https://docs.vmware.com/en/VMware-Tanzu-Kubernetes-Grid/2.4/tkg-deploy-mc/mgmt-reqs-prep-vsphere.html#prepare-availability-zones-10)
- [Running Clusters Across Multiple Availability Zones](https://docs.vmware.com/en/VMware-Tanzu-Kubernetes-Grid/2.4/using-tkg/workload-clusters-multi-az-vsphere.html)

## Workload Clusterの作成
[こちら](https://docs.vmware.com/en/VMware-Tanzu-Kubernetes-Grid/2.4/using-tkg/workload-clusters-deploy.html#create-a-classbased-cluster-2)の公式手順に沿って進める。

Workload Clusterの設定ファイルを作成する。
最初にManagement Clusterの設定ファイルをコピーする。
```
cd ~/.config/tanzu/tkg/clusterconfigs/
cp gl2rih06fv.yaml workload.yaml
```
[vSphere with Standalone Management Cluster Configuration Files](https://docs.vmware.com/en/VMware-Tanzu-Kubernetes-Grid/2.4/using-tkg/workload-clusters-configure-vsphere.html)を見ながら設定していく。
ここでは以下を設定した。
```yaml
--- gl2rih06fv.yaml	2023-10-03 04:04:47.722003999 +0000
+++ workload.yaml	2023-10-03 04:36:19.790320366 +0000
@@ -1,3 +1,5 @@
+CLUSTER_NAME: tkg24-wc
+NAMESPACE: default
 AVI_CA_DATA_B64: ""
 AVI_CLOUD_NAME: ""
 AVI_CONTROL_PLANE_HA_PROVIDER: "false"
@@ -18,7 +20,7 @@
 AVI_USERNAME: ""
 CLUSTER_ANNOTATIONS: 'description:,location:'
 CLUSTER_CIDR: 100.96.0.0/11
-CLUSTER_PLAN: dev
+CLUSTER_PLAN: prod
 ENABLE_AUDIT_LOGGING: "false"
 ENABLE_CEIP_PARTICIPATION: "false"
 ENABLE_MHC: "false"
@@ -50,8 +52,8 @@
 SERVICE_CIDR: 100.64.0.0/13
 TKG_HTTP_PROXY_ENABLED: "false"
 VSPHERE_CONTROL_PLANE_DISK_GIB: "40"
-VSPHERE_CONTROL_PLANE_ENDPOINT: 10.180.81.249
-VSPHERE_CONTROL_PLANE_MEM_MIB: "16384"
+VSPHERE_CONTROL_PLANE_ENDPOINT: 10.180.81.248
+VSPHERE_CONTROL_PLANE_MEM_MIB: "8192"
 VSPHERE_CONTROL_PLANE_NUM_CPUS: "4"
 VSPHERE_DATACENTER: /vSAN-DC
 VSPHERE_DATASTORE: /vSAN-DC/datastore/vsanDatastore
@@ -64,7 +66,7 @@
 VSPHERE_SSH_AUTHORIZED_KEY: ssh-rsa AAAAB3Nz...
 VSPHERE_TLS_THUMBPRINT: B7:6F:93:7D:B2:4F:F5:52:49:F3:F7:9E:68:53:3B:EB:68:B5:72:D0
 VSPHERE_USERNAME: administrator@vsphere.local
-VSPHERE_WORKER_DISK_GIB: "40"
+VSPHERE_WORKER_DISK_GIB: "100"
 VSPHERE_WORKER_MEM_MIB: "8192"
-VSPHERE_WORKER_NUM_CPUS: "2"
+VSPHERE_WORKER_NUM_CPUS: "4"
 WORKER_ROLLOUT_STRATEGY: ""
```

`auto-apply-generated-clusterclass-based-configuration`(plan-basedの設定ファイルをclass-basedのものに自動変換する設定)をtrueにする。
```sh
tanzu config set features.cluster.auto-apply-generated-clusterclass-based-configuration true
```
Workload Clusterを作成する。
```sh
tanzu cl create -f ./workload.yaml -v9
```
構築後、kubeconfigを取得してコンテキストを切り替える。
```sh
tanzu cl kubeconfig get tkg24-wc --admin
kubectl config use-context tkg24-wc-admin@tkg24-wc
```
無事作成された。
```sh
$ kubectl get node
NAME                                         STATUS   ROLES           AGE     VERSION
tkg24-wc-8rxxh-87tzq                         Ready    control-plane   10m     v1.27.5+vmware.1
tkg24-wc-8rxxh-slmgs                         Ready    control-plane   8m29s   v1.27.5+vmware.1
tkg24-wc-8rxxh-vlb67                         Ready    control-plane   6m47s   v1.27.5+vmware.1
tkg24-wc-md-0-nbjzg-85bb5bddd8xxl95h-p5lcz   Ready    <none>          8m54s   v1.27.5+vmware.1
tkg24-wc-md-1-2bw24-5fb7c8dc9xncbpk-d2452    Ready    <none>          8m52s   v1.27.5+vmware.1
tkg24-wc-md-2-t7q5s-5bdc9746d4xhpq9c-dbhjk   Ready    <none>          8m45s   v1.27.5+vmware.1
```