NUCで始めるVMware Tanzu - TKGの準備(Bootstrapマシン)

ではお待ちかねのTKG導入編です！さっそくTKGをやってみましょう！
#踏み台サーバのデプロイ
[Day 12](https://qiita.com/hirosat/items/fbb906ecbfccede2e226)でも少し触れましたが、最初に親ガメ(Bootstrapマシン)が必要です。この環境は、Windows/Mac/Linuxと幅広いOSに対応していて、更にいうとノートPCとかでも全然問題ないのですが、せっかくvSphereを建てたので、踏み台サーバを使って綺麗な状態からインストールを行いたいと思います。

踏み台サーバは、物理NUC側に入れたいと思います。オススメVMはUbuntuです。[公式サイト](https://cloud-images.ubuntu.com/releases/)からOVAが配布されてるので、手軽です。「OVFテンプレートのデプロイ」を選んでみます。
<img width="400" alt="スクリーンショット 2020-12-13 0 02 43" src="https://user-images.githubusercontent.com/3906298/101987293-8e1f0e80-3cd6-11eb-835d-6ce3286726ad.png">
1では、[20.04 LTS 最新のOVAイメージのパス](https://cloud-images.ubuntu.com/releases/focal/release/ubuntu-20.04-server-cloudimg-amd64.ova) を指定します。
<img width="1120" alt="スクリーンショット 2020-12-13 0 06 22" src="https://user-images.githubusercontent.com/3906298/101987372-0f76a100-3cd7-11eb-8060-4bdc92b5b7a7.png">
2では、「bastion01」というサーバ名にして、3では、「192.168.5.13」のリソースを指定しました。
5では、では、リソース節約のため「シンプロビジョニング」にすることを忘れないで下さい。
<img width="1117" alt="スクリーンショット 2020-12-13 0 20 40" src="https://user-images.githubusercontent.com/3906298/101987686-11416400-3cd9-11eb-8bef-47f4fcd9a28f.png">
7では、hostnameをVM名に合わせ、ssh public keyは「~/.ssh/id_rsa.pub」に持っているものを流し込みます。また、Default User's passwordも指定します。
<img width="1116" alt="スクリーンショット 2020-12-13 0 23 48" src="https://user-images.githubusercontent.com/3906298/101987775-7f862680-3cd9-11eb-89f4-73bd99aa9e2c.png">
はい、しばらく待つと出来上がり。続いて、HW設定を行います。
<img width="400" alt="スクリーンショット 2020-12-13 0 28 40" src="https://user-images.githubusercontent.com/3906298/101987949-308cc100-3cda-11eb-92ee-55035afaebcc.png">
CPU:1、「CPUホットアドの有効化」にチェック、「ハードウェアアシストによる〜」にチェック、「メモリホットプラグ」にチェック、ハードディスク30GB、と、変更していきました。
<img width="400" alt="スクリーンショット 2020-12-13 0 35 48" src="https://user-images.githubusercontent.com/3906298/101988129-320ab900-3cdb-11eb-9057-9946503cb31a.png">
おぉ、めちゃサクッと起動しました！細かいインストールプロセスもありません。
初回は、「ubuntu」ユーザと先ほどのステップで指定したパスワードを指定します。続いて、パスワードの変更を求められます。
<img width="1313" alt="スクリーンショット 2020-12-13 0 41 23" src="https://user-images.githubusercontent.com/3906298/101988387-97ab7500-3cdc-11eb-888b-affb404421ad.png">
パスワード変更後は、先ほど設定したssh keyによってローカルPCのターミナルからログイン可能となります。ついでに、IPも固定アドレスにしちゃいましょう。

```shell:踏み台
$ ip a
# 編集対象のインターフェイス名を確認。私の場合は「ens192」だった。
$ sudo vi /etc/netplan/99_config.yaml
# 編集開始。ご自身の環境に合わせて書き換えて下さい
network:
  version: 2
  renderer: networkd
  ethernets:
    ens192:
      dhcp4: false
      dhcp6: false
      addresses: [192.168.5.41/24]
      gateway4: 192.168.5.1
      nameservers:
        addresses: [192.168.5.1, 8.8.8.8, 8.8.4.4]
# 編集ここまで
$ sudo netplan apply
# 設定が反映されると、今までのIPアドレスでは通信できなくなるので、端末が固まる
```
再び端末を立ち上げて、新しいアドレスに接続してみる

```shell:ローカルPC
% ssh ubuntu@192.168.5.41
# ログイン成功！　ここから踏み台
$ ip a
# 念のため、意図通りの設定になったか確認
```

#必要コンポーネントのインストール
まずは[My VMware](https://www.vmware.com/go/get-tkg)に行き、以下の2つをダウンロードします。

- VMware Tanzu Kubernetes Grid CLI for Linux
- kubectl cluster cli v1.19.3 for Linux (←バージョンはその時による)

落としたものを、踏み台に上げておきましょう。

```shell:ローカルPC
$ cd ~/Downloads/
# 自分の環境に合わせてダウンロード先に移動
$ scp kubectl-linux-v1.19.3-vmware.1.gz tkg-linux-amd64-v1.2.1-vmware.1.tar.gz ubuntu@192.168.5.41:~
# 上記のコピー元やコピー先は一例です
```
###TKG CLIのインストール
なお、ここで出てくる「tkg」コマンドは、Cluster APIが持つ「clusterctl」コマンドの拡張です。なので、基本的な使い方やオプションなどは一緒です。また、マニュアルではファイル名を変えて、/usr/local/bin に mv しているが、元のファイル名の情報を残したかったので、ln -s を用いてみました。

```shell:踏み台
$ tar zxvf tkg-linux-amd64-v1.2.1-vmware.1.tar.gz
$ ls tkg
# 出力例。tkg以外にも、Carvel Toolsが同梱されていた。
imgpkg-linux-amd64-v0.2.0+vmware.1  kbld-linux-amd64-v0.24.0+vmware.1  ytt-linux-amd64-v0.30.0+vmware.1
kapp-linux-amd64-v0.33.0+vmware.1   tkg-linux-amd64-v1.2.1+vmware.1

# これら、最初のハイフン前までの名前に変更して、/usr/local/binに設置したいので、ワンライナーで書いてみる
$ for I in `ls -1 tkg`; do NAME=`echo $I | awk -F"-" '{print $1}'`; sudo ln -s ~/tkg/$I /usr/local/bin/$NAME; done
$ ls -l /usr/local/bin/
# 出力例
lrwxrwxrwx 1 root root 51 Dec 13 05:25 imgpkg -> /home/ubuntu/tkg/imgpkg-linux-amd64-v0.2.0+vmware.1
lrwxrwxrwx 1 root root 50 Dec 13 05:25 kapp -> /home/ubuntu/tkg/kapp-linux-amd64-v0.33.0+vmware.1
lrwxrwxrwx 1 root root 50 Dec 13 05:25 kbld -> /home/ubuntu/tkg/kbld-linux-amd64-v0.24.0+vmware.1
lrwxrwxrwx 1 root root 48 Dec 13 05:25 tkg -> /home/ubuntu/tkg/tkg-linux-amd64-v1.2.1+vmware.1
lrwxrwxrwx 1 root root 49 Dec 13 05:25 ytt -> /home/ubuntu/tkg/ytt-linux-amd64-v0.30.0+vmware.1

# 動作確認
$ tkg version
Client:
	Version: v1.2.1
	Git commit: 9d15a485f2ccc462622f8df6a81e5fa831c51895
```

### kubectlのインストール

```shell:踏み台
$ gunzip kubectl-linux-v1.19.3-vmware.1.gz
$ chmod +x kubectl-linux-v1.19.3-vmware.1
# tkgディレクトリに一緒に入れて置いてみる。
$ mv kubectl-linux-v1.19.3-vmware.1 tkg/
$ sudo ln -s ~/tkg/kubectl-linux-v1.19.3-vmware.1 /usr/local/bin/kubectl
$ ls -l /usr/local/bin/kubectl
# 出力例
lrwxrwxrwx 1 root root 47 Dec 13 05:42 /usr/local/bin/kubectl -> /home/ubuntu/tkg/kubectl-linux-v1.19.3-vmware.1

# 動作確認
$ kubectl version --short
Client Version: v1.19.3+vmware.1
The connection to the server localhost:8080 was refused - did you specify the right host or port?
```
kubernetesに接続できないエラーが出ているけど、現時点では何も入ってないので、気にしなくて大丈夫。

### dockerのインストール
[Prerequisites](https://docs.vmware.com/en/VMware-Tanzu-Kubernetes-Grid/1.2/vmware-tanzu-kubernetes-grid-12/GUID-install-tkg.html#-prerequisites-0)に書いてある通り、Dockerも必要です。[Docker公式](https://docs.docker.com/engine/install/ubuntu/)通りにやってみます。

```shell:踏み台
$ sudo apt-get update
# Reading package lists... Done を確認
$ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common
# 途中、続けていいか聞かれるので、「Y」キーを押す。
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# OK を確認
$ sudo apt-key fingerprint 0EBFCD88
# 一つ前で追加したGPG公開鍵が確認できることを確認。以下、出力例
pub   rsa4096 2017-02-22 [SCEA]
      9DC8 5822 9FC7 DD38 854A  E2D8 8D81 803C 0EBF CD88
uid           [ unknown] Docker Release (CE deb) <docker@docker.com>
sub   rsa4096 2017-02-22 [S]

$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
# Reading package lists... Done を確認
$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io
# 途中、続けていいか聞かれるので、「Y」キーを押す。

# 動作確認
$ docker -v
Docker version 20.10.0, build 7287ab3
```

(2020/12/13追記)
dockerの権限が足りなかったので、以下を実行してあげる

```shell
$ docker ps
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/json: dial unix /var/run/docker.sock: connect: permission denied
# こんな感じのエラーが出ていたので、dockerグループにubuntuユーザを追加してあげる
$ sudo gpasswd -a $(whoami) docker
Adding user ubuntu to group docker
# docker.sockをdockerグループにする
$ sudo chgrp docker /var/run/docker.sock
# この後ログインし直したら正常に実行できた
$ docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
```

###TKG CLIの初期化
```shell:踏み台
$ tkg get mc
 MANAGEMENT-CLUSTER-NAME  CONTEXT-NAME  STATUS
```
なお、ここで指定している「mc」とは、「management-cluster」のショートハンドです。毎回フルネームで打つと大変なので、覚えておくと良いでしょう。
ここで、初めてtkgコマンドを打ったことが重要で、初回の動作時に、**~/.tkg** フォルダが生成され、TKGの設定ファイルが格納されます。これらのファイルを編集することで、特定のTKGやkubernetesバージョンのみを利用することが可能となります。

- ~/.tkg/config.yaml：クラスタ設定ファイル
- ~/.tkg/bom/bom-*.yaml：TKCが必要とするパッケージ情報が格納される。

長くなってきたので、本日はここで終わります。お疲れさまでした！