Tanzu Kubernetes Grid 1.0 を使ってみた


VMwareからTanzu Kubernetes Grid (TKG)がリリースされたので、vSphere 6.7u3環境で使ってみました。

- [Release Note](https://docs.vmware.com/en/VMware-Tanzu-Kubernetes-Grid/1.0/rn/VMware-Tanzu-Kubernetes-Grid-10-Release-Notes.html)
- [Document](https://docs.vmware.com/en/VMware-Tanzu-Kubernetes-Grid/1.0/vmware-tanzu-kubernetes-grid-10/GUID-index.html)
- [Download](https://my.vmware.com/web/vmware/details?downloadGroup=TKG-100&productId=988&rPId=45068)

## Tanzu Kubernetes Gridとは

Cluster APIを使ってvSphereとAWSの環境にKubernetesクラスター(Tanzu Kubernetes Cluster)を作ることができます。内部的には、[「Cluster APIをつかってvSphere環境にKubernetesクラスターを作成する」](https://qiita.com/masanara/items/47aec0e1d2ab1fc4f664)で紹介した内容がtkg cliで簡素化されており、[kind](https://github.com/kubernetes-sigs/kind)を利用してvSphere環境にManagement Clusterを構成し、Cluster APIをホストします。バージョン1.0では以下の環境にTanzu Kubernetes Gridをデプロイすることが可能です。vSphere 7の登場でvSphere with Kubernetesが注目を集めていますが、vSphere 6.7u3の環境にもTKGを構成することが可能です。

- vSphere 6.7u3
- vSphere 7.0
- Amazon EC2

> vSphere 7.0ではvSphere with Kubernetesとして利用することができるSupervisor Clusterで同等の機能を実現できます。Supervisor Clusterを有効な場合、TKGのManagement Clusterを有効化する必要はありません。Supervisor Clusterを無効な場合、TKGのMaanagement Clsuterを利用することができますが、Supervisor Clusterの利用が推奨されています。

### Bootstrap環境

Bootstrap環境はラップトップ、サーバー、VMなどTanzu Kubernetes Grid CLIをダウンロードして実行する環境です。Docker上で起動するkind(Kubernetes in Docker)によりBootstrap Clusterを構成します。このBootstrap Clusterを利用して、Management Clusterの構成を行います。Management Clusterが正常に構成されると、Bootstrap Clusterは削除されます。

### Management Cluster

Management ClusterはTanzu Kubernetes Gridインスタンスの管理と運用を行うためのKubernetes Clusterです。Cluster APIをホストしており、Tanzu Kubernetes Grid CLIによりTanzu Kubernetes Clusterの追加・削除・管理を可能にします。Management Clusterにはユーザーワークロードを実行するための環境として利用しないでください。

### Tanzu Kubernetes Clusters

Tanzu Kubernetes ClusetrはManagement ClusterによってデプロイされるKubernetres Clusterです。Tanzu Kubernetes Grid CLI(tkg cli)によって、異なるサイズ、バージョンのTanzu Kubernetes Clusterを複数作成することが可能です。作成されたTanzu Kubernetes ClusterはManagement Clusterによってライフサイクル管理が可能です。クラスター内のPod間通信には[Calico](https://www.projectcalico.org/)が利用されています。

## vSphere環境でTanzu Kubernetes Gridを使ってみる

Bootstrap環境でtkg cli実行することでvSphere上にManagement Clusterを構成することができます。tkg cliにはUIモードがあり、UIを利用してManagement Clsuterを構成することができますが、今回はUIを利用せずに設定ファイルを利用してManagement Clusterを構成します。

### vSphereの要件

- vSpher上でDRS有効なこと
- vSphere上にTKGインスタンスデプロイ先のリソースプール
- vSphere上にTKGインスタンスデプロイ先のフォルダ
- vSphere上にTKGインスタンスデプロイ先のデータストア
- TKGインスタンス接続先のネットワークでDHCPが利用できること
- TKGインスタンス接続先のネットワークがインターネットにアクセス可能なこと(アクセスできない場合はローカルレジストリを準備する必要がある)
- TKGインスタンス接続先のネットワークがvCenter Serverにアクセス可能なこと
- TKGインスタンス全てのホストからNTPサービスにアクセス可能なこと
- bootstrap環境(Linux or macOS)にkubectl, Dockerがインストールされていること

### vSphere環境に対するOVAのインポート

vSphre向けのTKGは以下のバイナリで構成されます。tkg cliは現状Windowsに対応していません。

- Tanzu Kubernetes Grid CLI (tkg cli) *linux or macos
- Photon v3 Kubernetes v1.17.3 OVA
- Photon v3 capv haproxy v0.6.3 OVA

Kubernetes/haproxy OVAをvSphere環境にデプロイし、テンプレートに変換します。

![image-20200412100211270.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27668/0b724685-5e44-0897-0900-f11e9ad81489.png "image-20200412100211270.png")


#### Bootstrapの準備

tkg cliをBootstrap環境にダウンロードして```tkg get management-cluster```コマンドを実行します。

```bash
# tkg get management-cluster
+-------------------------+--------------+
| MANAGEMENT CLUSTER NAME | CONTEXT NAME |
+-------------------------+--------------+
+-------------------------+--------------+
```

初回実行時に、```~/.tkg/config.yaml```が生成されます。


```yaml
KUBERNETES_VERSION: v1.17.3+vmware.2
overridesFolder: /root/.tkg/overrides
providers:
  - name: cluster-api
    url: /root/.tkg/providers/cluster-api/v0.3.3/core-components.yaml
    type: CoreProvider
  - name: aws
    url: /root/.tkg/providers/infrastructure-aws/v0.5.2/infrastructure-components.yaml
    type: InfrastructureProvider
  - name: vsphere
    url: /root/.tkg/providers/infrastructure-vsphere/v0.6.3/infrastructure-components.yaml
    type: InfrastructureProvider
  - name: tkg-service-vsphere
    url: /root/.tkg/providers/infrastructure-tkg-service-vsphere/v1.0.0/unused.yaml
    type: InfrastructureProvider
  - name: kubeadm
    url: /root/.tkg/providers/bootstrap-kubeadm/v0.3.3/bootstrap-components.yaml
    type: BootstrapProvider
  - name: kubeadm
    url: /root/.tkg/providers/control-plane-kubeadm/v0.3.3/control-plane-components.yaml
    type: ControlPlaneProvider
images:
    cert-manager:
        repository: registry.tkg.vmware.run/cert-manager
        tag: v0.11.0_vmware.1
```

以下のパラメータを```.tkg/config.yaml```に追記します。パラメータの説明は[マニュアル](https://docs.vmware.com/en/VMware-Tanzu-Kubernetes-Grid/1.0/vmware-tanzu-kubernetes-grid-10/GUID-install-tkg-vsphere-cli.html)に記載がありますが、vSphere上のオブジェクト(フォルダ、リソースプール、テンプレート名など)はインベントリパスも含めて指定する必要があります。

```bash
VSPHERE_SERVER: 10.44.59.100
VSPHERE_USERNAME: administrator
VSPHERE_PASSWORD: VMware1!
VSPHERE_DATACENTER: /DC
VSPHERE_DATASTORE: /DC/datastore/NFSDS
VSPHERE_NETWORK: tkg
VSPHERE_RESOURCE_POOL: /DC/host/CL/Resources/TKG
VSPHERE_FOLDER: /DC/vm/capi
VSPHERE_TEMPLATE: /DC/vm/template/photon-3-kube-v1.17.3+vmware.2
VSPHERE_HAPROXY_TEMPLATE: /DC/vm/template/capv-haproxy
VSPHERE_DISK_GIB: "20"
VSPHERE_NUM_CPUS: "1"
VSPHERE_MEM_MIB: "2048"
VSPHERE_SSH_AUTHORIZED_KEY: "ssh-rsa XXXXXXXXXXXX...."
SERVICE_CIDR: "100.64.0.0/13"
CLUSTER_CIDR: "100.96.0.0/11"
```

### Management Clusterの作成

```tkg init```でBootstrap ClusterとManagement Clusterの構成を開始します。

```bash
# tkg init --infrastructure=vsphere --name=mgmt
Logs of the command execution can also be found at: /tmp/tkg-20200412T111903196848259.log

Validating the pre-requisites...

Setting up management cluster...
Validating configuration...
Using infrastructure provider vsphere:v0.6.3
Generating cluster configuration...
Setting up bootstrapper...
Installing providers on bootstrapper...
Fetching providers
Installing cert-manager
Waiting for cert-manager to be available...
Installing Provider="cluster-api" Version="v0.3.3" TargetNamespace="capi-system"
Installing Provider="bootstrap-kubeadm" Version="v0.3.3" TargetNamespace="capi-kubeadm-bootstrap-system"
Installing Provider="control-plane-kubeadm" Version="v0.3.3" TargetNamespace="capi-kubeadm-control-plane-system"
Installing Provider="infrastructure-vsphere" Version="v0.6.3" TargetNamespace="capv-system"
Start creating management cluster...
Installing providers on management cluster...
Fetching providers
Installing cert-manager
Waiting for cert-manager to be available...
Installing Provider="cluster-api" Version="v0.3.3" TargetNamespace="capi-system"
Installing Provider="bootstrap-kubeadm" Version="v0.3.3" TargetNamespace="capi-kubeadm-bootstrap-system"
Installing Provider="control-plane-kubeadm" Version="v0.3.3" TargetNamespace="capi-kubeadm-control-plane-system"
Installing Provider="infrastructure-vsphere" Version="v0.6.3" TargetNamespace="capv-system"
Waiting for the management cluster to get ready for move...
Moving all Cluster API objects from bootstrap cluster to management cluster...
Performing move...
Discovering Cluster API objects
Moving Cluster API objects Clusters=1
Creating objects in the target cluster
Deleting objects from the source cluster
Context set for management cluster mgmt as 'mgmt-admin@mgmt'.

Management cluster created!


You can now create your first workload cluster by running the following:

  tkg create cluster [name] --kubernetes-version=[version] --plan=[plan]
```

#### Bootstrap Clusterの状態

最初にtkgコマンドを実行したホストで[kind](https://github.com/kubernetes-sigs/kind)が起動し、このkindをBootstrap ClusterとしてvSphere環境にManagement Clusterを構成します。Management Clusterの構成に成功するとkindのBootstrap Clusterは自動的に削除されます。

```bash
# kubectl get nodes
NAME                                          STATUS   ROLES    AGE    VERSION
tkg-kind-bq97l69upeqblofkooag-control-plane   Ready    master   112s   v1.17.3+vmware.1
```

#### Management Clusterの状態

Management Clusterは```~/.tkg/config.yaml```で指定したフォルダ・リソースプールに作成されます。haproxyがロードバランサー x 1、Master x 1、Node x 1の構成で作成されます。

![image-20200412113332022.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27668/87bf831c-7e70-b844-3cc5-df06b405e43c.png "image-20200412113332022.png")


Management Clusterに接続するためのContextは、```~/.kube/config```に自動的に追加されます。

```bash
# kubectl config get-contexts
CURRENT   NAME              CLUSTER   AUTHINFO     NAMESPACE
*         mgmt-admin@mgmt   mgmt      mgmt-admin
```

Management ClusterはMaster x 1とNode x 1で構成されています。

```bash
# kubectl get nodes -o wide
NAME                        STATUS   ROLES    AGE   VERSION            INTERNAL-IP      EXTERNAL-IP      OS-IMAGE                 KERNEL-VERSION   CONTAINER-RUNTIME
mgmt-control-plane-fx5ld    Ready    master   12m   v1.17.3+vmware.2   192.168.20.139   192.168.20.139   VMware Photon OS/Linux   4.19.112-1.ph3   containerd://1.3.3
mgmt-md-0-747fd6bcc-2tfff   Ready    <none>   10m   v1.17.3+vmware.2   192.168.20.35    192.168.20.35    VMware Photon OS/Linux   4.19.112-1.ph3   containerd://1.3.3
```

tkgコマンドでManagement Clusterを確認することが可能です。

```bash
# tkg get management-cluster
+-------------------------+-----------------+
| MANAGEMENT CLUSTER NAME | CONTEXT NAME    |
+-------------------------+-----------------+
| mgmt *                  | mgmt-admin@mgmt |
+-------------------------+-----------------+
```

### Tanzu Kubernetes Clusterの作成

```tkg create```コマンドでTanzu Kubernetes Clusterを作成することが可能です。```-c```でMasterの数、```-w```でノードの数を指定することが可能です。

```bash
# tkg create cluster tkc01 -p prod -c 3 -w 4
Logs of the command execution can also be found at: /tmp/tkg-20200412T132030005381976.log
Creating workload cluster 'tkc01'...


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

Waiting for cluster nodes to be available...

Workload cluster 'tkc01' created
```

しばらくして作成が完了すると、作成したクラスターのContextが追加されデフォルトのContextが変更されます。

```bash
# kubectl config get-contexts
CURRENT   NAME                CLUSTER   AUTHINFO      NAMESPACE
          mgmt-admin@mgmt     mgmt      mgmt-admin
*         tkc01-admin@tkc01   tkc01     tkc01-admin
# kubectl get nodes
NAME                         STATUS   ROLES    AGE     VERSION
tkc01-control-plane-c9mpr    Ready    master   11m     v1.17.3+vmware.2
tkc01-control-plane-drjgd    Ready    master   3m55s   v1.17.3+vmware.2
tkc01-control-plane-jds9s    Ready    master   90s     v1.17.3+vmware.2
tkc01-md-0-dbb597c65-2hsln   Ready    <none>   4m8s    v1.17.3+vmware.2
tkc01-md-0-dbb597c65-cs29n   Ready    <none>   8m14s   v1.17.3+vmware.2
tkc01-md-0-dbb597c65-qhc5b   Ready    <none>   4m8s    v1.17.3+vmware.2
tkc01-md-0-dbb597c65-tkqgs   Ready    <none>   6m9s    v1.17.3+vmware.2
```

作成したTanzu Kubernetes Clusterを構成するVMはManagement Clusterと同じリソースプールに作成されます。

![image-20200412134006304.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27668/39f9adad-7ea1-b778-cb14-72726105f14d.png "image-20200412134006304.png")


更にクラスターを作成した場合も、同じリソースプールにVMが追加されます。

```bash
# tkg create cluster tkc02 -p dev -w 3
Logs of the command execution can also be found at: /tmp/tkg-20200412T135518055957683.log
Creating workload cluster 'tkc02'...


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

Waiting for cluster nodes to be available...

Workload cluster 'tkc02' created
```

![image-20200412140657572.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27668/adb833ce-36f4-a84e-c34f-9acd0707d445.png "image-20200412140657572.png")


作成したTanzu Kubernetes Clusterはtkgコマンドで確認することができます。

```bash
# tkg get clusters
+-------+-------------+
| NAME  | STATUS      |
+-------+-------------+
| tkc01 | Provisioned |
| tkc02 | Provisioned |
+-------+-------------+
```

### Tanzu Kubernetes Clusterのスケールアウト・イン

また作成済みのClusterのNode数を変更することも可能です。(増減ともに可能)

```bash
# kubectl get nodes
NAME                          STATUS   ROLES    AGE     VERSION
tkc02-control-plane-d8p2z     Ready    master   9m      v1.17.3+vmware.2
tkc02-md-0-674fc8479f-dvgmp   Ready    <none>   4m9s    v1.17.3+vmware.2
tkc02-md-0-674fc8479f-nhs9c   Ready    <none>   4m9s    v1.17.3+vmware.2
tkc02-md-0-674fc8479f-s26ph   Ready    <none>   7m14s   v1.17.3+vmware.2
```

tkg cliでNode数を4に変更します。

```bash
# tkg scale cluster tkc02 -w 4
Successfully updated worker node machine deployment replica count for cluster tkc02
workload cluster tkc02 is being scaled
```

間もなくClusterのNodeが一台追加されます。

```bash
# kubectl get nodes
NAME                          STATUS   ROLES    AGE     VERSION
tkc02-control-plane-d8p2z     Ready    master   13m     v1.17.3+vmware.2
tkc02-md-0-674fc8479f-dvgmp   Ready    <none>   7m38s   v1.17.3+vmware.2
tkc02-md-0-674fc8479f-mxds4   Ready    <none>   112s    v1.17.3+vmware.2
tkc02-md-0-674fc8479f-nhs9c   Ready    <none>   7m38s   v1.17.3+vmware.2
tkc02-md-0-674fc8479f-s26ph   Ready    <none>   10m     v1.17.3+vmware.2
```