Tanzu CLIを使ってvSphere with TanzuのSupervisor Clusterを操作するメモ

vSphere with TanzuのSupervisor ClusterをTanzu CLIから操作してTanzu Kubernetes Cluster (Workload Cluster)を作成するメモ。 ドキュメントはこちら

TanzuKubernetesClusterリソースをYAMLで作成するのが面倒な時にtanzu CLIでクラスタを作成すると便利な場合がある。

Supervisor Clusterへの接続

まずはkubectl vsphere loginコマンドでSupervisor Clusterにログインする。

export SUPERVISOR_IP=192.168.123.3
export KUBECTL_VSPHERE_USERNAME=administrator@vsphere.local
export KUBECTL_VSPHERE_PASSWORD=VMware1!
export TKC_NAMESPACE=ns-tmaki
kubectl vsphere login --server=${SUPERVISOR_IP} --vsphere-username=${KUBECTL_VSPHERE_USERNAME} --insecure-skip-tls-verify --tanzu-kubernetes-cluster-namespace ${TKC_NAMESPACE}
kubectl config use-context ${TKC_NAMESPACE}

次にTanzu CLIで対象のSupervisor Cluster及びNamespaceにログインする。

$ tanzu login --name ${TKC_NAMESPACE} --context ${TKC_NAMESPACE}  --kubeconfig ~/.kube/config
✔  successfully logged in to management cluster using the kubeconfig ns-tmaki

ログインが成功すれば再度tanzu loginコマンドを実行した時に、Supervisor Clusterが選択肢に現れる。

$ tanzu login
? Select a server  [Use arrows to move, type to filter]
> carrot              ()
  ns-tmaki            ()
  + new server
✔  successfully logged in to management cluster using the kubeconfig ns-tmaki

tanzu cluster listコマンドで対象のSupervisor Clusterが管理しているTanzu Kubernetes Cluster一覧が取得できる。

$ tanzu cluster list
  NAME    NAMESPACE  STATUS   CONTROLPLANE  WORKERS  KUBERNETES  ROLES   PLAN       
  cheese  ns-tmaki   running  1/1           3/3      v1.20.2     <none>   

Tanzu Kubernetes Clusterの作成

次にtanzuコマンドでTanzu Kubernetes Clusterを作成する。作成するクラスタのスペックを環境変数かYAMLに定義する。 デフォルト値はYAMLに定義して、必要に応じて環境変数でオーバーライドするのが良いと思う。YAMLのファイルはどこに置いても良い。 ここでは~/.tanzu/tkg/tkc.yamlに次のファイルを用意した。

$ cat ~/.tanzu/tkg/tkc.yaml 
CONTROL_PLANE_STORAGE_CLASS: k8s-storage
WORKER_STORAGE_CLASS: k8s-storage
DEFAULT_STORAGE_CLASS: k8s-storage
STORAGE_CLASSES: k8s-storage
CONTROL_PLANE_VM_CLASS: best-effort-small
WORKER_VM_CLASS: best-effort-medium
NAMESPACE: ns-tmaki
CLUSTER_PLAN: dev

****_STORAGE_CLASSに設定可能な値は次のコマンドで確認できる。

$ kubectl get storageclasses
NAME                          PROVISIONER              RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
k8s-storage                   csi.vsphere.vmware.com   Delete          Immediate           true                   18d
vsan-default-storage-policy   csi.vsphere.vmware.com   Delete          Immediate           true                   18d

****_VM_CLASSに設定可能な値は次のコマンドで確認できる。

$ kubectl get virtualmachineclassbinding
NAME                  VIRTUALMACHINECLASS   AGE
best-effort-2xlarge   best-effort-2xlarge   25h
best-effort-4xlarge   best-effort-4xlarge   25h
best-effort-8xlarge   best-effort-8xlarge   25h
best-effort-large     best-effort-large     25h
best-effort-medium    best-effort-medium    25h
best-effort-small     best-effort-small     25h
best-effort-xlarge    best-effort-xlarge    25h
best-effort-xsmall    best-effort-xsmall    25h
guaranteed-2xlarge    guaranteed-2xlarge    25h
guaranteed-4xlarge    guaranteed-4xlarge    25h
guaranteed-8xlarge    guaranteed-8xlarge    25h
guaranteed-large      guaranteed-large      25h
guaranteed-medium     guaranteed-medium     25h
guaranteed-small      guaranteed-small      25h
guaranteed-xlarge     guaranteed-xlarge     25h
guaranteed-xsmall     guaranteed-xsmall     25h

