최근에 Tanzu와 함께 vSphere 7.0U2a에서 사용할 수 있는 VM Service라는 새로운 기능에 대해 게시했습니다. 간단히 말해서, 개발자는 이 새로운 서비스를 통해 Tanzu Kubernetes Clusters 및 PodVM을 각각의 네임스페이스로 프로비저닝할 수 없습니다. 이제 기본 가상 시스템도 프로비저닝할 수 있습니다. VM 서비스는 개발자에게 VirtualMachineClassBindings라는 새로운 기능을 도입했으며, 기존 기능인 VirtualMachineClass와 관련된 몇 가지 새로운 동작도 도입했습니다.

VirtualMachineClass는 가상 시스템에 사용할 수 있는 리소스 크기를 설명합니다. VM에 할당할 컴퓨팅 및 메모리 양을 설명하고 리소스가 보장(예약)되거나 “최선의 노력(best-effort)”이 보장되는 경우에도 설명합니다. 즉, 시스템에서 리소스 경합이 발생할 경우 이를 보장할 수 없습니다. 개발자가 이용할 수 있는 기존 클래스는 여러 가지가 있지만, 필요에 따라 맞춤형 클래스를 구축할 수 있는 기능도 있습니다. VirtualMachineClass는 Tanzu Kubernetes 제어부 및 작업자 노드의 노드를 구성하는 가상 시스템의 크기를 설명하기 때문에 이전 버전의 vSphere with Tanzu에서 사용할 수 있었습니다.

VirtualMachineClassBindings는 특정 네임스페이스에 할당된 가상 시스템 클래스를 설명하는 새로운 기능입니다. 이전에는 모든 네임스페이스가 모든 가상 시스템 클래스에 액세스할 수 있었습니다. 이제 vSphere 관리자 또는 플랫폼 관리자가 개발자가 생성할 수 있는 가상 시스템의 크기를 제어할 수 있습니다. 가상 시스템 클래스가 네임스페이스에 ‘바운드’된 경우에만 가상 시스템 생성에 사용할 수 있습니다. 여기에는 vSphere with Tanzu에 프로비저닝된 Tanzu Kubernetes 워크로드 클러스터의 제어부 및 작업자 노드를 백업하는 데 사용되는 가상 시스템의 생성이 포함됩니다. 나는 이 글의 뒷부분에서 이 점에 초점을 맞출 것이다. 왜냐하면 그것은 이전에 일이 어떻게 작용했는지에 대한 미묘한 행동 변화이기 때문이다.

먼저 아직 네임스페이스가 생성되지 않은 vSphere with Tanzu 환경에 대해 살펴보겠습니다.

$ kubectl config get-contexts
CURRENT  NAME                                      CLUSTER            AUTHINFO                                        NAMESPACE
*        10.202.112.152                            10.202.112.152    wcp:10.202.112.152:administrator@vsphere.local


$ kubectl get virtualmachineclasses
No resources found


$ kubectl get virtualmachineclasses
No resources found

처음에는 아무 것도 구성되지 않았습니다. 클래스나 바인딩이 없습니다. 이제 “new-namespace”라는 새 네임스페이스를 생성해 보겠습니다. 하지만 아직 이 네임스페이스에 VirtualMachineClass를 추가하지 마십시오.

$ kubectl config get-contexts
CURRENT  NAME                                      CLUSTER            AUTHINFO                                        NAMESPACE
         10.202.112.152                           10.202.112.152    wcp:10.202.112.152:administrator@vsphere.local
*        new-namespace                            10.202.112.152    wcp:10.202.112.152:administrator@vsphere.local    new-namespace


$ kubectl get virtualmachineclasses
No resources found


$ kubectl get virtualmachineclassbindings
No resources found in new-namespace namespace.

할당된 클래스가 없으므로 바인딩도 비어 있습니다. 이제 vSphere Client를 통해 모든 16개의 기존 가상 시스템 클래스를 네임스페이스 “new-namespace”에 할당할 수 있습니다.

