NUCで始めるVMware Tanzu - vSphere with TanzuをTKG CLIで操作

本日は、、このシリーズを始めてから、ずっと気になっていた内容を検証したいと思います。
それは、**[TKG CLIを使ってvSphere with Tanzuを操作する](https://docs.vmware.com/en/VMware-Tanzu-Kubernetes-Grid/1.2/vmware-tanzu-kubernetes-grid-12/GUID-tanzu-k8s-clusters-connect-vsphere7.html)** というネタです。

実は、この講座を始めるちょっと前からこのドキュメントが公開され、気になってました。。
これ、導線が悪いと思うんですよね。**TKGのドキュメント**の方に、紹介されてるんです。
TKGの方に来る人って恐らく、手っ取り早くvSphere環境でK8sを触りたい人だと思うんですよね。。
そんな人にvSphere with Tanzu環境が前提のドキュメントを見せても、響かないだろうなぁとｗ
TKG CLIの方が、UIとしては手軽で優れてると思ってました。そこにvSphere with Tanzuの特徴が加わることで、Managed K8s環境としてのレベルが上ったなぁという感想です。
ちょうどここに、vSphere with Tanzuがあるので、やっと試せます！

#前提条件
1. TKG CLIがインストールされている<br>　→　[Day13](https://qiita.com/hirosat/items/6b15ee5dab17854ff0bd)で導入した踏み台(nested-bastion01) を使います
2. vSphere7にクラスタをデプロイ可能な権限を持つvSphereアカウント<br>　→　[Day18](https://qiita.com/hirosat/items/eefa91d9edb767fcf3c4)で作成したdevopsユーザで良さそうですね:grinning:
3. vSphere with Tanzu 機能が有効なvSphere7インスタンスにアクセス可能<br>　→　もちろん！[Day19](https://qiita.com/hirosat/items/b4b553e44ceadc969ba4)の話ですね。
4. TKG CLIコマンドを実行するBootstrapマシンにkubectl vsphere CLIユーティリティ<br>　→　おっと。ここはわざわざ踏み台を分けたので、追加で仕込む必要がありますね。。<br>　　基本的には[Day21](https://qiita.com/hirosat/items/1c18c995849d3d25b065#kubernetes-cli-tools%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)と手順は一緒で、kubectl-vsphereコマンドのみを追加で設置します。

```shell:踏み台
$ sudo mv bin/kubectl-vsphere /usr/local/bin/
$ ls -l /usr/local/bin/
total 11944
lrwxrwxrwx 1 root   root         51 Dec 13 16:07 imgpkg -> /home/ubuntu/tkg/imgpkg-linux-amd64-v0.2.0+vmware.1
lrwxrwxrwx 1 root   root         50 Dec 13 16:07 kapp -> /home/ubuntu/tkg/kapp-linux-amd64-v0.33.0+vmware.1
lrwxrwxrwx 1 root   root         50 Dec 13 16:07 kbld -> /home/ubuntu/tkg/kbld-linux-amd64-v0.24.0+vmware.1
lrwxrwxrwx 1 root   root         47 Dec 13 16:09 kubectl -> /home/ubuntu/tkg/kubectl-linux-v1.19.3-vmware.1
-rwxr-xr-x 1 ubuntu ubuntu 12226737 Aug 11 00:42 kubectl-vsphere
lrwxrwxrwx 1 root   root         48 Dec 13 16:07 tkg -> /home/ubuntu/tkg/tkg-linux-amd64-v1.2.1+vmware.1
lrwxrwxrwx 1 root   root         49 Dec 13 16:07 ytt -> /home/ubuntu/tkg/ytt-linux-amd64-v0.30.0+vmware.1
# /usr/local/bin に kubectl-vsphereが実行権を持って設置されていること

$ kubectl vsphere version
kubectl-vsphere: version 0.0.5, build 16726330, change 8275972
```

# Supervisorクラスタの登録
```shell:踏み台
# 以前の環境設定に依存した問題を回避するため、config.yaml をmvしておきましょう。
# mvにより、新規にconfig.yamlが作成され、config.yaml.orgから以前の環境に戻すこともできます。
$ mv ~/.tkg/config.yaml{,.org}

# administrator@vsphere.local でSSOログイン
$ SUPERVISOR_IP=172.18.0.208
$ kubectl vsphere login --vsphere-username administrator@vsphere.local --server=$SUPERVISOR_IP --insecure-skip-tls-verify=true

# Supervisorクラスタにコンテキストを切り替え
$ kubectl config use-context $SUPERVISOR_IP
Switched to context "172.18.0.208".

# コンテキストに「172.18.0.208」が加わり、現在のコンテキストとなっていることを確認
$ kubectl config get-contexts
CURRENT   NAME                                                                    CLUSTER                           AUTHINFO                                       NAMESPACE
*         172.18.0.208                                                            172.18.0.208                      wcp:172.18.0.208:administrator@vsphere.local
          my-cluster-admin@my-cluster                                             my-cluster                        my-cluster-admin
          tkg-mgmt-vsphere-20201213161849-admin@tkg-mgmt-vsphere-20201213161849   tkg-mgmt-vsphere-20201213161849   tkg-mgmt-vsphere-20201213161849-admin
          tkgs-dev                                                                172.18.0.208                      wcp:172.18.0.208:administrator@vsphere.local   tkgs-dev

# Supervisorクラスタを確認することができる
$ kubectl get nodes
NAME                               STATUS   ROLES    AGE   VERSION
422e52df766768f43b0339b3a037d99e   Ready    master   41h   v1.18.2-6+38ac483e736488
422e8137eb129484a1a96f3bc8a4b7c6   Ready    master   41h   v1.18.2-6+38ac483e736488
422ed8a369686aee772434cdd769faa0   Ready    master   41h   v1.18.2-6+38ac483e736488

# tkgコマンドを初めて叩くと、~/.tkg/config.yaml が新規作成されます。
$ tkg get management-cluster
$ ls ~/.tkg/config.yaml

# 現在のコンテキストを、management-clusterに登録
$ tkg add management-cluster
New management cluster context has been added to config file

# 利用するmanagement-clusterを「172.18.0.208」にセット
$ tkg set management-cluster $SUPERVISOR_IP
The current management cluster context is switched to 172.18.0.208

# management-clusterの一覧に、「172.18.0.208」が追加され、利用中のクラスタ(*印)にセットされている
$ tkg get management-cluster
 MANAGEMENT-CLUSTER-NAME          CONTEXT-NAME                                                           STATUS
 172.18.0.208 *                   172.18.0.208                                                           Success
```

#TKCパラメータの設定
次は、TKG CLIがTKCを作成する際に、Supervisorクラスタに渡すパラメータの設定です。
以下の2種類の指定方法をサポートしています。

1. 「tkg create cluster hoge --config XXX=YYY」 : configフラグにより、TKC作成時にパラメータを渡す方法
2. 「~/.tkg/config.yaml」に設定しておく方法。

毎回パラメータを指定するのは大変なので、2の方法で進めてみます。

```shell:踏み台
# まずは、StorageClass情報をコマンドにより取得
$ kubectl get storageclasses
NAME                     PROVISIONER              RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
k8s-dev-storage-policy   csi.vsphere.vmware.com   Delete          Immediate           true                   41h

# 念のため、に戻せるようバックアップをとっておいてから編集しましょう
$ cp ~/.tkg/config.yaml{,.org}
$ vi ~/.tkg/config.yaml
# (途中は省略)
BASTION_HOST_ENABLED: "true"
# ↑の次の行に必要な設定を追記していく。yamlの文法が崩れないところであれば、どこでもよいはず。
CONTROL_PLANE_STORAGE_CLASS: k8s-dev-storage-policy
WORKER_STORAGE_CLASS: k8s-dev-storage-policy
DEFAULT_STORAGE_CLASS: k8s-dev-storage-policy
STORAGE_CLASSES: ""
CONTROL_PLANE_VM_CLASS: best-effort-xsmall
WORKER_VM_CLASS: best-effort-xsmall
SERVICE_CIDR: 100.64.0.0/13
CLUSTER_CIDR: 100.96.0.0/11
SERVICE_DOMAIN: cluster.local
```
基本は、[ドキュメント](https://docs.vmware.com/en/VMware-Tanzu-Kubernetes-Grid/1.2/vmware-tanzu-kubernetes-grid-12/GUID-tanzu-k8s-clusters-connect-vsphere7.html#step-2-configure-cluster-parameters-3)の指示に従い、パラメータを埋めていきました。
また、[こちら](https://docs.vmware.com/en/VMware-vSphere/7.0/vmware-vsphere-with-tanzu/GUID-7351EEFF-4EF0-468F-A19B-6CEA40983D3D.html) が利用可能なVMリソースのクラスとなるので、「CONTROL_PLANE_VM_CLASS」と「WORKER_VM_CLASS」に指定しましょう。

#TKCの作成
準備は整いました。TKCをデプロイしてみましょう！

```shell:踏み台
# この中からお好きなK8sバージョンを利用します。VERSION以下の文字列をセット。
$ kubectl get tkr
NAME                                VERSION                          CREATED
v1.16.12---vmware.1-tkg.1.da7afe7   1.16.12+vmware.1-tkg.1.da7afe7   46h
v1.16.14---vmware.1-tkg.1.ada4837   1.16.14+vmware.1-tkg.1.ada4837   46h
v1.16.8---vmware.1-tkg.3.60d2ffd    1.16.8+vmware.1-tkg.3.60d2ffd    46h
v1.17.11---vmware.1-tkg.1.15f1e18   1.17.11+vmware.1-tkg.1.15f1e18   46h
v1.17.11---vmware.1-tkg.2.ad3d374   1.17.11+vmware.1-tkg.2.ad3d374   46h
v1.17.7---vmware.1-tkg.1.154236c    1.17.7+vmware.1-tkg.1.154236c    46h
v1.17.8---vmware.1-tkg.1.5417466    1.17.8+vmware.1-tkg.1.5417466    46h
v1.18.5---vmware.1-tkg.1.c40d30d    1.18.5+vmware.1-tkg.1.c40d30d    46h
$ VERSION="1.18.5+vmware.1-tkg.1.c40d30d"

# 既に作成済みのSupervisor namespaceを指定します。
$ NAMESPACE="tkgs-dev"

# デプロイ
$ tkg create cluster my-tkg-cluster --plan=dev --namespace=$NAMESPACE --kubernetes-version=$VERSION
# (以下、出力メッセージ)
Logs of the command execution can also be found at: /tmp/tkg-20201223T082015363212583.log
You are trying to create a cluster with kubernetes version '1.18.5+vmware.1-tkg.1.c40d30d' on vSphere with Tanzu, Please make sure virtual machine image for the same is available in the cluster content library.
Do you want to continue? [y/N]: y
# content libraryに指定のK8sバージョンがないとデプロイできないので注意。「y」で続行！
Workload cluster 'my-tkg-cluster' created

# 上記のメッセージが出ても、worker構築までは、しばらく待つ。。
$ tkg get cluster
 NAME            NAMESPACE  STATUS   CONTROLPLANE  WORKERS  KUBERNETES                     ROLES
 my-tkg-cluster  tkgs-dev   running  1/1           0/1      1.18.5+vmware.1-tkg.1.c40d30d  <none>
 tkc-1           tkgs-dev   running  1/1           1/1      v1.18                          <none>
```
workerは構築されるまでに、タイムラグがあるようです。体感で10分位でした。
上記のWORKERSが1/1になると、デプロイが完了です。
vCenter上で、「tkgs-dev」namespaceに、「my-tkg-cluster」が作成されたことが確認できます！
<img width="824" alt="スクリーンショット 2020-12-23 17 54 33" src="https://user-images.githubusercontent.com/3906298/102981015-bff06a80-454b-11eb-9ead-0ba277e95d95.png">
この後、[Day22](https://qiita.com/hirosat/items/75ec6b5f24fb04cb49f9)で紹介したAPPデプロイを試しましたが、PVもLBも問題なく利用できました！

###TKG CLIでSupervisorクラスタを操作するメリット
まずは、yamlを用意しなくても、vSphere with TanzuのTKCをデプロイできるようになったことが挙げられます。クラスタを量産したい人にとっては良いでしょう。
そして、一番のメリットは、[Day12](https://qiita.com/hirosat/items/fbb906ecbfccede2e226#tkg%E3%81%8C%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88%E3%81%99%E3%82%8Boss%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3)で紹介した各OSSを、導入することが挙げられます。
これらは、TKG CLIをベースとした導入方法となっているため、vSphere with TanzuとTKGの両方のメリットを享受できることになります！将来的には、もっと統合が進み、インストールももっと楽になると思われます。。

はい、本日は終了です。残すところ、あと2日ですね。。
明日は久しぶりに、NUCの話をしようかなと思います。