$ kubectl get virtualmachineclasses
NAME                  CPU   MEMORY   AGE
best-effort-2xlarge   8     64Gi     18d
best-effort-4xlarge   16    128Gi    18d
best-effort-8xlarge   32    128Gi    18d
best-effort-large     4     16Gi     18d
best-effort-medium    2     8Gi      18d
best-effort-small     2     4Gi      18d
best-effort-xlarge    4     32Gi     18d
best-effort-xsmall    2     2Gi      18d
guaranteed-2xlarge    8     64Gi     18d
guaranteed-4xlarge    16    128Gi    18d
guaranteed-8xlarge    32    128Gi    18d
guaranteed-large      4     16Gi     18d
guaranteed-medium     2     8Gi      18d
guaranteed-small      2     4Gi      18d
guaranteed-xlarge     4     32Gi     18d
guaranteed-xsmall     2     2Gi      18d

tanzu cluster createコマンドでクラスタを作成します。まずは--dry-runオプションをつけて設定内容を確認する。結果はYAMLで出力される。

$ tanzu cluster create milk -f ~/.tanzu/tkg/tkc.yaml --tkr v1.20.2---vmware.1-tkg.2.3e10706 --dry-run
apiVersion: run.tanzu.vmware.com/v1alpha1
kind: TanzuKubernetesCluster
metadata:
  annotations:
    tkg/plan: dev
  labels:
    tkg.tanzu.vmware.com/cluster-name: milk
  name: milk
  namespace: ns-tmaki
spec:
  distribution:
    version: 1.20.2+vmware.1-tkg.2.3e10706
  settings:
    network:
      cni:
        name: antrea
      pods:
        cidrBlocks:
        - 100.96.0.0/11
      serviceDomain: cluster.local
      services:
        cidrBlocks:
        - 100.64.0.0/13
    storage:
      classes:
      - k8s-storage
      defaultClass: k8s-storage
  topology:
    controlPlane:
      class: best-effort-small
      count: 1
      storageClass: k8s-storage
    workers:
      class: best-effort-medium
      count: 1
      storageClass: k8s-storage

--tkrに設定可能な値は次のコマンドで確認できる。

$ tanzu kubernetes-release get 
  NAME                               VERSION                         COMPATIBLE  UPGRADEAVAILABLE  
  v1.16.12---vmware.1-tkg.1.da7afe7  1.16.12+vmware.1-tkg.1.da7afe7  True                          
  v1.16.14---vmware.1-tkg.1.ada4837  1.16.14+vmware.1-tkg.1.ada4837  True                          
  v1.16.8---vmware.1-tkg.3.60d2ffd   1.16.8+vmware.1-tkg.3.60d2ffd   False                         
  v1.17.11---vmware.1-tkg.1.15f1e18  1.17.11+vmware.1-tkg.1.15f1e18  True                          
  v1.17.11---vmware.1-tkg.2.ad3d374  1.17.11+vmware.1-tkg.2.ad3d374  True                          
  v1.17.13---vmware.1-tkg.2.2c133ed  1.17.13+vmware.1-tkg.2.2c133ed  True                          
  v1.17.17---vmware.1-tkg.1.d44d45a  1.17.17+vmware.1-tkg.1.d44d45a  True                          
  v1.17.7---vmware.1-tkg.1.154236c   1.17.7+vmware.1-tkg.1.154236c   True                          
  v1.17.8---vmware.1-tkg.1.5417466   1.17.8+vmware.1-tkg.1.5417466   True                          
  v1.18.10---vmware.1-tkg.1.3a6cd48  1.18.10+vmware.1-tkg.1.3a6cd48  True                          
  v1.18.15---vmware.1-tkg.1.600e412  1.18.15+vmware.1-tkg.1.600e412  True                          
  v1.18.15---vmware.1-tkg.2.ebf6117  1.18.15+vmware.1-tkg.2.ebf6117  True                          
  v1.18.5---vmware.1-tkg.1.c40d30d   1.18.5+vmware.1-tkg.1.c40d30d   True                          
  v1.19.7---vmware.1-tkg.1.fc82c41   1.19.7+vmware.1-tkg.1.fc82c41   True                          
  v1.19.7---vmware.1-tkg.2.f52f85a   1.19.7+vmware.1-tkg.2.f52f85a   True                          
  v1.20.2---vmware.1-tkg.1.1d4f79a   1.20.2+vmware.1-tkg.1.1d4f79a   True                          
  v1.20.2---vmware.1-tkg.2.3e10706   1.20.2+vmware.1-tkg.2.3e10706   True  

tanzu cluster create -hには出力されないが、旧tkgコマンドと同様に-cでControlPlane数、-wでWorker数を指定することも可能。

$ tanzu cluster create milk -f ~/.tanzu/tkg/tkc.yaml --tkr v1.20.2---vmware.1-tkg.2.3e10706 --dry-run -c 3 -w 5
apiVersion: run.tanzu.vmware.com/v1alpha1
kind: TanzuKubernetesCluster
metadata:
  annotations:
    tkg/plan: dev
  labels:
    tkg.tanzu.vmware.com/cluster-name: milk
  name: milk
  namespace: ns-tmaki