이제 CLI의 네임스페이스 컨텍스트에서 16개의 가상 시스템 클래스 바인딩을 볼 수 있습니다. 바인딩이 할당되는 즉시 클래스가 다른 네임스페이스에도 표시됩니다. 이는 곧 다른 네임스페이스를 구축할 때 더욱 분명해질 것입니다.

$ kubectl get virtualmachineclasses
NAME                   CPU   MEMORY   AGE
best-effort-2xlarge     8    64Gi     2m36s
best-effort-4xlarge    16    128Gi    2m30s
best-effort-8xlarge    32    128Gi    2m35s
best-effort-large       4    16Gi      114s
best-effort-medium      2    8Gi      2m15s
best-effort-small       2    4Gi      2m36s
best-effort-xlarge      4    32Gi     2m36s
best-effort-xsmall      2    2Gi      2m36s
guaranteed-2xlarge      8    64Gi     2m36s
guaranteed-4xlarge     16    128Gi    2m33s
guaranteed-8xlarge     32    128Gi    2m25s
guaranteed-large        4    16Gi     2m36s
guaranteed-medium       2    8Gi      2m35s
guaranteed-small        2    4Gi      2m34s
guaranteed-xlarge       4    32Gi       73s


$ kubectl get virtualmachineclassbindings
NAME                  VIRTUALMACHINECLASS   AGE
best-effort-2xlarge   best-effort-2xlarge   2m48s
best-effort-4xlarge   best-effort-4xlarge   96s
best-effort-8xlarge   best-effort-8xlarge   2m58s
best-effort-large     best-effort-large     96s
best-effort-medium    best-effort-medium    96s
best-effort-small     best-effort-small     2m59s
best-effort-xlarge    best-effort-xlarge    2m59s
best-effort-xsmall    best-effort-xsmall    2m38s
guaranteed-2xlarge    guaranteed-2xlarge    2m48s
guaranteed-4xlarge    guaranteed-4xlarge    96s
guaranteed-8xlarge    guaranteed-8xlarge    96s
guaranteed-large      guaranteed-large      2m38s
guaranteed-medium     guaranteed-medium     96s
guaranteed-small      guaranteed-small      2m18s

각 클래스에 대해 kubectl describe을 실행하여 각 클래스에 연결된 CPU 및 메모리 리소스 양을 확인할 수 있습니다.

이제 가상 머신 클래스 바인딩을 도입한 이유가 무엇인지 질문하고 싶으십니까? 두 번째 네임스페이스를 만들 때 차이가 명확해집니다. 새 네임스페이스(cormac-new-ns)에서는 다른 네임스페이스에 할당된 가상 시스템 클래스를 볼 수 있지만, 가상 시스템 클래스 바인딩을 통해 네임스페이스에 특별히 바인딩되어 표시되지 않는 한 이러한 가상 시스템 클래스를 사용할 수 없습니다. 따라서 가상 시스템 클래스가 한 번 이상 바인딩되면 다른 네임스페이스에 표시됩니다. 따라서 아래에서 강조 표시한 것처럼 VirtualMachineClasses는 이미 네임스페이스(new-namespace)에 바인딩되어 있기 때문에 모두 16개의 Virtual MachineClass를 볼 수 있지만 “cormac-new-ns” 네임스페이스 컨텍스트에서는 사용할 수 없습니다.

$ kubectl config get-contexts
CURRENT  NAME                                      CLUSTER            AUTHINFO                                        NAMESPACE
*        10.202.112.152                            10.202.112.152    wcp:10.202.112.152:administrator@vsphere.local
          cormac-new-ns                            10.202.112.152    wcp:10.202.112.152:administrator@vsphere.local  cormac-new-ns
          new-namespace                            10.202.112.152    wcp:10.202.112.152:administrator@vsphere.local  new-namespace


