DevOps 엔지니어는 kubectl 명령을 사용하여 사용 가능한 VM 리소스를 검토하고 감독자의 네임스페이스에 독립형 Linux 또는 Windows VM을 프로비저닝합니다. VM에 vGPU용으로 구성된 PCI 디바이스가 포함된 경우 vSphere IaaS control plane 환경에서 VM을 생성하고 부팅한 후에 NVIDIA vGPU 그래픽 드라이버를 설치하여 GPU 작업이 사용되도록 설정할 수 있습니다.

사전 요구 사항

vSphere IaaS control plane에서 독립형 VM을 배포하려면 DevOps 엔지니어에게 특정 VM 리소스에 대한 액세스 권한이 있어야 합니다. vSphere 관리자가 VM 리소스를 사용할 수 있도록 다음 단계를 수행했는지 확인합니다.
  • 네임스페이스를 생성하고 여기에 스토리지 정책을 할당합니다. 감독자에서 vSphere 네임스페이스 생성 및 구성의 내용을 참조하십시오.
  • 컨텐츠 라이브러리를 생성하고 이를 네임스페이스와 연결합니다. vSphere IaaS control plane에서 독립형 VM에 대한 컨텐츠 라이브러리 생성 및 관리의 내용을 참조하십시오.
    • 컨텐츠 라이브러리가 보안 정책에 의해 보호되는 경우 모든 라이브러리 항목은 해당 정책을 준수해야 합니다. 보호된 라이브러리에 준수 및 비준수 항목이 혼합되어 있는 경우 kubectl get virtualmachineimages 명령이 DevOps 엔지니어에게 VM 이미지를 표시하지 못합니다.
    • vGPU 디바이스를 사용하여 VM을 배포하려는 경우 CentOS와 같이 부팅 모드가 EFI로 설정된 이미지에 액세스할 수 있어야 합니다.
  • 기본 또는 사용자 지정 클래스를 네임스페이스와 연결했습니다. vSphere IaaS control plane의 VM 클래스 작업의 내용을 참조하십시오.

VM에 NVIDIA vGPU 또는 기타 PCI 디바이스를 사용하려는 경우 추가 요구 사항을 따라야 합니다. 자세한 내용은 vSphere IaaS control plane에 PCI 디바이스가 있는 VM 배포 항목을 참조하십시오.

VM Operator 및 지원되는 필드에 대한 자세한 내용은 VM 서비스의 개념https://vm-operator.readthedocs.io/en/stable/ref/api/v1alpha2/ 항목을 참조하십시오.

vSphere IaaS control plane의 네임스페이스에서 사용 가능한 VM 리소스 보기

DevOps 엔지니어는 사용자가 네임스페이스의 VM 리소스에 액세스하고 환경에서 사용할 수 있는 VM 클래스 및 VM 템플릿을 볼 수 있는지 확인합니다. VM을 셀프 서비스하는 데 필요할 수 있는 스토리지 클래스 및 기타 항목을 나열할 수도 있습니다.

이 작업에서는 독립형 VM 배포에 사용 가능한 리소스에 액세스하는 데 사용하는 명령을 설명합니다. Tanzu Kubernetes Grid 클러스터 및 클러스터를 구성하는 VM을 배포하는 데 필요한 리소스에 대한 자세한 내용은 " vSphere IaaS 제어부에서 TKG 서비스 사용" 설명서의 TKG 클러스터에 대한 가상 시스템 클래스를 참조하십시오.

