AWS上にTanzu Community Editionでk8sクラスタを構築してみた

## 概要

先日、VMware製品のTanzuについて資料を眺めていました。[Tanzu公式ドキュメント](https://tanzu.vmware.com/jp/tanzu)

実機で使用感を確かめたくなり調べていたところ、Tanzuには`Tanzu Community Edition` と呼ばれる無償版が提供されており、本記事はこちらを使ってみた記録です。

個人環境にクラスタを建てるリソースがなく、今回はAWS上でTansuを建ててみて、使用感を確かめてました。（個人的には、VMware製品の知見がほぼないので、いずれはVSphere上にTanzuを建てる構成もやりたいと思っています。）

## やりたいこと

* AWS上で、Tanzu Community Editionでk8sクラスタを構築してみる
* AWS上で複数台クラスタを建て、マルチクラスタ構成の使用感を確かめてみる
  * 複数クラスタを一括して管理する機能である`Tanzu Mission Control` は無償版がないため、使ってみたいが今回は実施しない

## 想定読者
* Tanzuの特長を、実機の挙動を交えて知りたい方
* Tanzuを触ったことがなく、AWS上に構築したい方

## 環境

```
AWS(ec2)のインスタンス
|-bootstrap用インスタンス
  |- ubuntu:Ubuntu Server 20.04 LTS
  |- インスタンスタイプ:t2.xlarge
  |- ボリューム:30GB
  |- docker,kubectlのインストール手順は割愛
|-クラスタ用インスタンス(k8sクラスタデプロイ時に自動で生成)
  |- インスタンスタイプ:m5.large
```

## 構築手順

基本的には[Tanzuの公式ドキュメント](https://tanzucommunityedition.io/docs/latest/getting-started/) を参照して構築しました。

※注意：AWS上に構築する際、Tanzu Community Edition自体はOSSで無償ですが、ec2等の有償オブジェクトは従量課金でコストがかかりますので、あらかじめご承知おきください。

### **クラスタ構築フロー**

* インストーラを起動する
  * Management Clusterを構築する用のUI画面が立ち上がる。
* Management Clusterを構築する
  * Management Clusterと呼ばれる、Workload Clusterを作成・管理する用のクラスタを構築する。
* Workload Clusterを構築する
  * Workload Clusterと呼ばれる、実際にユーザがk8sとして利用する用のクラスタを構築する。

### **インストーラを起動する**

#### **1.Tanzu Community Editionをインストールする**

terminal上で以下コマンドを実行し、Tanzu CommunityEditionのパッケージをインストールします。

```
curl -H "Accept: application/vnd.github.v3.raw" -L https://api.github.com/repos/vmware-tanzu/community-edition/contents/hack/get-tce-release.sh | bash -s v0.9.1 linux
tar xzvf ~/tce-linux-amd64-v0.9.1.tar.gz 
cd tce-linux-amd64-v0.9.1
./install.sh
```

#### **2.dockerイメージを取得する**

terminal上で以下コマンドを実行し、Management Cluster構築用のコンテナイメージを取得します。

```
docker pull kindest/haproxy:v20210715-a6da3463
```

#### **3.(option)AWS CLIをダウンロードする**

もしbootstrap用インスタンスにダウンロードされていない場合は必要となります。

```
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
```

#### **4.AWSのクレデンシャル設定をする**

[AWSのIAMのユーザ画面](https://console.aws.amazon.com/iamv2/home?#/users) にアクセスします。
インスタンス作成権限を持ったユーザ（なければ作成）の詳細画面を表示し、認証情報タブの`アクセスキーの作成`を押下します。
アクセスキーとシークレットが表示されるので、それを控えておきます。
terminalで以下を実行し、認証情報をexportした状態で、profileを作成します。（AWS_REGIONはインスタンスを作成する際のリージョンを選択できます。使用できる任意のリージョンで構いません）

```
export AWS_ACCESS_KEY_ID=aws_access_key
export AWS_SECRET_ACCESS_KEY=aws_access_key_secret
export AWS_REGION=aws_region

aws configure --profile produser
AWS Access Key ID [None]: [アクセスキーを入力]
AWS Secret Access Key [None]: [シークレットを入力]
Default region name [None]: [使用するリージョン名を入力]
Default output format [None]: text
```

#### **5.インスタンス用鍵を作成する**

terminal上で以下のコマンドを実行し、インスタンスに接続する用の鍵を作成します。

```
aws ec2 create-key-pair --key-name default --output json | jq .KeyMaterial -r > default.pem
```

#### **6.インストーラを構築する**

terminal上で以下コマンドを実行し、tanzuインストーラを初期化とインストーラの起動を行います。実行後、`http://localhost:8080/#/ui` でインストーラ用ブラウザが表示されます。

```
tanzu management-cluster create --ui
```

![installer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2420547/948ebe82-4971-45d8-2de4-520044c9d6d0.png)

### **AWS上にManagement Clusterを構築する**

ブラウザ上で、`Amazon EC2`の`DEPLOY`を押下します。

設定項目を記入していきます。各自選択する必要があるパラメータとしては、`インスタンスタイプ`,`REGION`,`コントローラノードを複数台にするかどうか`だと思います。作成したい規模などに応じて入力してください。

参考に、自分が構築した際の記載情報を添付します。

![aws_config1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2420547/53cc7523-2746-b479-065a-0ce063fc4f68.png)
![aws_config2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2420547/2a102333-8932-dc45-8f3f-3d8828e0845f.png)

15分ほどでManagement Clusterが構築されました。

### **Workload Clusterを構築する**

Workload Cluster構築用の設定ファイルを作成します。Management Cluster構築時の設定ファイルが以下のディレクトリに格納されているので、それをcpします。`MGMT-CONFIG-FILE`は、Management Clusterの名前を指定します。

```
cp  ~/.config/tanzu/tkg/clusterconfigs/<MGMT-CONFIG-FILE> ~/.config/tanzu/tkg/clusterconfigs/workload1.yaml
```

cpしたファイルを編集します。`CLUSTER_NAME`の部分はManagement Clusterの名前が入っているので、名前を変更します。Management Cluster構築時の設定画面で入力していた情報(インスタンスタイプなど)が設定ファイルにすでに入力されていますが、もし変更したい場合はその部分も変更します。

```
CLUSTER_NAME: (例)tanzu-workload-test
```

以下コマンドでWorkload Clusterを構築します。

```
tanzu cluster create <WORKLOAD-CLUSTER-NAME> --file ~/.config/tanzu/tkg/clusterconfigs/workload1.yaml
```

15分ほどで構築できました。クラスタが作成されていることを確認します。

```
tanzu cluster list
  NAME                 NAMESPACE  STATUS   CONTROLPLANE  WORKERS  KUBERNETES        ROLES   PLAN  
  tanzu-workload-test  default    running  1/1           1/1      v1.21.2+vmware.1  <none>  dev 
```

Management Clusterが正常に動いていれば、上記のようなtanzuコマンドを打てば何個もクラスタを構築することができます。

### **Workload Clusterの動作確認**

kubectlコンテキストを設定し、構築したクラスタに接続できるようにします。

```
tanzu cluster kubeconfig get <WORKLOAD-CLUSTER-NAME> --admin
kubectl config use-context <WORKLOAD-CLUSTER-NAME>-admin@<WORKLOAD-CLUSTER-NAME>
```

あとは、普通のk8sクラスタ同様の手段で、namespaceの作成やpodの作成などできます。

### **Workload Clusterの削除**

```
tanzu cluster delete <WORKLOAD-CLUSTER>
```

### **Management Clusterの削除**

もしManagement Clusterで実行されているWorkload Clusterが存在する場合は、Management Clusterを削除することはできません。先に上記の`Workload Clusterの削除` を実施してください。

```
tanzu management-cluster delete <MGMT-CLUSTER-NAME>
```

### **その他機能**

以下の機能については、ドキュメントはありますが実機で確認できていない内容になります。実際にk8sを使っていく場合は必要になると思うので、こういった機能がある、という共有のみにとどめます。

* workerノード数を変更する
  * defaultでクラスタを作成した際、workerノードは1台のみ建ちます。tanzuコマンドを使って、規模に応じてノード数を変更できます。
  * [公式ドキュメント](https://tanzucommunityedition.io/docs/latest/scale-mgmt/)
* workerノード数をオートスケーリングする
  * 上記のように手動でスケーリングしても良いですが、規模に応じてworkerノード数を自動で拡縮する機能もあります。
  * [公式ドキュメント](https://tanzucommunityedition.io/docs/latest/scale-cluster/)

## 所感

実は、最初ローカルのPC(windows)上でクラスタ構築を試していましたが、失敗しました。現在windows上からdockerでk8sクラスタを構築するのは非推奨なようで、結局AWS上で建てる方針にしました。そんなこともあり、Management Cluster部分の構築は若干手間取りましたが、その設定が終わった後は、楽にk8sクラスタを構築できた印象です。

### メリット
* (事前準備をしっかりすれば)クラスタ構築は簡単にできました。後述しますが、現在サポートされていない構築方法もありますので、その部分を気をつけて事前準備を行えば、k8sクラスタ構築部分は簡単にできた印象です。
* 検証用としては、他のk8sマネージドサービスに比べて安く使用できるのでは、と思います。費用としてかかるのはAWSの有償オブジェクトのみなので、他の余分なコストはかからないです。

### 困ったところ
* 最近リリースされたばかりのサービスのため仕方ないのですが、windows上からの構築が非推奨であったり、まだサポートがされていない部分もあるので、構築に苦労する部分もある印象でした。

## 今後やりたいこと
* Azule上などにもクラスタ構築を試してみる。
* `Tanzu Mission Control`ですが、無償版の`Tanzu Mission Control Starter`が近日公開予定とのことなので、使用感を確認したいです。(無料で試せるハンズオンラボがあるらしいので、そちらもみてみたい)