$ kubectl config use-context cormac-new-ns
Switched to context "cormac-new-ns".


$ kubectl get virtualmachineclasses
NAME                  CPU    MEMORY    AGE
best-effort-2xlarge     8     64Gi     6m9s
best-effort-4xlarge    16    128Gi     6m3s
best-effort-8xlarge    32    128Gi     6m8s
best-effort-large       4     16Gi     5m27s
best-effort-medium      2      8Gi     5m48s
best-effort-small       2      4Gi     6m9s
best-effort-xlarge      4     32Gi     6m9s
best-effort-xsmall      2      2Gi     6m9s
guaranteed-2xlarge      8     64Gi     6m9s
guaranteed-4xlarge     16    128Gi     6m6s
guaranteed-8xlarge     32    128Gi     5m58s
guaranteed-large        4     16Gi     6m9s
guaranteed-medium       2      8Gi     6m8s
guaranteed-small        2      4Gi     6m7s
guaranteed-xlarge       4     32Gi     4m46s
guaranteed-xsmall       2      2Gi     3m24s


$ kubectl get virtualmachineclassbindings
No resources found in cormac-new-ns namespace.

그러나 이제 vSphere 클라이언트로 이동하여 이 네임스페이스에 가상 시스템 클래스를 할당하면 바인딩이 표시됩니다.

$ kubectl get virtualmachineclassbindings
NAME              VIRTUALMACHINECLASS   AGE
guaranteed-large  guaranteed-large      10s

Tanzu를 사용하는 vSphere의 Tanzu Kubernetes에 대한 고려 사항

예를 들어 “cormac-new-ns” 네임스페이스에 Tanzu Kubernetes 워크로드 클러스터를 생성하려고 합니다. 이전 버전의 vSphere with Tanzu에서는 Virtual MachineClass 또는 Virtual Machine Bindings에 대해 걱정할 필요가 없었습니다. 저는 단순히 TanzuKubernetes Cluster 매니페스트를 만들어 적용했습니다. 컨텐츠 라이브러리에서 이미지를 사용할 수 있는 한, 저는 기꺼이 갈 수 있었습니다. 여기 그러한 manifest의 예가 있다.

$ cat tkgs-cluster.1.20.2-nobindingvmclass.yaml
apiVersion: run.tanzu.vmware.com/v1alpha1
kind: TanzuKubernetesCluster
metadata:
 name: tkg-cluster-1-20-2
spec:
 topology:
  controlPlane:
    count: 3
    class: guaranteed-medium
    storageClass: vsan-default-storage-policy
  workers:
    count: 5
    class: best-effort-medium
    storageClass: vsan-default-storage-policy
 distribution:
  version: v1.20.2

이 예에서는 spec.topology.controlPlane.class 및 이 네임스페이스에 바인딩되지 않은 spec.topology.workers.class가 사용됩니다. 따라서 VirtualMachineClass 출력에는 나타나지만 VirtualMachineClassBinding 출력에는 나타나지 않습니다. 따라서 이 매니페스트를 적용하여 사용하려고 하면 다음과 같이 클러스터 생성에 실패합니다.

$ kubectl get TanzuKubernetesCluster
NAME                CONTROL PLANE  WORKER   DISTRIBUTION                    AGE    PHASE    TKR COMPATIBLE  UPDATES AVAILABLE
tkg-cluster-1-20-2  3              5        v1.20.2+vmware.1-tkg.2.3e10706  4m10s  failed   True


$ kubectl describe TanzuKubernetesCluster
Name:        tkg-cluster-1-20-2
Namespace:    cormac-new-ns
Labels:      run.tanzu.vmware.com/tkr=v1.20.2---vmware.1-tkg.2.3e10706
Annotations:  <none>
API Version:  run.tanzu.vmware.com/v1alpha1
Kind:        TanzuKubernetesCluster
Metadata:
  Creation Timestamp:  2021-06-15T12:09:13Z
  Finalizers:
    tanzukubernetescluster.run.tanzu.vmware.com