프로시저

  1. Kubernetes 환경의 네임스페이스에 액세스합니다.
  2. 네임스페이스에서 사용 가능한 VM 클래스를 보려면 다음 명령을 실행합니다.
    kubectl get virtualmachineclass
    다음 출력을 볼 수 있습니다.
    참고: 사용 시도 VM 클래스 유형을 사용하면 리소스가 오버 커밋될 수 있으므로 VM을 프로비저닝하는 네임스페이스에 대한 제한을 설정한 경우 리소스가 부족해질 수 있습니다. 따라서 운영 환경에서는 보장됨 VM 클래스 유형을 사용하십시오.
    NAME                       VIRTUALMACHINECLASS        AGE
    
    best-effort-large          best-effort-large          44m
    best-effort-medium         best-effort-medium         44m
    best-effort-small          best-effort-small          44m
    best-effort-xsmall         best-effort-xsmall         44m
    custom                     custom                     44m
  3. 특정 VM 클래스에 대한 세부 정보를 보려면 다음 명령을 실행합니다.
    • kubectl describe virtualmachineclasses name_vm_class

      VM 클래스에 vGPU 디바이스가 포함된 경우 spec: hardware: devices: vgpuDevices에서 해당 프로파일을 볼 수 있습니다.

      ......
      spec:
        hardware:
          cpus: 4
          devices:
            vgpuDevices:
            - profileName: grid_v100-q4
      ......
      
    • kubectl get virtualmachineclasses -o wide

      VM 클래스에 vGPU 또는 패스스루 디바이스가 포함된 경우 이러한 디바이스는 출력의 VGPUDevicesProfileNames 또는 PassthroughDeviceIDs 열에 표시됩니다.

  4. VM 이미지를 봅니다.
    kubectl get virtualmachineimages​
    표시되는 출력은 다음과 유사합니다. vmi-xxxxxxxxxxxxx 같은 이미지 이름은 시스템에서 자동으로 생성됩니다.
    NAME                                              VERSION  OSTYPE                FORMAT  IMAGESUPPORTED  AGE
    vmi-xxxxxxxxxxxxx                                          centos8_64Guest       ovf     true            4d3h
  5. 특정 이미지를 설명하려면 다음 명령을 사용합니다.
    kubectl describe virtualmachineimage vmi-xxxxxxxxxxxxx

    vGPU 디바이스가 있는 VM에는 부팅 모드가 EFI로 설정된 이미지(예: CentOS)가 필요합니다. 이러한 이미지에 액세스할 수 있는지 확인합니다.

  6. 스토리지 클래스에 액세스할 수 있는지 확인합니다.
    kubectl get resourcequotas
    자세한 내용은 vSphere 네임스페이스에서 스토리지 클래스 표시의 내용을 참조하십시오.
    NAME                        AGE   REQUEST                                                                                         LIMIT
    my-ns-ubuntu-storagequota   24h   wcpglobal-storage-profile.storageclass.storage.k8s.io/requests.storage: 0/9223372036854775807

vSphere IaaS control plane에서 가상 시스템 배포

DevOps 엔지니어는 Kubernetes YAML 파일에 VM 배포 규격을 작성하여 선언적 방식으로 VM 및 해당 게스트 운영 체제를 프로비저닝할 수 있습니다.

사전 요구 사항

VM용 NVIDIA vGPU 또는 기타 PCI 디바이스를 사용하는 경우 vSphere IaaS control plane에 PCI 디바이스가 있는 VM 배포 항목을 참조하십시오.