spec:
  distribution:
    version: 1.20.2+vmware.1-tkg.2.3e10706
  settings:
    network:
      cni:
        name: antrea
      pods:
        cidrBlocks:
        - 100.96.0.0/11
      serviceDomain: cluster.local
      services:
        cidrBlocks:
        - 100.64.0.0/13
    storage:
      classes:
      - k8s-storage
      defaultClass: k8s-storage
  topology:
    controlPlane:
      class: best-effort-small
      count: 3 # ⭐️
      storageClass: k8s-storage
    workers:
      class: best-effort-medium
      count: 5 # ⭐️
      storageClass: k8s-storage

では--dry-runオプションを外して実際にクラスタを作成する。 TanzuKubernetesClusterリソースのYAMLをkubectl applyするのに比べて、クラスタ作成完了までコマンドが待機するのが少し便利。

$ tanzu cluster create milk -f ~/.tanzu/tkg/tkc.yaml --tkr v1.20.2---vmware.1-tkg.2.3e10706 -v 6 -y
Using namespace from config: 
Validating configuration...
Waiting for the Tanzu Kubernetes Cluster service for vSphere workload cluster
cluster is still not provisioned, retrying, retrying
...
cluster is still not provisioned, retrying, retrying

Workload cluster 'milk' created

tanzu cluster listを実行して作成したクラスタを確認する。

 $ tanzu cluster list
  NAME    NAMESPACE STATUS   CONTROLPLANE  WORKERS  KUBERNETES                     ROLES   PLAN  
  cheese  ns-tmaki  running  1/1           3/3      v1.20.2                        <none>        
  milk    ns-tmaki  running  1/1           1/1      1.20.2+vmware.1-tkg.2.3e10706  <none>  

作成したクラスタにkubectlでアクセスするためにkubectl vsphere login--tanzu-kubernetes-cluster-nameオプションにクラスタ名を指定する。

kubectl vsphere login --server=${SUPERVISOR_IP} --vsphere-username=${KUBECTL_VSPHERE_USERNAME} --insecure-skip-tls-verify --tanzu-kubernetes-cluster-namespace ${TKC_NAMESPACE} --tanzu-kubernetes-cluster-name milk

kubectlで対象のクラスタにアクセスできることを確認。

$ kubectl get node -o wide
NAME                                  STATUS   ROLES                  AGE    VERSION            INTERNAL-IP    EXTERNAL-IP   OS-IMAGE                 KERNEL-VERSION       CONTAINER-RUNTIME
milk-control-plane-9txtb              Ready    control-plane,master   135m   v1.20.2+vmware.1   172.21.129.2   <none>        VMware Photon OS/Linux   4.19.174-4.ph3-esx   containerd://1.4.4
milk-workers-cp5x7-68c7ddd554-nkcvw   Ready    <none>                 133m   v1.20.2+vmware.1   172.21.129.3   <none>        VMware Photon OS/Linux   4.19.174-4.ph3-esx   containerd://1.4.4

$ kubectl get pod -A                                     
NAMESPACE                      NAME                                                  READY   STATUS    RESTARTS   AGE
kube-system                    antrea-agent-jrvpv                                    2/2     Running   0          135m
kube-system                    antrea-agent-pqff5                                    2/2     Running   0          135m
kube-system                    antrea-controller-6d498b5b54-cf82v                    1/1     Running   0          135m
kube-system                    antrea-resource-init-5774f96d79-mlmqr                 1/1     Running   0          135m
kube-system                    coredns-785f4496d4-l88gg                              1/1     Running   0          135m
kube-system                    coredns-785f4496d4-ppnd2                              1/1     Running   0          135m
kube-system                    docker-registry-milk-control-plane-9txtb              1/1     Running   0          135m
kube-system                    docker-registry-milk-workers-cp5x7-68c7ddd554-nkcvw   1/1     Running   0          135m
kube-system                    etcd-milk-control-plane-9txtb                         1/1     Running   0          135m
kube-system                    kube-apiserver-milk-control-plane-9txtb               1/1     Running   0          135m
kube-system                    kube-controller-manager-milk-control-plane-9txtb      1/1     Running   0          135m
kube-system                    kube-proxy-45nch                                      1/1     Running   0          135m
kube-system                    kube-proxy-5dwcb                                      1/1     Running   0          135m
kube-system                    kube-scheduler-milk-control-plane-9txtb               1/1     Running   0          135m
vmware-system-auth             guest-cluster-auth-svc-mhb45                          1/1     Running   0          135m
vmware-system-cloud-provider   guest-cluster-cloud-provider-59f66f469c-glx85         1/1     Running   0          135m
vmware-system-csi              vsphere-csi-controller-845866ff86-4nmjq               6/6     Running   0          135m
vmware-system-csi              vsphere-csi-node-l6r5x                                3/3     Running   0          135m
vmware-system-csi              vsphere-csi-node-wdbtp                                3/3     Running   0          135m

