Tanzu Mission ControlのCLIで既存Kubernetesクラスタの登録と新規クラスタ作成を試す


Tanzu Mission Control(TMC)をCLIで操作してクラスタ登録や新規作成を試した時のメモ。
公式ドキュメントは[このあたり](https://docs.vmware.com/en/VMware-Tanzu-Mission-Control/services/tanzumc-using/GUID-7EEBDAEF-7868-49EC-8069-D278FD100FD9.html)。
TMCはGUIでの管理が秀逸だが、運用自動化したい人から見るとどうでもよく、むしろAPIやCLIが気になるところだと思う。
TMCはAPIもCLIも用意されており、CLIの方は専用のtmcコマンドで運用が出来るようになっている。
このメモでは、そのCLIを使ってKubernetesクラスタを軽く触った時のメモになる。

## CLIのインストールと初期設定
TMCにログインし、左のサイドバーから`Automation center`をクリックし、`DOWNLOAD THE CLI`をクリックする。

![1672628353960.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/e255b241-3ff1-c0ba-5a1c-ec4932d56d9c.png)


ダウンロードしたバイナリをインストールする。Macの場合は以下のような感じでインストール出来る。
```
sudo install ~/Downloads/tmc /usr/local/bin/tmc
```
なお、tmcコマンドにはcompletionがついているので、completionがよほど嫌いでない限り設定する。
```
echo "source <(tmc completion bash)" >> ~/.bashrc
. ~/.bashrc
```

次にTMCのブラウザ画面に戻り、右上の自身のアカウント名をクリックし、`My Account`を選択する。
`API Tokens`のタブを選択し、下の方に`GENERATE A NEW API TOKEN`とリンク表示されている文字をクリックすると以下のようなTokenの設定画面が表示される。

![1672629064660.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/235d9ea4-68e6-80b0-709d-8ca701412553.png)

設定項目の意味は[オフィシャルドキュメント](https://docs.vmware.com/en/VMware-Tanzu-Mission-Control/services/tanzumc-using/GUID-7EEBDAEF-7868-49EC-8069-D278FD100FD9.html)で確認すること。
ここでは推奨値が
- "Define Scopes"：`All Roles`
- "OpenID"：チェック

のようなので、そのように設定して`Generate Token`をクリックしてTokenを生成した。
表示されたTokenはなくさないよう控えておく。

先程DownloadしたCLIで`tmc login`を実行し、初期設定を行う。
```
$  tmc login
i If you don't have an API token, visit the VMware Cloud Services console, select your organization, and create an API token with the TMC service roles:
  https://console.cloud.vmware.com/csp/gateway/portal/#/user/tokens
? API Token ****************************************************************
? Login context name imurata-tmc
? Select default log level info
? Management Cluster Name
? Provisioner Name
√ Successfully created context imurata-tmc, to manage your contexts run `tmc system context -h`
```
質問の意味は以下になる。
- `API Token`：先程取得したToken
- `Login context name`：CLIで操作するコンテキスト。省略するとOrganization IDになる。
- `log level`：コンソール出力時のログレベル
- `Management Cluster Name`：Workloadクラスタ作成時の親クラスタの選択。省略可能。
- `Provisioner Name`：Workloadクラスタ作成時のNamespace。省略可能。

ここでは`API Token`、`Login context name`を設定し、`log level`を`info`に設定して他は入力せずに進めた。

コンテキストが作成したものに切り替わっているか確認する。
```
tmc system context current
```

切り替わっている場合、以下のようにTMCで管理しているクラスタの情報などがCLIで取得できるようになる。
```sh
$ tmc cluster list
  NAME                            MANAGEMENTCLUSTER               PROVISIONER  LABELS
  imurata-tkg16                   attached                        attached     tmc.cloud.vmware.com/creator:imurata
```

## Kubernetesクラスタの登録・作成
ここではvSphere with Tanzuが利用可能という前提で、Management Cluster(Supervisor Cluster)の登録、Workload Cluster(Tanzu Kubernetes Cluster)の作成をtmcコマンドで実施してみる。

### Management Clusterの登録
公式の説明は[このあたり](https://docs.vmware.com/en/VMware-Tanzu-Mission-Control/services/tanzumc-using/GUID-CC6E721E-43BF-4066-AA0A-F744280D6A03.html)にある。
事前にコンテキストをSupervisorClusterに切り替える。
```
kubectl config use-context tkgs-sv
```

Management Clusterの登録は`tmc managementcluster register`で行える。
今回、登録には2つのオプションを利用する。
- `--kubernetes-provider-type`：TKGのタイプを指定する。デフォルトではTKGSなのでvSphere with Tanzuでは不要だが、分かりやすくするために明示的に指定する
- `--default-cluster-group`：TMCのClusterGroupを指定する
- `--kubeconfig`：自動でAgentをManagement Clusterにインストールするために指定する。今回は`~/.kube/config`を指定。
```sh
$ tmc managementcluster register imurata-tkgs-sv --kubernetes-provider-type TKGS --default-cluster-group imurata -k ~/.kube/config
√ management cluster "imurata-tkgs-sv" created successfully
i identifying TMC namespace
i installing TMC agents on the management cluster
┌ √ TMC agents installed on management cluster
┌ √ management cluster successfully registered to TMC
```
上手く接続できると、`tmc managementcluster get`のcondition部分に正常に接続された旨が表示される。
```sh
$ tmc managementcluster get imurata-tkgs-sv
：（省略）
  conditions:
    READY:
      message: management cluster is connected to TMC and healthy
      reason: 'phase: READY, health: HEALTHY'
      severity: INFO
      status: "TRUE"
      type: READY
```
なお、この登録したManagement Clusterは既にSupervisor Namespaceを持ち、Tanzu Kubernetes Clusterもデプロイ済みだが、それらはGUIから確認できる。\
GUIで`Admistration`→`Management clusters`で先程登録したManagement Clusterが表示されているので、その名前をクリックする。
すると、以下のようにWorkload clusterのところに作成済みのクラスタが表示される。
![1672634127965.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/28ea2809-89e7-80cf-feeb-6103c0821e9f.png)

なお、これはTMCへは登録されていないため、`tmc cluster list`では取得できない。TMCで認識するためには別途attachが必要となる

## 既存Workload Clusterのアタッチ
TKCのTMCへの登録はGUIからも可能だが、ここでは引き続きCLIで実施する。
CLIでの登録は`tmc cluster attach`で登録する。
ここで使用するオプションは以下となる。
- `--kubeconfig`：自動でAgentをWorkload Clusterにインストールするために指定する。今回は`~/.kube/config`を指定。
- `--management-cluster-name`：登録するクラスタの親クラスタを指定。ここでは先程登録したManagement Clusterを指定する
- `--name`：登録するクラスタ名を指定
- `--cluster-group `：TMCのClusterGroupを指定

実行すると、以下のようになる。
```
$ tmc cluster attach --kubeconfig ~/.kube/config --management-cluster-name imurata-tkgs-sv --name tkgs-cluster-1 --cluster-group imurata
i Running pre-flight checks
√ cluster "tkgs-cluster-1" created successfully
└ √ TMC resources applied to the cluster successfully
i Running post-flight attach checks
┘ √ Cluster  successfully attached to TMC
```
登録に成功すると`tmc cluster list`で表示されるようになる。
```
tmc cluster list tkgs-cluster-1
  NAME                            MANAGEMENTCLUSTER               PROVISIONER  LABELS
  imurata-tkg16                   attached                        attached     tmc.cloud.vmware.com/creator:imurata
  tkgs-cluster-1                  attached                        attached     tmc.cloud.vmware.com/creator:imurata
```
ブラウザからも情報が取得できる。
![1672635516570.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/096212db-9521-da4f-8b58-ccc4eafa62d8.png)

## 新規クラスタの作成

クラスタの作成はテンプレートをベースにyamlを作成して、それを利用して`tmc clustert create`するか、対話型(-wオプション)で入力していくのが良いと思われる。ここではyamlに一旦吐き出すやり方で進める。\
※対話型での進め方は[こちらのKnowledgeBase](https://kb.vmware.com/s/article/84331)も参照するとよい。

テンプレートの一覧は`tmc cluster template list`で取得できる。
```
$ tmc cluster template list
  NAME         DESCRIPTION
  aws-ha       A highly available AWS cluster.
  default-iam  default template for the iam-policy resource
  expert       Fully customizable template for the Cluster resource
  tkg-azure    Provision cluster using Tanzu Kubernetes Grid on Azure.
  tkg-vsphere  Provision cluster using Tanzu Kubernetes Grid on vSphere 6.7.
  attached     An attached cluster.
  azure-ha     Provision high availability cluster using Tanzu Kubernetes Grid on Azure.
  default      A simple AWS cluster.
  tkg-aws      Provision cluster using Tanzu Kubernetes Grid on AWS.
  tkgs         Provision cluster using Tanzu Kubernetes Grid Service on vSphere 7.
```

今回はvSphere with Tanzuにデプロイするので、テンプレートは`tkgs`を利用する。
テンプレートを利用した場合の作成コマンドは以下となる。
```
tmc cluster create -n tkgs-cluster-for-tmc -g imurata --dry-run -t tkgs --storage-class vc01cl01-t0compute --version v1.22.9---vmware.1-tkg.1.cc71bc8 --management-cluster-name imurata-tkgs-sv --provisioner-name ns1  > ./tmc-cluster.yaml
```
オプションの意味は以下になる。
- `-n`：作成するクラスタ名
- `-g`：TMCのClusterGroup名
- `--dry-run`：yamlだけ表示して実際に作成しない
- `-t`：指定するテンプレート名。ここではlistにあった`tkgs`を選択
- `--storage-class`：作成するクラスタで使用するStorageClass。指定必須。
- `--version`：作成するKubernetesのバージョン。SupervisorClusterで`kubectl get tkr`で取得できるものを指定する。指定必須。
- `--management-cluster-name`：登録済みのManagementCluster（SupervisorCluster）
- `--provisioner-name`：SupervisorNamespace名

`--provisioner-name`がやや分かりにくいので注意。
作成したyamlでNode数の変更等が必要な場合はエディタで開いて修正する。修正が終わったら以下のコマンドでクラスタを作成する。
```
$ tmc cluster create -f ./tmc-cluster.yaml
√ cluster "tkgs-cluster-for-tmc" is being created
```
作成したクラスタの情報は`tmc cluster get`で取得できる。この際、ManagementClusterとProvisionerNameの指定も必要なので注意。
```
tmc cluster get tkgs-cluster-for-tmc --management-cluster-name imurata-tkgs-sv --provisioner-name ns1
```

作成したクラスタのkubeconfigは`tmc cluster auth kubeconfig get`で取得できる。
ここでもManagementClusterとProvisionerNameの指定が必要になる。
以下でkubeconfigを出力して、コンテキストを切り替える。
```
$ tmc cluster auth kubeconfig get tkgs-cluster-for-tmc -m imurata-tkgs-sv -p ns1 >> ~/.kube/config-tmc
$ export KUBECONFIG=~/.kube/config-tmc
$ kubectl config use-context tkgs-cluster-for-tmc
Switched to context "tkgs-cluster-for-tmc".
```
適当にコマンドを打つと、TMCから作成したKubernetesが利用できることが分かる。
```
$ kubectl get node
NAME                                                            STATUS   ROLES                  AGE   VERSION
tkgs-cluster-for-tmc-control-plane-6htcg                        Ready    control-plane,master   13m   v1.22.9+vmware.1
tkgs-cluster-for-tmc-default-node-pool-5p8s8-844c97f4bc-bzxb2   Ready    <none>                 11m   v1.22.9+vmware.1
```