최근에 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의 작업 방식과 다릅니다.