Tanzu Mission ControlでTKGのアップグレードを行う

Tanzu Mission Control(TMC)でクラスタを管理している環境でTanzu Kubernetes Grid(TKG)の1.5.4から1.6.1.にアップグレードした時のメモ。
TKGの公式ドキュメントは[こちら](https://docs.vmware.com/en/VMware-Tanzu-Kubernetes-Grid/1.6/vmware-tanzu-kubernetes-grid-16/GUID-upgrade-tkg-index.html)、TMCの公式ドキュメントは[こちら](https://docs.vmware.com/en/VMware-Tanzu-Mission-Control/services/tanzumc-using/GUID-25890834-CFE9-4948-8E36-4A211FD874F1.html)となる。

TMCはManagement Clusterはライフサイクル管理の対象としていない。
そのため手順としては、最初にManagement Clusterをtanzuコマンドでアップグレードし、その後にWorkload ClusterをTMCでアップグレードする手順となる。

## 準備
Management Clusterのアップグレードにあたり、tanzu cliのバージョンをv0.25.4に上げる必要がある。
今回は`$HOME`/binにパスが通った状態で始めている。
```
cp cli/core/v0.25.4/tanzu-core-linux_amd64 ~/bin/tanzu
chmod +x ~/bin/tanzu
tanzu init
```
ここまで実行すると、本体およびプラグインのバージョンがv0.25.4となる。
```
$ tanzu plugin list
  NAME                DESCRIPTION                                                        SCOPE       DISCOVERY  VERSION  STATUS
  login               Login to the platform                                              Standalone  default    v0.25.4  installed
  management-cluster  Kubernetes management-cluster operations                           Standalone  default    v0.25.4  installed
  package             Tanzu package management                                           Standalone  default    v0.25.4  installed
  pinniped-auth       Pinniped authentication operations (usually not directly invoked)  Standalone  default    v0.25.4  installed
  secret              Tanzu secret management                                            Standalone  default    v0.25.4  installed
  telemetry           Configure cluster-wide telemetry settings                          Standalone  default    v0.25.4  installed
```
また、今回は新規にLinuxユーザを作成して実行しているので飛ばしているが、本来は以下の手順も必要となる。
- `~/.config/tanzu/tkg/compatibility/tkg-compatibility.yaml`の削除
- kubectlのアップデート

次にTKG1.6.1用のノードのOVAをvSphere Clientからアップロードしてテンプレート化する。
今回は`photon-3-kube-v1.23.10+vmware.1-tkg.1-efe12079f22627aa1246398eba077476.ova`をテンプレート化した。

tanzu loginでupgrade対象のManagement Clusterにログインする。今回はクラスタ作成ユーザとは別で操作しているため、kubeconfigからログイン情報を渡してログインした。
```
$ tanzu login
? Select a server + new server
? Select login type Local kubeconfig
? Enter path to kubeconfig (if any) /tmp/tkg15config
? Enter kube context to use tkg15mc-admin@tkg15mc
? Give the server a name tkg15mc
✔  successfully logged in to management cluster using the kubeconfig tkg15mc
Checking for required plugins...
Installing plugin 'cluster:v0.11.6'
Installing plugin 'kubernetes-release:v0.11.6'
Successfully installed all required plugins
```
kubeconfigにManagement Clusterの情報を書き込み、コンテキストを切り替える。
```
tanzu mc kubeconfig get --admin
kubectl config use-context tkg15mc-admin@tkg15mc
```
upgradeコマンドを実行する。
```
tanzu mc upgrade
```
実行すると、以下のような確認メッセージが出てくるのでyを入力する。
```
Upgrading management cluster 'tkg15mc' to TKG version 'v1.6.1' with Kubernetes version 'v1.23.10+vmware.1'. Are you sure? [y/N]: 
```
upgradeに完了すると、TMC上のManagement ClusterのKubernetesのバージョンがv1.23.10に変わっていることが分かる。

![1676281623738.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/63c3e055-3bb0-cf27-d8bd-e55be9bd6764.png)

また、TMC上からWorkload Clusterを参照すると、`UPGRADE`ボタンが活性化されていることも分かる。

![1676281856084.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/4ef48285-c5d9-a757-e7d8-427039e0f480.png)

## TMCからWorkload Clusterをアップグレード
`UPGRADE`ボタンを押してアップグレードを開始する。
ボタンを押すと、以下のメッセージが表示される。
- アップグレードが完了するまで一時的にライフサイクルオペレーションが停止する
- 事前にバックアップを取ることを推奨する
- HA構成じゃない場合、一時的にダウンタイムが発生する

![1676282209186.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/0b432b86-176c-dbe5-c74e-411282681dd7.png)

記載内容に特に引っかかるものがなければ、そのまま`UPGRADE`をクリックする。
リロードすると、アップグレード中のステータスになっている。

![1676282578932.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/4d047cb7-d6f3-4286-e064-48091693a689.png)

この時、裏でtanzuコマンドを実行すると、アップグレードの様子が見える。
例えば以下の場合はControl Planeにローリングアップデートを実施しているのが分かる。
```
$ tanzu cluster get tkg15wc-imurata
  NAME             NAMESPACE  STATUS    CONTROLPLANE  WORKERS  KUBERNETES         ROLES   TKR
  tkg15wc-imurata  default    updating  2/1           1/1      v1.23.10+vmware.1  <none>  v1.23.10---vmware.1-tkg.1


Details:

NAME                                                                  READY  SEVERITY  REASON                   SINCE  MESSAGE
/tkg15wc-imurata                                                      False  Warning   RollingUpdateInProgress  5m11s  Rolling 1 replicas with outdated spec (1 replicas up to date)
├─ClusterInfrastructure - VSphereCluster/tkg15wc-imurata            True                                      4d7h
├─ControlPlane - KubeadmControlPlane/tkg15wc-imurata-control-plane  False  Warning   RollingUpdateInProgress  5m11s  Rolling 1 replicas with outdated spec (1 replicas up to date)
│ ├─Machine/tkg15wc-imurata-control-plane-qxcfs                    True                                      3m28s
│ └─!! DELETED !! Machine/tkg15wc-imurata-control-plane-tfn7r      True                                      4d7h
└─Workers
  └─MachineDeployment/tkg15wc-imurata-md-0                          True                                      4d7h
    └─Machine/tkg15wc-imurata-md-0-79f6549747-h8zhm                 True                                      4d7h
```
また、アップグレードの最中、タイミングによっては以下のようにWarningになることもある。この時、単にアップグレードが終わっていないだけでもこうなるので、`tanzu cluster get`で状態を確認すること。

![1676283090388.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/2f97e2ac-1c35-2b7d-26a2-95a9779034bf.png)

更に少し待つと、Healtyに戻り、`Nodes`タブからアップグレード後のノードが確認できる。

![1676283277909.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/c43deb55-6713-1151-49bc-140c2d70a04f.png)

なお、古いノードが残っているように見えるがこれは実際は削除済みで、kubectlでもvSphere上でも見ることは出来ない。
TMCが独自に持っている情報のようで、5分〜10分程度待つと消えたので、少し待つと良さそうだ。

アップグレードが正常に行われたか確認するために、Kubernetes以外のバージョンも確認する。
TKG1.5のコンポーネントの一覧は[こちら](https://docs.vmware.com/en/VMware-Tanzu-Kubernetes-Grid/1.5/vmware-tanzu-kubernetes-grid-15/GUID-release-notes.html#component-versions-3)でTKG1.6のコンポーネントの一覧は[こちら](https://docs.vmware.com/en/VMware-Tanzu-Kubernetes-Grid/1.6/vmware-tanzu-kubernetes-grid-16/GUID-release-notes.html#component-versions-9)にある。
ここではantreaを確認する。antreaはTKG1.5.4でv1.2.3でTKG1.6.1でv1.5.3である。
バージョンはイメージのタグ名を確認すると分かるが、TKGの場合ハッシュ値に変換されているので、appリソースの中を確認することでタグ名を確認する。
```
$ kubectl describe app antrea -n tkg-system | grep antrea
：（省略）
    Stderr:     resolve | final: antrea/antrea-ubuntu:v1.5.3 -> projects.registry.vmware.com/tkg/antrea-advanced-debian@sha256:d2e558c313bfaa553b11b7f815c511d2debc642f54a5abc9df3600492a5ff5f5
```
v1.5.3はTKG1.6.1のantreaのバージョンなので、上手く入れ替わっていることが分かる。