TKGを使ってvSphere上にKubernetesクラスタをデプロイする

## はじめに

Tanzu Kubernetes Grid(TKG)がリリースされたので、自宅のvSphere環境で検証しました。

すでにmasanaraさんが「[Tanzu Kubernetes Grid 1.0 を使ってみた](https://qiita.com/masanara/items/5565b1a53813b085ed57)」でTKGをご紹介されていますが、今回はBootstrap環境にmacOSを使用して、GUIからデプロイする手順を書きます。

## 今回検証した環境

### Bootstrap環境

今回はmacOSをBootstrap環境として使用します。

- macOS Catalina 10.15.4

### vSphere環境

Kubernetesクラスタをデプロイする環境としてvSphere 6.7u3を使用します。

- vCenter Server 6.7u3 build-15976728
- ESXi 6.7u3 build-15160138 x 1台 ※公式には2台以上のESXiホストが必要です。
  - モデル：Supermicro SYS-E200-8D
  - CPU：Xeon D-1528 (6 CPUs x 1.9 GHz)
  - メモリ：64GB

## TKGを使ってvSphere上にKubernetesクラスタをデプロイする

### Bootstrap環境を準備する

macOSでTKGを使用する場合、以下をインストールする必要があります。

- [Docker Desktop](https://www.docker.com/products/docker-desktop)
- [kubectl](https://kubernetes.io/ja/docs/tasks/tools/install-kubectl/)

また、システム時刻をNTPサーバと同期させておく必要もあります。

### vSphere環境を準備する

TKGを使うためには、事前に以下について準備しておく必要があります。

- TKGインスタンス用クラスタ（`TKG-Cluster` ）でDRSを有効化する
- TKGインスタンス用のリソースプール（`TKG-Pool`）を作成する
- TKGインスタンス用のフォルダ（`TKG-Folder`）を作成する
- TKGインスタンス用に十分な容量を持つデータストア（`datastore1`）が存在する
- TKGインスタンスが接続するネットワーク（`vm-pg`）上でDHCPが動作している
- すべてのホストがNTPサーバと同期している

※（）内は今回使用する環境で作成したオブジェクトの名前です。

`govc find`コマンドで確認すると以下のように出力されます。

```
$ govc find        
/
/Datacenter
/Datacenter/vm
/Datacenter/host
/Datacenter/datastore
/Datacenter/network
/Datacenter/network/vm-pg
/Datacenter/datastore/datastore1
/Datacenter/host/TKG-Cluster
/Datacenter/host/TKG-Cluster/Resources
/Datacenter/host/TKG-Cluster/esxi01.tta.local
/Datacenter/host/TKG-Cluster/Resources/Mgmt-Pool
/Datacenter/host/TKG-Cluster/Resources/Private-Pool
/Datacenter/host/TKG-Cluster/Resources/TKG-Pool
/Datacenter/vm/TKG-Folder
```

### TKGインスタンスのベースとなるテンプレートイメージをvSphereにインポートする

1. [MyVMware](https://www.vmware.com/go/get-tkg)から以下のOVAをダウンロードします。
  - `photon-3-v1.17.3_vmware.2.ova`
  - `photon-3-capv-haproxy-v0.6.3_vmware.1.ova`

2. ダウンロードしたOVAをvCenter Serverへデプロイします。

3. デプロイしたOVAをテンプレートに変換します。

以下は、`govc find`コマンドで確認した結果です。

```
$ govc find -type m  
/Datacenter/vm/Template/photon-3-kube-v1.17.3+vmware.2
/Datacenter/vm/Template/capv-haproxy
```

### TKGをmacOSにインストールする

1. [MyVMware](https://www.vmware.com/go/get-tkg)から以下のファイルをダウンロードします。
  - `tkg-darwin-amd64-v1.0.0_vmware.1.gz`

2. `gunzip`コマンドで展開します。、`/usr/local/bin/`に移動+リネームし、実行権限を付与します。  

    ```
    $ gunzip tkg-darwin-amd64-v1.0.0_vmware.1.gz
    ```

3. 展開したバイナリを`/usr/local/bin/`に移動して、`tkg`にリネームします。

    ```
    $ mv ./tkg-darwin-amd64-v1.0.0_vmware.1 /usr/local/bin/tkg
    ```

4. 実行権限を付与します。

    ```
    $ chmod +x /usr/local/bin/tkg
    ```

5. `tkg version`コマンドを実行して、バージョンが表示されることを確認します。

    ```
    $ tkg version
    Client:
        Version: v1.0.0
        Git commit: 60f6fd5f40101d6b78e95a33334498ecca86176e
    ```

### TKGを使ってManagementクラスタをデプロイする

1. `tkg init --ui`コマンドを実行すると、ブラウザでTanzu Kubernetes Gridのインストーラーが起動します。

    <img width="1440" alt="tkg_installer-1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621351/402bc18a-60f2-7604-9a28-0f53c724048b.png">

2. `DEPLOY ON VSPHERE`ボタンをクリックします。

3. vCenter Serverに接続するための情報を入力して、`CONNECT`をクリックします。

    <img width="1059" alt="tkg_installer-3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621351/4b6410d9-a205-37ba-6e78-5c54e83ca11d.png">

4. Managementクラスタをデプロイするデータセンターを選択します。また、Bootstrap環境で使用しているsshの公開鍵も入力します。

    <img width="1035" alt="tkg_installer-５.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621351/078c620b-0c70-e02d-9755-8d8613bdaa3f.png">

5. Managementクラスタのコントロールプレーンノードの数を決めます。1台デプロイする場合は`Development`を、3台デプロイする場合は`Production`をクリックします。

6. `INSTANCE TYPE`のドロップダウンメニューから、コントロールプレーンノードVMのサイズを選択します。

7. `MANAGEMENT CLUSTER NAME`にManagementクラスタの名前を入力します（オプション）。`API SERVER LOAD BALANCER`のドロップダウンメニューから、APIサーバ用ロードバランサーのテンプレート（`capv-haproxy`）を選択します。

    <img width="1038" alt="tkg_installer-7.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621351/239b0748-1a29-36a1-a791-064f1a83a639.png">

8. Managementクラスタをデプロイするリソースプール、仮想マシンフォルダ、データストアを選択します。

    <img width="1036" alt="tkg_installer-9.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621351/caf4a22e-de57-8436-4bfd-cc21607c33b1.png">

9. Kubernetesクラスタのための、ネットワークを設定します。

    <img width="1041" alt="tkg_installer-11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621351/dd70830c-c14a-8f50-99a4-33d2352d597a.png">

10. TKGインスタンス用のテンプレートを選択します。

    <img width="1038" alt="tkg_installer-13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621351/e74f9876-ace7-c40a-66dc-1cd76530de8c.png">

11. `REVIEW CONFIGURETION`をクリックして、これまでの設定を確認します。問題ないようであれば、`DEPLOY MANAGEMENT CLUSTER`をクリックして、Managementクラスタのデプロイを開始します。

    <img width="1440" alt="tkg_installer-16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621351/b52755c3-830e-f651-7001-7713296d6108.png">


12. Managementクラスタのデプロイが完了したら、ブラウザを閉じます。

    <img width="1440" alt="tkg_installer-17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621351/f59a226c-ea76-c7b6-9c2f-d96baccb0c14.png">

13. `tkg get management-cluster`コマンドでManagementクラスタがデプロイされたことを確認します。

    ```
    $ tkg get management-cluster      
+-----------------------------------+-----------------------------------------------------------------------+
| MANAGEMENT CLUSTER NAME           | CONTEXT NAME                                                          |
+-----------------------------------+-----------------------------------------------------------------------+
| tkg-mgmt-vsphere-20200420012716 * | tkg-mgmt-vsphere-20200420012716-admin@tkg-mgmt-vsphere-20200420012716 |
+-----------------------------------+-----------------------------------------------------------------------+
    ```

### TKGを使ってKubernetesクラスタを展開する

1. `tkg create`コマンドを実行して、Kubernetesクラスタをデプロイします。

    ```
    $ tkg create cluster dev-cluster --plan=dev
    Logs of the command execution can also be found at: /var/folders/15/gygby50x4h15p8zgz27b71g80000gp/T/tkg-20200420T020425978485888.log
Creating workload cluster 'dev-cluster'...


    Context set for workload cluster dev-cluster as dev-cluster-admin@dev-cluster

    Waiting for cluster nodes to be available...

    Workload cluster 'dev-cluster' created
    ```

2. `kubectl config get-contexts`コマンドとvCenter Serverから`dev-cluster`が展開されていることを確認します。

    ```
    kubectl config get-contexts
    CURRENT   NAME                                                                    CLUSTER                           AUTHINFO                                NAMESPACE
    *         dev-cluster-admin@dev-cluster                                           dev-cluster                       dev-cluster-admin                       
              tkg-mgmt-vsphere-20200420012716-admin@tkg-mgmt-vsphere-20200420012716   tkg-mgmt-vsphere-20200420012716   tkg-mgmt-vsphere-20200420012716-admin
    ```

    <img width="516" alt="tkg_dev-cluster.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621351/12f0acdb-d044-98c2-22d6-6c31c878977d.png">


### おまけ：`Waiting for cert-manager to be available...`でタイムアウトして、Managementクラスタのデプロイに失敗する

Managementクラスタのデプロイ中、以下のように`Waiting for cert-manager to be available...`の部分でタイムアウトして、デプロイに失敗しました。

<img width="1440" alt="tkg_cert-manager_error.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621351/fe06761c-a7e9-48eb-ca7b-f4b6cf0b88ed.png">

いろいろと調べた結果、DHCPサーバにvSphere環境用のDNSサーバを通知する設定を入れていないことが原因でした。ManagementクラスタがvCenter Serverと通信するために、vCenter Serverを名前解決できる必要があることを失念していました...

最終的に、DHCPサーバにDNSサーバを通知する設定を追加してリトライすることで、Managementクラスタのデプロイに成功しました。