VMware から Tanzu Community Edition(TCE)が提供開始されたので、自宅ラボの vSphere 環境に、Kubernetes クラスタを作成してみます。
2022年10月ごろに TCE 提供が終了となり、非商用であれば TKG が 100 CPU Core まで無料利用できるようになりました。環境構築の様子は下記をどうぞ。
前回(準備編)はこちら。
手順については、下記のあたりが参考になります。
今回の内容です。
それでは、下記のような環境を構築していきます。(前回の再掲)
1. Bootstrap 環境の構築
Bootstrap マシンで、Docker、kubectl、Tanzu CLI などの準備をします。
※この時点では、vSphere の準備は実施ずみの想定です。(前回の投稿 参照)
1-1. OS 環境の準備
今回の Bootstrap マシンは、Photon OS 4.0 を利用します。
OVA ファイルは、下記からダウンロードしたものをデプロイしています。
- 「Photon OS 4.0 Rev1 Binaries」→「OVA with virtual hardware v13 (UEFI Secure Boot)」を利用します。
- ファイル名は photon-ova_uefi-4.0-ca7c9e9330.ova です。
OVA ファイルをデプロイしたら、vCPU を 2、メモリを 8GB(要件は 6GB)に設定変更して起動しています。
root@lab-tceboot-01 [ ~ ]# cat /etc/photon-release VMware Photon OS 4.0 PHOTON_BUILD_NUMBER=1526e30ba
RPM パッケージを更新して、OS を再起動しておきます。
root@lab-tceboot-01 [ ~ ]# tdnf update -y root@lab-tceboot-01 [ ~ ]# reboot
tar 、diffutils をインストールしておきます。diffutils は TCE としては不要ですが、今回の手順でのファイル比較で使用したいのでインストールしておきます。
root@lab-tceboot-01 [ ~ ]# tdnf install -y tar diffutils
あとで Web UI に外部からアクセスするので、今回は iptables を停止してしまいます。(本来ならポート解放・・・)
root@lab-tceboot-01 [ ~ ]# systemctl stop iptables root@lab-tceboot-01 [ ~ ]# systemctl disable iptables
1-2. Docker Engine の準備
Photon OS は OVA をデプロイしたものなので、デフォルトで Docker がインストールされています。
root@lab-tceboot-01 [ ~ ]# rpm -q docker docker-19.03.15-5.ph4.x86_64 root@lab-tceboot-01 [ ~ ]# docker -v Docker version 19.03.15, build 99e3ed8
Docker を起動しておきます。
root@lab-tceboot-01 [ ~ ]# systemctl start docker root@lab-tceboot-01 [ ~ ]# systemctl enable docker
1-3. OS ユーザの準備
OS ユーザ(今回は demo-01)を作成して、docker グループに追加しておきます。
root@lab-tceboot-01 [ ~ ]# useradd -m demo-01 root@lab-tceboot-01 [ ~ ]# usermod -aG docker demo-01 root@lab-tceboot-01 [ ~ ]# passwd demo-01
su で、作成したユーザに切り替えます。
root@lab-tceboot-01 [ ~ ]# su - demo-01 demo-01 [ ~ ]$ id uid=1000(demo-01) gid=100(users) groups=100(users),999(docker)
作成したユーザで、Docker が利用可能であることを確認しておきます。
demo-01 [ ~ ]$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ssh-keygen で、SSH 鍵ペアのファイルを作成しておきます。
demo-01 [ ~ ]$ ssh-keygen -P '' -f ~/.ssh/id_rsa demo-01 [ ~ ]$ ls .ssh/ id_rsa id_rsa.pub
CLI を配置するディレクトリ($HOME/bin)を作成して、PATH 環境変数に追加設定しておきます。
demo-01 [ ~ ]$ mkdir $HOME/bin demo-01 [ ~ ]$ echo 'PATH=$HOME/bin:$PATH' >> $HOME/.bash_profile demo-01 [ ~ ]$ source $HOME/.bash_profile
次のログイン時に、tanzu CLI と kubectl の Bash 補完機能を有効化します。
demo-01 [ ~ ]$ echo 'source <(tanzu completion bash)' >> $HOME/.bash_profile demo-01 [ ~ ]$ echo 'source <(kubectl completion bash)' >> $HOME/.bash_profile
1-4. kubectl のインストール
GitHub から、kubectl をダウンロード、インストールしておきます。kubectl は今回作成する予定の kubernetes バージョン(TCE の OVA の Kubernetes バージョン)にあわせてみました。
demo-01 [ ~ ]$ curl -sL -o $HOME/bin/kubectl https://dl.k8s.io/release/v1.21.2/bin/linux/amd64/kubectl demo-01 [ ~ ]$ chmod +x $HOME/bin/kubectl demo-01 [ ~ ]$ kubectl version --short --client Client Version: v1.21.2
1-5. Tanzu Community Edition のインストール
TCE も、GitHub からダウンロードします。
demo-01 [ ~ ]$ curl -sLO https://github.com/vmware-tanzu/community-edition/releases/download/v0.9.1/tce-linux-amd64-v0.9.1.tar.gz
ファイルを展開します。
demo-01 [ ~ ]$ tar zxvf tce-linux-amd64-v0.9.1.tar.gz tce-linux-amd64-v0.9.1/ tce-linux-amd64-v0.9.1/bin/ tce-linux-amd64-v0.9.1/bin/tanzu tce-linux-amd64-v0.9.1/bin/tanzu-plugin-cluster tce-linux-amd64-v0.9.1/bin/tanzu-plugin-kubernetes-release tce-linux-amd64-v0.9.1/bin/tanzu-plugin-login tce-linux-amd64-v0.9.1/bin/tanzu-plugin-package tce-linux-amd64-v0.9.1/bin/tanzu-plugin-pinniped-auth tce-linux-amd64-v0.9.1/bin/tanzu-plugin-management-cluster tce-linux-amd64-v0.9.1/bin/tanzu-plugin-builder tce-linux-amd64-v0.9.1/bin/tanzu-plugin-standalone-cluster tce-linux-amd64-v0.9.1/bin/tanzu-plugin-conformance tce-linux-amd64-v0.9.1/bin/tanzu-plugin-diagnostics tce-linux-amd64-v0.9.1/install.sh tce-linux-amd64-v0.9.1/uninstall.sh
インストール スクリプトを実行します。
demo-01 [ ~ ]$ cd tce-linux-amd64-v0.9.1/ demo-01 [ ~/tce-linux-amd64-v0.9.1 ]$ ./install.sh
tanzu CLI が実行可能になったことを確認します。
demo-01 [ ~/tce-linux-amd64-v0.9.1 ]$ cd demo-01 [ ~ ]$ which tanzu /home/demo-01/bin/tanzu demo-01 [ ~ ]$ tanzu version version: v0.2.1 buildDate: 2021-09-29 sha: ceaa474
2. Management Cluster の作成
Bootstrap マシンで、tanzu CLI を実行して Management Cluster を作成します。
2-1. Web UI の起動 ~ 設定入力(YAML ファイルの作成)
今回は、TCE(TKG)の Web UI で Management Cluster の設定ファイル(YAML ファイル)を作成しておき、クラスタ作成は Web UI ではなく CLI から実施してみます。
※今後何度か実施する場合には CLI の方が便利なため・・・
Bootstrap マシンで、tanzu management-cluster create を実行して、Web UI を起動します。今回は Bootstrap マシンの外にある Web ブラウザからアクセスするため、「--bind」オプションを指定しています。
demo-01 [ ~ ]$ tanzu management-cluster create --ui --bind=0.0.0.0:8080 --browser=none
Web ブラウザから、Bootstrap マシンの 8080 番ポートにアクセスします。
vCenter への接続情報を入力して、「CONNECT」をクリックします。
「Verify SSL Thumprint」の確認は、「CONTINUE」で進めます。
vCenter インベントリのデータセンタを選択し、事前作成しておいた SSH 公開鍵を入力して「NEXT」をクリックします。ここで入力する SSH 公開鍵は、さきほど ssh-keygen で作成した $HOME/.ssh/id_rsa.pub ファイルの内容です。
Management Cluster の設定値を入力して、「NEXT」で進めます。
- INSTANCE TYPE: Management Cluster の Control Plane VM のスペックを指定(今回は small)
- MANAGEMENT CLUSER NAME: Kubernetes クラスタの名前(tcemgmt)
- CONTROL PLANE ENDPOINT PROVIDER: NSX ALB か kube-vip を選択(kube-vip)
- WORKER NODE INSTANCE TYPE: Management Cluster のWorker Node VM のスペック(small)
- CONTROL PLANE ENDPOINT: kubectl などから Management Cluster に接続するアドレスを入力。kube-vip を選択した場合は、Kubernetes ノードの DHCP ネットワークで、DHCP 範囲外の IP アドレスを指定する。(192.168.11.211)
今回は NSX ALB の設定はスキップして「NEXT」をクリックします。
Metadata のパラメータ入力もスキップして「NEXT」をクリックします。
kubernetes ノードの VM をデプロイする場所(下記)を選択して、「NEXT」をクリックします。
- VM FOLDER: Management Cluster の VM を作成するフォルダ。
- CLUSTER, HOSTS, AND RESOURCE POOLS: 今回はリソース プールを選択。
- DATASTORE
ネットワークの設定を入力します。NETWORK NAME で、DHCP ネットワークのポートグループを選択して、「NEXT」をクリックします。
Identity Management は、今回は無効にしておきます。
OS イメージを選択して、「NEXT」を選択します。前回デプロイした TCE の OVA ファイルをVM テンプレートに変換しておくと、選択可能になっているはずです。
Tanzu Mission Control の設定もスキップして、「NEXT」をクリックします。
「REVIEW CONFIGURATION」をクリックし、設定確認画面に進みます。
「DEPLOY MANAGEMENT CLUSTER」をクリックすると、クラスタ作成が開始されます。しかし、今回は CLI からクラスタを作成してみます。
画面の下方にある「CLI Command Equivalent」には、「DEPLOY MANAGEMENT CLUSTER」をクリックした場合と同様のクラスタ作成をする tanzu CLI コマンドラインが表示されています。
これまでの UI 入力で生成された YAML ファイルは、今回は 8omj7epmp9.yaml でした。
ただし、今回は Web UI でのクラスタ作成(DEPLOY MANAGEMENT CLUSTER)は実行しません。このあと、ファイル名の変更と編集をして、CLI から実行します。
tanzu management-cluster create --file /home/demo-01/.config/tanzu/tkg/clusterconfigs/8omj7epmp9.yaml -v 6
今回は CLI で後続作業を実施するので、Web UI を起動した「tanzu management-cluster create --ui ~」コマンドは、Ctrl + C などで停止しておきます。
2-2. YAML ファイルの編集
Management Cluster の YAML ファイルを、わかりやすくクラスタ名にあわせてコピーしておきます。
demo-01 [ ~ ]$ cp .config/tanzu/tkg/clusterconfigs/8omj7epmp9.yaml .config/tanzu/tkg/clusterconfigs/tcemgmt.yml
vSphere 7 の環境で、スーパーバイザー クラスタを利用しない TKG クラスタを作成するか確認するメッセージをスキップする設定(DEPLOY_TKG_ON_VSPHERE7: true)を追記しておきます。
ただし、この設定がない場合でも、下記のような応答にこたえることで、Management Cluster は作成できます。
Do you want to configure vSphere with Tanzu? [y/N]:
Would you like to deploy a non-integrated Tanzu Kubernetes Grid management cluster on vSphere 7.0? [y/N]:
YAML ファイルの末尾に、DEPLOY_TKG_ON_VSPHERE7 を追記します。
demo-01 [ ~ ]$ echo 'DEPLOY_TKG_ON_VSPHERE7: true' >> .config/tanzu/tkg/clusterconfigs/tcemgmt.yml
2-3. Management Cluster の作成
それでは、tanzu CLI で、Management Cluster を作成します。
demo-01 [ ~ ]$ tanzu management-cluster create --file /home/demo-01/.config/tanzu/tkg/clusterconfigs/tcemgmt.yml -v 6
すこし待つと、Docker コンテナとして Bootstrap Cluster が作成されます。
しばらく待つと、処理が完了します。
そして、Management Cluster が作成されます。
Management Cluster は、「tanzu management-cluster get」コマンドで確認できます。
kubectl でも、Management Cluster が操作できます。
vSphere Client でも、Kubernetes ノードの VM が作成されたことが確認できます。
Management Cluster が作成されると、Bootstrap Cluster は自動的に削除されます。
demo-01 [ ~ ]$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES demo-01 [ ~ ]$
3. Workload Cluster の作成
Bootstrap マシンで、tanzu CLI を実行して Workload Cluster を作成します。Workload Cluster は Management Cluster を利用して作成されるので、Bootstrap Cluster は作成されません。
3-1. YAML ファイルの作成
Management Cluster の YAML ファイルから、Workload Cluster の設定を記載したファイルを作成します。
demo-01 [ ~ ]$ cp .config/tanzu/tkg/clusterconfigs/tcemgmt.yml .config/tanzu/tkg/clusterconfigs/wlc-01.yml demo-01 [ ~ ]$ vi .config/tanzu/tkg/clusterconfigs/wlc-01.yml
今回は、3か所だけ設定変更しています。
- CLUSTER_NAME: Kubernetes クラスタの名前。(今回は wlc-01)
- VSPHERE_CONTROL_PLANE_ENDPOINT: kubectl などから Workload Cluster に接続するアドレスを入力。kube-vip を選択した場合は、Kubernetes ノードの DHCP ネットワークで、DHCP 範囲外の IP アドレスを指定する。(192.168.11.212)
- VSPHERE_FOLDER: VM フォルダ。(わかりやすくするため、Management Cluster の VM とはフォルダを分けた)
demo-01 [ ~ ]$ diff .config/tanzu/tkg/clusterconfigs/tcemgmt.yml .config/tanzu/tkg/clusterconfigs/wlc-01.yml 15c15 < CLUSTER_NAME: tcemgmt --- > CLUSTER_NAME: wlc-01 48c48 < VSPHERE_CONTROL_PLANE_ENDPOINT: 192.168.11.211 --- > VSPHERE_CONTROL_PLANE_ENDPOINT: 192.168.11.212 53c53 < VSPHERE_FOLDER: /infra-dc-01/vm/03-Lab/lab-k8s/k8s_lab-tkg-01_demo-01/vm_tcemgmt --- > VSPHERE_FOLDER: /infra-dc-01/vm/03-Lab/lab-k8s/k8s_lab-tkg-01_demo-01/vm_wlc-01
3-2. Workload Cluster の作成
tanzu CLI で、Workload Cluster を作成します。
Management Cluster とは異なり、「tanzu cluster create」コマンドを実行します。
demo-01 [ ~ ]$ tanzu cluster create -f .config/tanzu/tkg/clusterconfigs/wlc-01.yml
少し待つと、Workload Cluster が作成されます。
Workload Cluster は、「tanzu cluster list」コマンドで確認できます。
demo-01 [ ~ ]$ tanzu cluster list NAME NAMESPACE STATUS CONTROLPLANE WORKERS KUBERNETES ROLES PLAN wlc-01 default running 1/1 1/1 v1.21.2+vmware.1dev
Kubernetes クラスタに接続するための kubeconfig は、「tanzu cluster kubeconfig get ~」コマンドで取得できます。デフォルトでは、Workload Cluster のコンテキストが $HOME/.kube/config に保存されます。
demo-01 [ ~ ]$ tanzu cluster kubeconfig get wlc-01 --admin Credentials of cluster 'wlc-01' have been saved You can now access the cluster by running 'kubectl config use-context wlc-01-admin@wlc-01'
kubeconfig の保存先は、「--export-file」オプションで変更することもできます。
取得した kubeconfig で、Workload Cluster が利用できます。
これで Pod 起動などができるようになりました。ただし、今回は NSX ALB(ロードバランサ)を用意していないので、このままでは LoadBalancer サービスは利用できません。
vSphere Client で、Workload Cluster の Kubernetes ノードが VM として作成されたことがわかります。
参考: デフォルトで起動されている Pod の様子
kubctl を利用して、Management Cluster と Workload Cluster で起動された Pod を見ておきます。
まず、kubectl から Kubernetes クラスタに接続するための kubeconfig ファイルは、それぞれ下記のようになっているようです。
- Management Cluster の kubeconfig は、自動的に $HOME/.kube/config に保存される。
- Workload Cluster の kubeconfig は、「tanzu cluster kubeconfig get」を実行すると $HOME/.kube/config に保存される。「--export-file」で保存するファイルを変更可能。
一方で、tanzu CLI での Management Cluster へのアクセスでは、$HOME/.kube-tkg/config を見ているようです。そのため、kubectl でコンテキストを切り替えても tanzu CLI には影響しないようです。ちなみに、Management Cluster を複数作成した場合は、接続先を「tanzu login」コマンドで切り替えられます。
Management Cluster での Pod 起動の様子です。
Workload Cluster での Pod 起動の様子です。
以上、TCE で Kubernetes クラスタを作成してみる話でした。
補足情報はこちら。