.
.
.
  Conditions:
    Last Transition Time:  2021-06-15T12:09:32Z
    Message:              1 of 2 completed
    Reason:                VirtualMachineClassBindingNotFound @ Machine/tkg-cluster-1-20-2-control-plane-lqwnh
    Severity:              Error
    Status:                False
    Type:                  ControlPlaneReady
    Last Transition Time:  2021-06-15T12:09:26Z
    Message:              0/3 Control Plane Node(s) healthy. 0/5 Worker Node(s) healthy
    Reason:                WaitingForNodesHealthy
    Severity:              Info
    Status:                False
    Type:                  NodesHealthy
    Last Transition Time:  2021-06-14T08:33:41Z
    Status:                True
    Type:                  TanzuKubernetesReleaseCompatible
    Last Transition Time:  2021-06-14T08:33:41Z
    Reason:                NoUpdates
    Status:                False
    Type:                  UpdatesAvailable
  Node Status:
    tkg-cluster-1-20-2-control-plane-lqwnh:            pending
    tkg-cluster-1-20-2-workers-wlppj-778dff98c-2pbrd:  pending
    tkg-cluster-1-20-2-workers-wlppj-778dff98c-4pf87:  pending
    tkg-cluster-1-20-2-workers-wlppj-778dff98c-8pzdb:  pending
    tkg-cluster-1-20-2-workers-wlppj-778dff98c-fzgpz:  pending
    tkg-cluster-1-20-2-workers-wlppj-778dff98c-tzkth:  pending
  Phase:                                              failed
  Vm Status:
    tkg-cluster-1-20-2-control-plane-lqwnh:            pending
    tkg-cluster-1-20-2-workers-wlppj-778dff98c-2pbrd:  pending
    tkg-cluster-1-20-2-workers-wlppj-778dff98c-4pf87:  pending
    tkg-cluster-1-20-2-workers-wlppj-778dff98c-8pzdb:  pending
    tkg-cluster-1-20-2-workers-wlppj-778dff98c-fzgpz:  pending
    tkg-cluster-1-20-2-workers-wlppj-778dff98c-tzkth:  pending
Events:
  Type    Reason        Age        From                                                                                             Message
  ----    ------        ----      ----                                                                                              -------
  Normal  PhaseChanged  <invalid>  vmware-system-tkg/vmware-system-tkg-controller-manager/tanzukubernetescluster-status-controller  cluster changes from creating phase to failed phase

이 매니페스트를 성공적으로 배포하려면 누락된 두 가상 시스템 클래스를 네임스페이스에 바인딩해야 합니다.

이제 바인딩을 쿼리하면 Tanzu Kubernetes Cluster에 필요한 두 바인딩을 볼 수 있습니다.

$ kubectl get virtualmachineclassbindings
NAME                 VIRTUALMACHINECLASS   AGE
best-effort-medium   best-effort-medium    5m30s
guaranteed-large     guaranteed-large      16m
guaranteed-medium    guaranteed-medium     2m31s

모든 것이 잘 진행됩니다. 클러스터를 다시 생성하려고 하면 이제 클러스터가 성공적으로 배포됩니다.

$ kubectl get TanzuKubernetesCluster
NAME                CONTROL PLANE  WORKER   DISTRIBUTION                    AGE  PHASE    TKR COMPATIBLE  UPDATES AVAILABLE
tkg-cluster-1-20-2  3              5        v1.20.2+vmware.1-tkg.2.3e10706  56m  running  True

결론적으로, vSphere with Tanzu(vSphere 7.0U2a)에 VM Service가 도입되면 VirtualMachineClasses를 사용하려면 먼저 네임스페이스에 바인딩해야 합니다. 이는 모든 네임스페이스가 모든 클래스에 액세스했던 이전 버전의 vSphere with Tanzu의 작업 방식과 다릅니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

You May Also Like