프로시저

  1. VM YAML 파일을 준비합니다.
    파일에서 다음 매개 변수를 지정합니다.
    옵션 설명
    apiVersion VM 서비스 API의 버전을 지정합니다. 예: vmoperator.vmware.com/v1alpha2.
    kind 생성할 Kubernetes 리소스의 유형을 지정합니다. 사용 가능한 유일한 값은 VirtualMachine입니다.
    spec.imageName Kubernetes 클러스터에서 가상 시스템 이미지 리소스 이름을 지정합니다.
    spec.storageClass​ 영구 볼륨의 스토리지에 사용할 스토리지 클래스를 지정합니다.
    spec.className 사용할 가상 하드웨어 설정을 설명하는 VM 클래스의 이름을 지정합니다.
    spec.networkInterfaces VM에 대한 네트워크 관련 설정을 지정합니다.
    • networkType. 이 키의 값은 nsx-t 또는 vsphere-distributed일 수 있습니다.
    • networkName. 필요한 경우 이름을 지정하거나 기본 이름을 그대로 둡니다.
    spec.vmMetadata VM에 전달할 추가 메타데이터를 포함합니다. 이 키를 사용하여 게스트 운영 체제 이미지를 사용자 지정하고 VM의 hostnameuser-data(암호, ssh 키 포함) 등의 항목을 설정할 수 있습니다.

    Microsoft 시스템 준비 도구(Sysprep)를 사용하여 Windows VM을 부트스트랩하고 사용자 지정하는 방법에 대한 세부 정보를 포함한 자세한 내용은 게스트 사용자 지정을 참조하십시오.

    topology.kubernetes.io/zone 3개 영역 감독자에서 VM 배치를 제어합니다. 예: topology.kubernetes.io/zone: zone-a02
    다음 예제 VM YAML 파일 my-vm은 CloudInit를 부트스트랩 방법으로 사용합니다. 이 예에서는 비밀 리소스 my-vm-bootstrap-data에서 사용자 데이터를 지정하는 VirtualMachine 리소스를 보여줍니다. 비밀은 게스트 운영 체제를 부트스트랩하고 사용자 지정하는 데 사용됩니다.

    암호의 데이터에는 CloudInit cloud-config가 포함됩니다. cloud-config 형식에 대한 자세한 내용은 Cloud config 예시 공식 설명서를 참조하십시오.

    Sysprep을 부트스트랩 방법으로 사용하는 예시는 Sysprep을 참조하십시오.
    apiVersion: vmoperator.vmware.com/v1alpha2
    kind: VirtualMachine
    metadata:
      name:      my-vm
      namespace: my-namespace
    spec:
      className:    small
      imageName:    vmi-xxxxxxxxxxxxx
      storageClass: iscsi
      vmMetadata:
        transport: CloudInit
        secretName: my-vm-bootstrap-data
    
    apiVersion: v1
    kind: Secret
    metadata:
      name:      my-vm-bootstrap-data
      namespace: my-namespace
    stringData:
      user-data: |
        #cloud-config
        users:
        - default
        - name: xyz..
          primary_group: xyz..
          groups: users
          ssh_authorized_keys:
          - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDSL7uWGj...
        runcmd:
        - "ls /"
        - [ "ls", "-a", "-l", "/" ]
        write_files:
        - path: /etc/my-plaintext
          permissions: '0644'
          owner: root:root
          content: |
            Hello, world.

    영역이 있는 환경에 VM을 배포하는 경우 다음 예를 사용합니다.

    ZONE_NAME의 값을 구하려면 kubectl get vspherezones 명령을 실행합니다.

    apiVersion: vmoperator.vmware.com/v1alpha2
    kind: VirtualMachine
    metadata:
      name: <vm-name>
      namespace: <vm-ns>
      labels:
        topology.kubernetes.io/zone: ZONE_NAME
    ...
  2. VM을 배포합니다.
    kubectl apply -f my-vm.yaml
  3. VM이 생성되었는지 확인합니다.
    kubectl get vm
    NAME              AGE
    my-vm             28s
  4. VM 세부 정보 및 해당 상태를 확인합니다.
    kubectl describe virtualmachine my-vm

    출력은 다음과 유사합니다. 출력에서 VM의 IP 주소를 얻을 수도 있으며, 이 주소는 Vm Ip 필드에 표시됩니다.

    Name:         my-vm
    Namespace:    my-namespace
    API Version:  vmoperator.vmware.com/v1alpha2
    Kind:         VirtualMachine
    Metadata:
      Creation Timestamp:  2021-03-23T19:07:36Z
      Finalizers:
        virtualmachine.vmoperator.vmware.com
      Generation:  1
      Managed Fields:
     ...  
     ... 
    Status:
      Bios UUID:              4218ec42-aeb3-9491-fe22-19b6f954ce38
      Change Block Tracking:  false
      Conditions:
        Last Transition Time:  2021-03-23T19:08:59Z
        Status:                True
        Type:                  VirtualMachinePrereqReady
      Host:                    10.185.240.10
      Instance UUID:           50180b3a-86ee-870a-c3da-90ddbaffc950
      Phase:                   Created
      Power State:             poweredOn
      Unique ID:               vm-73
      Vm Ip:                   10.161.75.162
    Events:                    <none>
    ...
    
  5. VM IP에 연결할 수 있는지 확인합니다.
    ping 10.161.75.162
    PING 10.161.75.162 (10.161.75.162): 56 data bytes
    64 bytes from 10.161.75.162: icmp_seq=0 ttl=59 time=43.528 ms
    64 bytes from 10.161.75.162: icmp_seq=1 ttl=59 time=53.885 ms
    64 bytes from 10.161.75.162: icmp_seq=2 ttl=59 time=31.581 ms

결과

VM 서비스를 통해 생성된 VM은 Kubernetes 네임스페이스의 DevOps로만 관리할 수 있습니다. 수명 주기는 vSphere Client에서 관리할 수 없지만 vSphere 관리자는 VM 및 해당 리소스를 모니터링할 수 있습니다. 자세한 내용은 vSphere IaaS control plane에서 사용 가능한 가상 시스템 모니터링의 내용을 참조하십시오.

다음에 수행할 작업

자세한 내용은 가상 시스템 프로비저닝 소개 블로그를 참조하십시오.