tanzuコマンドを使ってTanzu Mission Control経由でクラスタにアクセスする

Tanzu Mission Control(TMC)の['23/5/16のリリースノート](https://docs.vmware.com/en/VMware-Tanzu-Mission-Control/services/rn/vmware-tanzu-mission-control-release-notes/index.html#What's%20New%20May%2016,%202023)で公開されているが、これまでの`tmc`コマンドが非推奨となり'23/11で非サポートとなる。
これに置き換わる形で`tanzu`コマンドが代わりのコマンドになるようなので、これを使ってTMCから`kubeconfig`を取得してクラスタにアクセスする。

なお、今回は新規に`tanzu`コマンドはインストールせず、Management Cluster作成時に使った`tanzu`コマンドを使い回す体で進める。
`tanzu`コマンドから導入したい人は[公式ドキュメント](https://docs.vmware.com/en/VMware-Tanzu-Mission-Control/services/tanzu-cli-ref-tmc/install-cli.html)を参照するか、TMCのUIから手順を確認するとよい。


## TMC用プラグインのインストール
`tanzu`コマンドを使ってTMC用のコンテキストを作成するとTMC向けのプラグインがインストールされる。なお、プラグインのサイズは個別には測っていないが、`~/.local`以下は手元の環境でプラグインのインストール後1.2Gほど利用していたので、空き容量が少ない人は注意すること。
```
tanzu context create  --endpoint my-org.tmc.cloud.vmware.com 
```
`--endpoint`で指定するのは、自身が普段アクセスしているTMCのドメインとなる。

`tanzu context create`を実行すると従来の`tmc login`コマンドと同様にプロンプトが表示されるので、以下を入力する。
- `? Give the context a name`: <コンテキスト名>
- `? API Token`: \<VMware Cloud ServiceのToken> 

VMware Cloud ServiceのTokenの取得方法は過去に書いた[こちら](https://qiita.com/ipppppei/items/14d2302a89b263a97266)の記事で手順を載せているので、分からない人はそちらを参照。
過去に`tmc login`を実行したことがある場合は、以下のような感じで掘り出すこともできる。
```sh
$ grep refresh_token ~/.vmware-cna-saas/contexts/*
/Users/xxx/.vmware-cna-saas/contexts/xxx-tmc:  refresh_token: f_xxxxxx
```
コマンドが完了すると、コンテキストが追加され、`TARGET: mission-control`向けにpluginが追加されていることが分かる。
```sh
$ tanzu plugin list
Standalone Plugins
  NAME                DESCRIPTION                                                        TARGET      DISCOVERY  VERSION  STATUS
  isolated-cluster    isolated-cluster operations                                                    default    v0.29.0  installed
  login               Login to the platform                                                          default    v0.29.0  installed
  pinniped-auth       Pinniped authentication operations (usually not directly invoked)              default    v0.29.0  installed
  management-cluster  Kubernetes management-cluster operations                           kubernetes  default    v0.29.0  installed
  package             Tanzu package management                                           kubernetes  default    v0.29.0  installed
  secret              Tanzu secret management                                            kubernetes  default    v0.29.0  installed
  telemetry           Configure cluster-wide telemetry settings                          kubernetes  default    v0.29.0  installed

Plugins from Context:  tmc-test
  NAME                DESCRIPTION                                                     TARGET           VERSION  STATUS
  account             Account for tmc resources                                       mission-control  v0.0.1   installed
  agentartifacts      helm for tmc resources                                          mission-control  v0.0.1   installed
  apply               Create/Update a resource with a resource file                   mission-control  v0.0.1   installed
：（省略）
```
なお、`tmc`コマンドは`~/.vmware-cna-saas以下`にコンテキストの情報を格納していたが、`tanzu`コマンドの場合は`~/.config/tanzu/config-ng.yaml`および`.config/tanzu/config.yaml`に格納するようだ。Tokenもそこに残るので、忘れた場合はそこから引っ張るとよさそうだ。

登録したコンテキストは`tanzu context list`から確認できる。
```
$ tanzu context list
Target:  kubernetes
  NAME                             ISACTIVE  ENDPOINT  KUBECONFIGPATH                 KUBECONTEXT
  tkg-mgmt-vsphere-20230623044636  true                /home/ubuntu/.kube-tkg/config  tkg-mgmt-vsphere-20230623044636-admin@tkg-mgmt-vsphere-20230623044636
Target:  mission-control
  NAME      ISACTIVE  ENDPOINT
  tmc-test  true      xxxxtanzuxxx.tmc.cloud.vmware.com:443
```
なお、手元の環境ではcontext登録後に一度`tanzu context use <context>`を実行しないとどちらのコンテキストの情報も取得に失敗したため、一度明示的にコンテキストを切り替えておくとよさそう。

TMCを`tanzu`コマンドで触る際は、先程の`tanzu plugin list`で表示された`TARGET`(`mission-control`)を指定する。
例えばMangement Clusterの一覧を取得するには以下のようになる。
```
$ tanzu mission-control management-cluster list
  NAME                      LABELS
  xxxx
  yyyy
  zzzx
```
## クラスタへのアクセス
準備が整ったので、ここからは`tanzu`コマンドを使ってクラスタアクセスするところまでを確認する。
まず、クラスタの一覧を取得する。
```sh
$ tanzu mission-control cluster list
  NAME                      MANAGEMENTCLUSTER         PROVISIONER  LABELS
  cluster01                 attached                  attached     tmc.cloud.vmware.com/creator:xxxx
  hogeeee-sof2-harbor       hogeeee-sof2-mc           default      tmc.cloud.vmware.com/creator:hogeeee
  hogeeee-temp              tkg15hogeeee              default      tmc.cloud.vmware.com/creator:tkg15hogeeee
```
次にkubeconfigをダウンロードする。
なお、先程`tanzu mission-control cluster list`を実行した時に表示されたManagement ClusterとProviderをそれぞれ`-m`, `-p`オプションで指定する必要がある。
```sh
tanzu mission-control cluster kubeconfig get hogeeee-sof2-harbor -m hogeeee-sof2-mc -p default > /tmp/tmc-hogeeee-sof2-harbor.yaml
```
環境変数`KUBECONFIG`にパスを設定する。
```sh
export KUBECONFIG=/tmp/tmc-hogeeee-sof2-harbor.yaml
```
適当にkubectlを実行する。
```sh
$ kubectl get node
NAME                                              STATUS   ROLES           AGE   VERSION
hogeeee-sof2-harbor-md-0-kdbxr-668cf79f89-5kj92   Ready    <none>          32d   v1.25.7+vmware.2
hogeeee-sof2-harbor-md-0-kdbxr-668cf79f89-gr6ls   Ready    <none>          28d   v1.25.7+vmware.2
hogeeee-sof2-harbor-md-0-kdbxr-668cf79f89-vlgk5   Ready    <none>          32d   v1.25.7+vmware.2
hogeeee-sof2-harbor-md-0-kdbxr-668cf79f89-zsqvk   Ready    <none>          28d   v1.25.7+vmware.2
hogeeee-sof2-harbor-tb5p4-2t2d2                   Ready    control-plane   30d   v1.25.7+vmware.2
hogeeee-sof2-harbor-tb5p4-6hbf5                   Ready    control-plane   30d   v1.25.7+vmware.2
hogeeee-sof2-harbor-tb5p4-z55mx                   Ready    control-plane   32d   v1.25.7+vmware.2
```
問題なさそうだ。


## 余談
なお、`tmc`コマンドから出来ていたことにはなるが、Management Clusterを作成した環境にアクセスしなくてもクラスタの`kubeconfig`が取得できるので地味に便利である。

あと、`tmc`コマンドをバリバリに使ってた方は[こちら](https://docs.vmware.com/en/VMware-Tanzu-Mission-Control/services/tanzu-cli-ref-tmc/equivalency.html)を参考に置き換えを進めるとよい。