MachineHealthCheck の記事でも記載したTanzu Kubernetes Grid(TKG) ですが、Azure 環境上にCLI ベースでインストールしたので、それを記載していきます。
環境
- Tanzu Kubernetes Grid v1.2.1
- Azure
手順
Management Cluster 導入準備
まず、tkg
CLI をインストールし、後ほどの手順でaz
CLI も利用するので、それらをインストールしておきます。
$ tkg version
Client:
Version: v1.2.1
Git commit: 9d15a485f2ccc462622f8df6a81e5fa831c51895
$ az account show
続いて、TKG on Azure デプロイ時に必要な環境変数をセットしていきます。
$ export AZURE_APP_NAME="tkg"
$ export AZURE_SUBSCRIPTION_ID=$(az account show --query id --output tsv)
$ export RETURNED_SP_APP_JSON=$(az ad sp create-for-rbac --name $AZURE_APP_NAME)
$ export AZURE_CLIENT_ID=$(echo "$RETURNED_SP_APP_JSON" | jq -r '.appId')
$ export AZURE_CLIENT_SECRET=$(echo "$RETURNED_SP_APP_JSON" | jq -r '.password')
$ export AZURE_TENANT_ID=$(echo "$RETURNED_SP_APP_JSON" | jq -r '.tenant')
TKG をデプロイするAzure のリージョンを指定します。
$ export AZURE_LOCATION="japaneast"
$ export AZURE_ENVIRONMENT="AzurePublicCloud"
Management Cluster 名も環境変数に設定しておきます。ここで指定した名前がAzure のリソースグループ名として利用されます。
$ export MANAGEMENT_CLUSTER_NAME="schecter-azure"
この記事では実際に、Azure 上に展開したTKG の各インスタンスにログインする事はしませんが、各インスタンスに登録するssh 鍵も作成します。ssh鍵の名前や保存場所は環境に応じて、変更します。
$ ssh-keygen -t rsa -b 4096 -C "xxx@xxxx.xxxx"
$ export AZURE_SSH_PUBLIC_KEY_B64=$(base64 < ~/.ssh/azure-tkg_id_rsa.pub |tr -d '\\r\\n')
Azure 上での利用に際して、こちらのステップが必要になるので、実施しておきます。
$ az vm image terms accept --publisher vmware-inc --offer tkg-capi --plan k8s-1dot19dot3-ubuntu-1804
Management Cluster のデプロイ
ここからtkg
CLI を用いて、Management Cluster をデプロイします
$ tkg get mc
MANAGEMENT-CLUSTER-NAME CONTEXT-NAME STATUS
$ tkg init --infrastructure=azure --name="$MANAGEMENT_CLUSTER_NAME" --plan=dev -v 6
...(SNIP)...
Installing providers on bootstrapper...
Installing the clusterctl inventory CRD
Creating CustomResourceDefinition="providers.clusterctl.cluster.x-k8s.io"
Fetching providers
Fetching File="core-components.yaml" Provider="cluster-api" Version="v0.3.11"
Fetching File="bootstrap-components.yaml" Provider="bootstrap-kubeadm" Version="v0.3.11"
Fetching File="control-plane-components.yaml" Provider="control-plane-kubeadm" Version="v0.3.11"
Fetching File="infrastructure-components.yaml" Provider="infrastructure-azure" Version="v0.4.8"
Fetching File="metadata.yaml" Provider="cluster-api" Version="v0.3.11"
Fetching File="metadata.yaml" Provider="bootstrap-kubeadm" Version="v0.3.11"
Fetching File="metadata.yaml" Provider="control-plane-kubeadm" Version="v0.3.11"
Fetching File="metadata.yaml" Provider="infrastructure-azure" Version="v0.4.8"
Creating Namespace="cert-manager-test"
Installing cert-manager Version="v0.16.1"
Creating Namespace="cert-manager"
Creating CustomResourceDefinition="certificaterequests.cert-manager.io"
Creating CustomResourceDefinition="certificates.cert-manager.io"
Creating CustomResourceDefinition="challenges.acme.cert-manager.io"
Creating CustomResourceDefinition="clusterissuers.cert-manager.io"
Creating CustomResourceDefinition="issuers.cert-manager.io"
Creating CustomResourceDefinition="orders.acme.cert-manager.io"
Creating ServiceAccount="cert-manager-cainjector" Namespace="cert-manager"
Creating ServiceAccount="cert-manager" Namespace="cert-manager"
Creating ServiceAccount="cert-manager-webhook" Namespace="cert-manager"
Creating ClusterRole="cert-manager-cainjector"
Creating ClusterRole="cert-manager-controller-issuers"
Creating ClusterRole="cert-manager-controller-clusterissuers"
Creating ClusterRole="cert-manager-controller-certificates"
Creating ClusterRole="cert-manager-controller-orders"
Creating ClusterRole="cert-manager-controller-challenges"
Creating ClusterRole="cert-manager-controller-ingress-shim"
Creating ClusterRole="cert-manager-view"
Creating ClusterRole="cert-manager-edit"
Creating ClusterRoleBinding="cert-manager-cainjector"
Creating ClusterRoleBinding="cert-manager-controller-issuers"
Creating ClusterRoleBinding="cert-manager-controller-clusterissuers"
Creating ClusterRoleBinding="cert-manager-controller-certificates"
Creating ClusterRoleBinding="cert-manager-controller-orders"
Creating ClusterRoleBinding="cert-manager-controller-challenges"
Creating ClusterRoleBinding="cert-manager-controller-ingress-shim"
Creating Role="cert-manager-cainjector:leaderelection" Namespace="kube-system"
Creating Role="cert-manager:leaderelection" Namespace="kube-system"
Creating Role="cert-manager-webhook:dynamic-serving" Namespace="cert-manager"
Creating RoleBinding="cert-manager-cainjector:leaderelection" Namespace="kube-system"
Creating RoleBinding="cert-manager:leaderelection" Namespace="kube-system"
Creating RoleBinding="cert-manager-webhook:dynamic-serving" Namespace="cert-manager"
Creating Service="cert-manager" Namespace="cert-manager"
Creating Service="cert-manager-webhook" Namespace="cert-manager"
Creating Deployment="cert-manager-cainjector" Namespace="cert-manager"
Creating Deployment="cert-manager" Namespace="cert-manager"
Creating Deployment="cert-manager-webhook" Namespace="cert-manager"
Creating MutatingWebhookConfiguration="cert-manager-webhook"
Creating ValidatingWebhookConfiguration="cert-manager-webhook"
Waiting for cert-manager to be available...
Updating Namespace="cert-manager-test"
Creating Issuer="test-selfsigned" Namespace="cert-manager-test"
...(SNIP)...
Set Cluster.Spec.Paused Paused=false Cluster="schecter-azure" Namespace="tkg-system"
Context set for management cluster schecter-azure as 'schecter-azure-admin@schecter-azure'.
Deleting kind cluster: tkg-kind-c0vg7rq3k1k31md7gkrg
Management cluster created!
You can now create your first workload cluster by running the following:
tkg create cluster [name] --kubernetes-version=[version] --plan=[plan]
*tkg --init --ui
を用いて、GUI ベースでインストールしていく際に、Management Cluster のデプロイ 6/8 ぐらいの進捗で処理が進まずに、デプロイが失敗する可能性があります(実際、自分はこれにハマりました、、、)。
その際は、Azure 上にデプロイされた、Management Cluster 用のリソースグループの削除($ tkg delete mc <management-cluster-name>
でリソースグループ含め削除されます)し、更に ~/.tkg
ディレクトリをマルっと削除した上で、↑の手順を実施してみてください。
Workload Cluster のデプロイ
2つのWorkload Cluster をデプロイしてみます。
$ tkg create cluster prs01 --plan=dev
$ tkg create cluster prs02 --plan=dev
$ tkg get clusters --include-management-cluster
NAME NAMESPACE STATUS CONTROLPLANE WORKERS KUBERNETES ROLES
prs01 default running 1/1 1/1 v1.19.3+vmware.1 <none>
prs02 default running 1/1 1/1 v1.19.3+vmware.1 <none>
schecter-azure tkg-system running 1/1 1/1 v1.19.3+vmware.1 management
それぞれ指定した workload-cluster-name
でリソースグループがされ、その中で各リソースがデプロイされます。
Workload Cluster 内でワークロード&サービスリソースのデプロイ
デプロイしたWorkload Cluster 内でDeployment と type:LoadBalancer
サービスをデプロイし、Azure 上でどの様にリソースが作成されるか見ていきたいと思います。
1つ目の prs01
クラスタでデプロイしていきます。
$ tkg get credentials prs01
$ kubectl config use-context prs01-admin@prs01
Switched to context "prs01-admin@prs01".
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
prs01-control-plane-d62th Ready master 32m v1.19.3+vmware.1
prs01-md-0-mkrdp Ready <none> 29m v1.19.3+vmware.1
$ kubectl apply -f https://k8s.io/examples/service/load-balancer-example.yaml
deployment.apps/hello-world created
$ kubectl expose deployment hello-world --type=LoadBalancer --name=prs-service
$ kubectl get all
NAME READY STATUS RESTARTS AGE
pod/hello-world-6df5659cb7-22fdg 1/1 Running 0 2m7s
pod/hello-world-6df5659cb7-2zl9z 1/1 Running 0 2m7s
pod/hello-world-6df5659cb7-4p5dr 1/1 Running 0 2m7s
pod/hello-world-6df5659cb7-s64jx 1/1 Running 0 2m7s
pod/hello-world-6df5659cb7-xbb56 1/1 Running 0 2m7s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 100.64.0.1 <none> 443/TCP 44m
service/prs-service LoadBalancer 100.67.129.147 ***.***.***.*** 8080:30665/TCP 30s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/hello-world 5/5 5 5 2m7s
NAME DESIRED CURRENT READY AGE
replicaset.apps/hello-world-6df5659cb7 5 5 5 2m7s
$ curl http://***.***.***.***:8080
Hello Kubernetes!%
ロードバランサに関しては、クラスタ名 prs01
と同じロードバランサ名の配下にグローバルIP がアサインされ、それがtype: LoadBalancer
のExternalIP
になります。
2つ目の prs02
でも同じ様にデプロイしていきます。type:LoadBalancer
のサービス名は、prs01
と同じ名前でデプロイしています。
$ tkg get credentials prs02
$ kubectl config use-context prs02-admin@prs02
Switched to context "prs02-admin@prs02".
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
prs02-control-plane-l4gqj Ready master 38m v1.19.3+vmware.1
prs02-md-0-p2zvp Ready <none> 36m v1.19.3+vmware.1
$ kubectl apply -f https://k8s.io/examples/service/load-balancer-example.yaml
deployment.apps/hello-world created
$ kubectl expose deployment hello-world --type=LoadBalancer --name=prs-service
$ kubectl get all
NAME READY STATUS RESTARTS AGE
pod/hello-world-6df5659cb7-b7jvh 1/1 Running 0 3m55s
pod/hello-world-6df5659cb7-bwdpz 1/1 Running 0 3m55s
pod/hello-world-6df5659cb7-kxjnq 1/1 Running 0 3m55s
pod/hello-world-6df5659cb7-vwcgl 1/1 Running 0 3m55s
pod/hello-world-6df5659cb7-wjhwf 1/1 Running 0 3m55s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 100.64.0.1 <none> 443/TCP 43m
service/prs-service LoadBalancer 100.68.0.130 20.78.28.21 8080:31564/TCP 92s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/hello-world 5/5 5 5 3m55s
NAME DESIRED CURRENT READY AGE
replicaset.apps/hello-world-6df5659cb7 5 5 5 3m56s
$ curl http://***.***.***.***:8080
Hello Kubernetes!%
prs01
と同様に、クラスタ名 prs02
と同じロードバランサ名の配下にグローバルIP がアサインされ、それがtype: LoadBalancer
のExternalIP
になります。
別のtype: LoadBalancer
を作成した際は、同じロードバランサ名の配下に別の名前のフロントエンドIP が作成され、それにアサインされたグローバルIP をExternalIP
として利用します。
また、Management Cluster に関しても同様に、Management Cluster 名と同じロードバランサが払い出され、それを利用しています。
Workload Cluster, Management Cluster の削除
Cluster を消していきます。
$ tkg delete cluster prs01
$ tkg delete cluster prs02
$ tkg delete mc schecter-azure
まとめ
TKG をAzure 上にデプロイし、TKG上にデプロイしたリソースがどの様にAzure で作成されるのか確認出来ました。