--tkrオプションの省略

tanzu create clusterに毎度--tkrオプションを指定するのは面倒なのでYAMLにデフォルトのバージョンを指定したい。 ドキュメントには書かれていないが、~/.tanzu/tkg/providers/infrastructure-tkg-service-vsphere/v1.0.0/ytt/overlay.yamlを見るとKUBERNETES_VERSIONという変数を使用していることがわかるので、この変数をYAMLに設定する。

$ cat ~/.tanzu/tkg/tkc.yaml 
CONTROL_PLANE_STORAGE_CLASS: k8s-storage
WORKER_STORAGE_CLASS: k8s-storage
DEFAULT_STORAGE_CLASS: k8s-storage
STORAGE_CLASSES: k8s-storage
CONTROL_PLANE_VM_CLASS: best-effort-small
WORKER_VM_CLASS: best-effort-medium
NAMESPACE: ns-tmaki
CLUSTER_PLAN: dev
KUBERNETES_VERSION: v1.20

これで--tkrオプションを省略できる。

$ tanzu cluster create yogurt -f ~/.tanzu/tkg/tkc.yaml --dry-run
apiVersion: run.tanzu.vmware.com/v1alpha1
kind: TanzuKubernetesCluster
metadata:
  annotations:
    tkg/plan: dev
  labels:
    tkg.tanzu.vmware.com/cluster-name: yogurt
  name: yogurt
  namespace: ns-tmaki
spec:
  distribution:
    version: v1.20
  settings:
    network:
      cni:
        name: antrea
      pods:
        cidrBlocks:
        - 100.96.0.0/11
      serviceDomain: cluster.local
      services:
        cidrBlocks:
        - 100.64.0.0/13
    storage:
      classes:
      - k8s-storage
      defaultClass: k8s-storage
  topology:
    controlPlane:
      class: best-effort-small
      count: 1
      storageClass: k8s-storage
    workers:
      class: best-effort-medium
      count: 1
      storageClass: k8s-storage

以下同様。

$ tanzu cluster create yogurt -f ~/.tanzu/tkg/tkc.yaml -v 6 -y  
Using namespace from config: 
Validating configuration...
Waiting for the Tanzu Kubernetes Cluster service for vSphere workload cluster
cluster is still not provisioned, retrying, retrying
...
cluster is still not provisioned, retrying, retrying

Workload cluster 'yogurt' created
$ tanzu cluster list
  NAME    NAMESPACE  STATUS   CONTROLPLANE  WORKERS  KUBERNETES                        ROLES   PLAN  
  cheese  ns-tmaki   running  1/1           3/3      v1.20.2                           <none>        
  milk    ns-tmaki   running  1/1           1/1      v1.20.2---vmware.1-tkg.2.3e10706  <none>        
  yogurt  ns-tmaki   running  1/1           1/1      v1.20                             <none>   
kubectl vsphere login --server=${SUPERVISOR_IP} --vsphere-username=${KUBECTL_VSPHERE_USERNAME} --insecure-skip-tls-verify --tanzu-kubernetes-cluster-namespace ${TKC_NAMESPACE} --tanzu-kubernetes-cluster-name yogurt
$ kubectl get node -o wide                                 
NAME                                    STATUS   ROLES                  AGE   VERSION            INTERNAL-IP     EXTERNAL-IP   OS-IMAGE                 KERNEL-VERSION       CONTAINER-RUNTIME
yogurt-control-plane-zl2zz              Ready    control-plane,master   22m   v1.20.2+vmware.1   172.21.129.18   <none>        VMware Photon OS/Linux   4.19.174-4.ph3-esx   containerd://1.4.4
yogurt-workers-7db75-64c8db8bb5-qftmq   Ready    <none>                 20m   v1.20.2+vmware.1   172.21.129.19   <none>        VMware Photon OS/Linux   4.19.174-4.ph3-esx   containerd://1.4.4

Tanzu Kubernetes Clusterのスケールアウト

tanzu cluster scaleでスケールアウト可能。-cでControlPlane数、-wでWorker数を指定。

$ tanzu cluster scale yogurt -w 3 -n ${TKC_NAMESPACE}
Successfully scaled workers for cluster yogurt
Workload cluster 'yogurt' is being scaled

image

Tanzu Kubernetes Clusterの削除

$ tanzu cluster delete milk -n ${TKC_NAMESPACE} -y
Workload cluster 'milk' is being deleted