NUCで始めるVMware Tanzu - TKGの導入(Managementクラスタ)

本日も、サクッとTKGの導入を進めていきましょう。

#現在の構成でTKGを利用する際の注意事項
[General Requirements](https://docs.vmware.com/en/VMware-Tanzu-Kubernetes-Grid/1.2/vmware-tanzu-kubernetes-grid-12/GUID-mgmt-clusters-vsphere.html) に、事細かくvSphere環境にデプロイする条件が書かれているのですが、今回の構成で一番困るのが、「[Management Clusters Unnecessary on vSphere 7](https://docs.vmware.com/en/VMware-Tanzu-Kubernetes-Grid/1.2/vmware-tanzu-kubernetes-grid-12/GUID-mgmt-clusters-vsphere.html)」のところです。要するに、「vSphere 7 だったら [vSphere with Tanzu](https://docs.vmware.com/jp/VMware-vSphere/7.0/vmware-vsphere-with-tanzu/GUID-70CAF0BB-1722-4526-9CE7-D5C92C15D7D0.html) 使えよ！」と、言っていますｗ
詳細は別途、vSphere with Tanzu の説明回を設けたいと思ってますが、**Supervisor Cluster** という Management Cluster の上位互換のようなものがあり、[TKGからそちらに接続して使う方法](https://docs.vmware.com/en/VMware-Tanzu-Kubernetes-Grid/1.2/vmware-tanzu-kubernetes-grid-12/GUID-tanzu-k8s-clusters-connect-vsphere7.html)が紹介されてます。。ただ一応、vSphere with Tanzu 利用前であれば、非推奨だがデプロイ可能です。TKGを学ぶことが目的なので、今回はこのまま突き進みます。

他の主な注意点は、以下の通りです。

- 最低2台のホスト(ESXi)で構成されたvSphere Clusterが必要
- Control plane用のLBには、[kube-vip](https://kube-vip.io/) が使われているが、Service用のLBは用意してないので、[MetalLB](https://metallb.universe.tf/)などのソリューションを自前で用意する必要がある。（これ、結構重要！どこかで別途、取り扱いたいと思う。）
- vCenterのSSOアカウントでTKGのパーミッションを管理している。tkg用のアカウントを作って、[適切なパーミッション](https://docs.vmware.com/en/VMware-Tanzu-Kubernetes-Grid/1.2/vmware-tanzu-kubernetes-grid-12/GUID-mgmt-clusters-vsphere.html)を付与しましょう。（今回は検証目的なので、adminで行きます:sweat_smile:）

# Photon OSのインストール
TKGのノードVM用イメージが、当然必要ですよね？まずは、[My VMware](https://www.vmware.com/go/get-tkg)から以下をダウンロード。

- Photon v3 Kubernetes v1.19.3 OVA（←バージョンは、その時によって異なる）

Nested環境の方に入れていきます。「OVFテンプレートのデプロイ」
<img width="400" alt="スクリーンショット 2020-12-13 17 50 48" src="https://user-images.githubusercontent.com/3906298/102007366-dc322180-3d6b-11eb-9565-fcd1c5825b22.png">
ダウンロードしたファイルを指定します。
<img width="600" alt="スクリーンショット 2020-12-13 17 55 48" src="https://user-images.githubusercontent.com/3906298/102007441-772afb80-3d6c-11eb-92fb-1e32c3c80c37.png">
2では「Discovered virtual machine」を指定、3では「nested-cluster01」を指定、５でEULAに同意と指定しました。6では、vsanDatastoreを指定して、「Management Storage policy - Thin」を指定してみます。
<img width="600" alt="スクリーンショット 2020-12-13 18 04 30" src="https://user-images.githubusercontent.com/3906298/102007572-ac841900-3d6d-11eb-94d3-075eb5be99a8.png">
ネットワークは、「DSwitch 1-vMotion」を選択してみました。
<img width="600" alt="スクリーンショット 2020-12-13 18 17 08" src="https://user-images.githubusercontent.com/3906298/102007815-75166c00-3d6f-11eb-874b-671221e776a2.png">
しばらくすると、アップロードが完了します。引き続き、「テンプレートに変換」
<img width="400" alt="スクリーンショット 2020-12-13 18 25 51" src="https://user-images.githubusercontent.com/3906298/102008023-dd198200-3d70-11eb-8c09-faa4089afd01.png">
テンプレートになったため、「ホストおよびクラスタ」のリソースからは見えなくなります。代わりに、「仮想マシンおよびテンプレート」メニューで、テンプレートが確認できます。
<img width="600" alt="スクリーンショット 2020-12-13 18 27 22" src="https://user-images.githubusercontent.com/3906298/102008032-f3bfd900-3d70-11eb-8963-8517f38294e6.png">
#Managementクラスタのデプロイ
いよいよデプロイします！ここで2つの選択肢があるのですが、「tkg init --ui」を実行すると、Webベースのインストーラが実行でき、「tkg init」だと、CLIベースで導入を行えます。GUIベースの方が、何を選択しているか把握しやすいので、初回はGUIベースがオススメです。

```shell:ローカルPC
# 踏み台でUIを起動するため、ローカルPCのブラウザから閲覧できるよう、8080ポートをSSHポートフォワードしてあげる
% ssh -L 8080:localhost:8080 ubuntu@192.168.5.41
# ログイン成功。ここからは踏み台での操作
$ tkg init --ui
# (省略)
unable to open browser: exec: "xdg-open": executable file not found in $PATH
# エラーを調べると、このubuntuには、xdg-utilが足りないようだった。
$ sudo apt-get update
$ sudo apt install xdg-utils -y
# エラーがないことを確認
$ tkg init --ui
Logs of the command execution can also be found at: /tmp/tkg-20201213T131852552834915.log

Validating the pre-requisites...
Serving kickstart UI at http://127.0.0.1:8080
unable to open browser: exit status 3
```
踏み台上でブラウザの起動に失敗してexitしているが、特に問題なし。
ローカルPCのブラウザで、localhost:8080 にアクセスするとインストーラが起動。vSphereを選択。
<img width="1652" alt="スクリーンショット 2020-12-13 22 35 55" src="https://user-images.githubusercontent.com/3906298/102013450-9ab56c80-3d93-11eb-9d25-7d5d4f22c68e.png">
1では、vCenterのSSO接続情報を入力して「CONNECT」
<img width="1017" alt="スクリーンショット 2020-12-13 22 38 52" src="https://user-images.githubusercontent.com/3906298/102013521-0ac3f280-3d94-11eb-8d0c-e2dfd90752af.png">
vSphere 7 環境なので、警告が出る。構わず、「DEPLOY TKG MANAGEMENT CLUSTER」を選択。
<img width="1195" alt="スクリーンショット 2020-12-13 22 41 01" src="https://user-images.githubusercontent.com/3906298/102013551-4ced3400-3d94-11eb-952f-f31e2bfc1a75.png">
ここで、踏み台のSSHの公開鍵が必要となるので、別端末を立ち上げて踏み台に入り、鍵を作成

```shell:踏み台
ssh-keygen -t rsa -b 4096
# Enterを３回ほど押す
cat ~/.ssh/id_rsa.pub
```
ブラウザに戻り、DCを選択して、鍵の文字列をペーストして、「NEXT」
<img width="1193" alt="スクリーンショット 2020-12-13 23 10 58" src="https://user-images.githubusercontent.com/3906298/102014283-87f16680-3d98-11eb-9d82-5c1ae94f0982.png">
2はManagement Clusterの設定。今回は、「Development」で「medium」インスタンス、workerも「medium」で作成してみます。ControlPlane Endpointは、DHCP範囲外、かつ、DHCP rangeと同じsubnetである必要があるので、「192.168.5.51」と指定。
<img width="1183" alt="スクリーンショット 2020-12-13 23 19 03" src="https://user-images.githubusercontent.com/3906298/102014500-a310a600-3d99-11eb-8fd7-527d8c0cb5c7.png">
3は、Optionalなので入れなくて良さそう。「NEXT」
<img width="600" alt="スクリーンショット 2020-12-13 23 25 47" src="https://user-images.githubusercontent.com/3906298/102014691-a22c4400-3d9a-11eb-9402-000cba16655e.png">
4では、Resourcesを選択式で指定するため、一度vCenterに移動し、リソースを作っていく。
まずは、「VM FOLDER」用に、「tkg-dev」という仮想マシンフォルダを作った。
<img width="600" alt="スクリーンショット 2020-12-13 23 32 13" src="https://user-images.githubusercontent.com/3906298/102015083-ba04c780-3d9c-11eb-93fe-06bbf5a3b860.png">
<img width="400" alt="スクリーンショット 2020-12-13 23 43 12" src="https://user-images.githubusercontent.com/3906298/102015117-fcc69f80-3d9c-11eb-917c-189d6b61b5e0.png">
続いて、「tkg-dev」というリソースプールを作成。
<img width="400" alt="スクリーンショット 2020-12-13 23 33 07" src="https://user-images.githubusercontent.com/3906298/102015152-27b0f380-3d9d-11eb-98a1-f94a93b6c8dc.png">
<img width="400" alt="スクリーンショット 2020-12-13 23 34 19" src="https://user-images.githubusercontent.com/3906298/102015185-5b8c1900-3d9d-11eb-9ed8-edaf72852406.png">
<img width="600" alt="スクリーンショット 2020-12-13 23 47 09" src="https://user-images.githubusercontent.com/3906298/102015212-8e361180-3d9d-11eb-8bd0-12ae88c30d7c.png">
再びTKGの画面に戻り、「Specify the Resources」横の更新ボタンを押すと、選択出来るようになる。（・・はずだったが、セッションが切れたのか読み込みが失敗したので、ブラウザをリロードしてStep1から入力し直した:sweat_smile:）
<img width="1150" alt="スクリーンショット 2020-12-13 23 52 04" src="https://user-images.githubusercontent.com/3906298/102015367-99d60800-3d9e-11eb-9f6b-95da743d5131.png">
5はCNI設定。「DSwitch-VM Network」を選択。
<img width="981" alt="スクリーンショット 2020-12-14 0 03 01" src="https://user-images.githubusercontent.com/3906298/102015572-ce968f00-3d9f-11eb-8829-9fdb15d0b8a0.png">
6、OS Image。事前にアップロードした場所を指定。
<img width="886" alt="スクリーンショット 2020-12-14 0 04 44" src="https://user-images.githubusercontent.com/3906298/102015626-12899400-3da0-11eb-9447-017a78b2cb0b.png">
７、エクスペリエンス向上プログラム。どちらを選んでも良い。「NEXT」
<img width="1145" alt="スクリーンショット 2020-12-14 0 06 15" src="https://user-images.githubusercontent.com/3906298/102015659-46fd5000-3da0-11eb-882e-4a270aff7660.png">
「REVIEW CONFIGURATION」を押すと、確認画面が出る。また、CLIで投入する場合のコマンドも表示される。問題なければ、「DEPLOY MANAGEMENT CLUSTER」！
（なお、firefoxのせいなのかは不明だが、この画面の次に進まないトラブルが発生。Chromeにして、いくつかの選択肢も変えたら、先に進んだ。どれが効いたのかは不明。単にセッションが切れたのかも。）
<img width="1222" alt="スクリーンショット 2020-12-14 0 12 18" src="https://user-images.githubusercontent.com/3906298/102015844-474a1b00-3da1-11eb-8160-d31b4e56a4c8.png">
このように、何らかの処理をやってる画面がしばらく続く・・・
<img width="1636" alt="スクリーンショット 2020-12-14 1 19 21" src="https://user-images.githubusercontent.com/3906298/102017805-67330c00-3dac-11eb-8f11-fd180ddb6424.png">
２０分ほどして、このような画面が出たら、インストール成功です！
<img width="1640" alt="スクリーンショット 2020-12-14 1 31 27" src="https://user-images.githubusercontent.com/3906298/102017865-d9a3ec00-3dac-11eb-805a-c593c8cb2c73.png">
tkgコマンドでも確認してみましょう。

```shell:踏み台
# Management Cluster一覧の表示
$ tkg get mc
 MANAGEMENT-CLUSTER-NAME            CONTEXT-NAME                                                           STATUS
 tkg-mgmt-vsphere-20201213161849 *  tkg-mgmt-vsphere-20201213161849-admin@tkg-mgmt-vsphere-20201213161849  Success

# ControlPlaneやWorkerの稼働台数サマリも見たい場合はこちら
$ tkg get cluster --include-management-cluster
 NAME                             NAMESPACE   STATUS   CONTROLPLANE  WORKERS  KUBERNETES        ROLES
 tkg-mgmt-vsphere-20201213161849  tkg-system  running  1/1           1/1      v1.19.3+vmware.1  management

# ノード情報
$ kubectl get nodes -o wide
NAME                                                   STATUS   ROLES    AGE   VERSION            INTERNAL-IP     EXTERNAL-IP     OS-IMAGE                 KERNEL-VERSION   CONTAINER-RUNTIME
tkg-mgmt-vsphere-20201213161849-control-plane-xzfzg    Ready    master   30m   v1.19.3+vmware.1   192.168.5.116   192.168.5.116   VMware Photon OS/Linux   4.19.150-1.ph3   containerd://1.4.1
tkg-mgmt-vsphere-20201213161849-md-0-b7d7549df-hm8wt   Ready    <none>   27m   v1.19.3+vmware.1   192.168.5.117   192.168.5.117   VMware Photon OS/Linux   4.19.150-1.ph3   containerd://1.4.1

# Pod一覧。最初からCSIやCNI(antrea)などがインストールされているのが特徴
ubuntu@nested-bastion01:~$ kubectl get pod -A
NAMESPACE                           NAME                                                                          READY   STATUS    RESTARTS   AGE
capi-kubeadm-bootstrap-system       capi-kubeadm-bootstrap-controller-manager-7bb5cbfc69-mddcd                    2/2     Running   0          27m
capi-kubeadm-control-plane-system   capi-kubeadm-control-plane-controller-manager-749b7b5dc5-k8lwh                2/2     Running   0          27m
capi-system                         capi-controller-manager-86f86fb9df-7tfp6                                      2/2     Running   0          27m
capi-webhook-system                 capi-controller-manager-6847947f74-fzd5z                                      2/2     Running   0          27m
capi-webhook-system                 capi-kubeadm-bootstrap-controller-manager-656645ccc4-cdgsm                    2/2     Running   0          27m
capi-webhook-system                 capi-kubeadm-control-plane-controller-manager-6cf9799f4c-sqgdq                2/2     Running   0          27m
capi-webhook-system                 capv-controller-manager-66bd87d667-q2mjz                                      2/2     Running   0          27m
capv-system                         capv-controller-manager-6cd6b9c454-lgdr4                                      2/2     Running   0          27m
cert-manager                        cert-manager-556f68587d-lzdfj                                                 1/1     Running   0          31m
cert-manager                        cert-manager-cainjector-5bc85c4c69-ffdtl                                      1/1     Running   0          31m
cert-manager                        cert-manager-webhook-7bd69dfcf8-v6tqx                                         1/1     Running   0          31m
kube-system                         antrea-agent-2cmv7                                                            2/2     Running   0          32m
kube-system                         antrea-agent-q2wmf                                                            2/2     Running   0          29m
kube-system                         antrea-controller-5d594c5cc7-zxlm8                                            1/1     Running   0          32m
kube-system                         coredns-5d6f7c958-cwqv4                                                       1/1     Running   0          32m
kube-system                         coredns-5d6f7c958-pxlr9                                                       1/1     Running   0          32m
kube-system                         etcd-tkg-mgmt-vsphere-20201213161849-control-plane-xzfzg                      1/1     Running   0          32m
kube-system                         kube-apiserver-tkg-mgmt-vsphere-20201213161849-control-plane-xzfzg            1/1     Running   0          32m
kube-system                         kube-controller-manager-tkg-mgmt-vsphere-20201213161849-control-plane-xzfzg   1/1     Running   0          32m
kube-system                         kube-proxy-qnsff                                                              1/1     Running   0          32m
kube-system                         kube-proxy-st5gf                                                              1/1     Running   0          29m
kube-system                         kube-scheduler-tkg-mgmt-vsphere-20201213161849-control-plane-xzfzg            1/1     Running   0          32m
kube-system                         kube-vip-tkg-mgmt-vsphere-20201213161849-control-plane-xzfzg                  1/1     Running   0          32m
kube-system                         vsphere-cloud-controller-manager-xh7tk                                        1/1     Running   0          32m
kube-system                         vsphere-csi-controller-5b6f54ccc5-266k8                                       5/5     Running   0          32m
kube-system                         vsphere-csi-node-6fhvs                                                        3/3     Running   0          32m
kube-system                         vsphere-csi-node-jrlfj                                                        3/3     Running   0          29m
```
うん、想定通り出来てますね！:grin:

# リソース魚拓
###Management Cluster
ControlPlaneは、そこそこ使用してますね。CPU:0.5GHz、Mem：1GB、ストレージ：11GB
<img width="1144" alt="スクリーンショット 2020-12-14 2 06 35" src="https://user-images.githubusercontent.com/3906298/102018539-238ed100-3db1-11eb-899c-f4ed5fc446a6.png">
Workerはまだ何も動いてなさそう。CPU:0.2GHz、Mem:0.5GB、ストレージ12GB
<img width="1142" alt="スクリーンショット 2020-12-14 2 09 40" src="https://user-images.githubusercontent.com/3906298/102018580-77011f00-3db1-11eb-9b6b-d3c8640b65c6.png">
踏み台は、CPUとMemほぼ0。すげぇ。ストレージは色々とインストールしたので、16GB消費。
<img width="1139" alt="スクリーンショット 2020-12-14 2 11 12" src="https://user-images.githubusercontent.com/3906298/102018625-b2035280-3db1-11eb-80ad-2d5701c5674a.png">
###Nested環境全体
ついにNUC１台分のメモリを消費！CPUは大したことない。ストレージも64GB程度
<img width="1144" alt="スクリーンショット 2020-12-14 2 16 31" src="https://user-images.githubusercontent.com/3906298/102018735-7cab3480-3db2-11eb-8c6d-19e34d37d1cd.png">
###物理NUC全体
まだ余力は残している感じですね。。
<img width="1143" alt="スクリーンショット 2020-12-14 2 19 30" src="https://user-images.githubusercontent.com/3906298/102018800-ddd30800-3db2-11eb-8bb0-1793a9bab49c.png">

やっと投稿ペースがカレンダーに追いついた！それではまた明日。