Tanzu Kubernetes Grid(TKGm) 1.2.1 を Azure にデプロイする

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: LoadBalancerExternalIP になります。







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: LoadBalancerExternalIP になります。





別の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 で作成されるのか確認出来ました。

このブログの人気の投稿