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

사전 요구 사항

  • 네임스페이스에 VM을 배포하는 데 사용할 수 있는 리소스가 있는지 확인합니다. vSphere with Tanzu의 네임스페이스에서 사용 가능한 VM 리소스 보기의 내용을 참조하십시오.
  • VM용 NVIDIA vGPU 또는 기타 PCI 디바이스를 사용하는 경우 다음 고려 사항이 적용됩니다.
    • PCI 구성에서 적절한 VM 클래스를 사용해야 합니다. vSphere with Tanzu의 VM 클래스에 PCI 디바이스 추가의 내용을 참조하십시오.
    • vGPU 디바이스가 있는 VM에는 부팅 모드가 EFI로 설정된 이미지(예: CentOS)가 필요합니다. 이러한 이미지에 액세스할 수 있는지 확인합니다. 지원되는 이미지에 대한 자세한 내용은 VMware Cloud Marketplace 웹 사이트에서 VM 서비스 이미지를 검색하십시오.
    • VM 서비스에서 관리되는 vGPU 디바이스가 있는 VM은 ESXi 호스트가 유지 보수 모드로 전환되면 자동으로 전원이 꺼집니다. 그러면 VM에서 실행되는 워크로드에 일시적으로 영향을 줄 수 있습니다. 호스트가 유지 보수 모드를 종료하면 VM의 전원이 자동으로 켜집니다.

프로시저

  1. VM YAML 파일을 준비합니다.
    파일에서 다음 매개 변수를 지정합니다.
    옵션 설명
    apiVersion VM 서비스 API의 버전을 지정합니다. 예: vmoperator.vmware.com/v1alpha1.
    kind 생성할 Kubernetes 리소스의 유형을 지정합니다. 사용 가능한 유일한 값은 VirtualMachine입니다.
    spec.imageName VM이 사용해야 하는 컨텐츠 라이브러리 이미지를 지정합니다. 예: centos-stream-8-vmservice-v1alpha1-xxxxxxxxxxxxx.
    spec.storageClass​ 영구 볼륨의 스토리지에 사용할 스토리지 클래스를 식별합니다. 예: wcpglobal-storage-profile.
    spec.className 사용할 가상 하드웨어 설정을 설명하는 VM 클래스의 이름을 지정합니다. 예: custom.
    spec.networkInterfaces VM에 대한 네트워크 관련 설정을 지정합니다.
    • networkType. 이 키의 값은 nsx-t 또는 vsphere-distributed일 수 있습니다.
    • networkName. networkTypevsphere-distributed인 경우에만 이름을 지정합니다. 이 정보는 kubectl get network 명령을 사용하여 얻을 수 있습니다.

      networkTypensx-t이면 networkName을 지정할 필요가 없습니다.

    spec.vmMetadata VM에 전달할 추가 메타데이터를 포함합니다. 이 키를 사용하여 게스트 운영 체제 이미지를 사용자 지정하고 VM의 hostnameuser-data(암호, ssh 키 포함) 등의 항목을 설정할 수 있습니다. 아래의 예제 YAML은 ConfigMap을 사용하여 메타데이터를 저장합니다.
    YAML 파일 vmsvc-centos-vm.yaml의 예로 다음을 사용합니다.
    apiVersion: vmoperator.vmware.com/v1alpha1
    kind: VirtualMachine
    metadata:
      name: vmsvc-centos-vm
      namespace: my-ns-centos
    spec:
      imageName: centos-stream-8-vmservice-v1alpha1-xxxxxxxxxxxxx
      className: custom
      powerState: poweredOn
      storageClass: wcpglobal-storage-profile
      networkInterfaces:
      - networkName: primary
        networkType: vsphere-distributed
      vmMetadata:
          configMapName: vmsvc-centos-nginx-cm
          transport: OvfEnv
    ---
    apiVersion: v1
    kind: ConfigMap
    metadata:
        name: vmsvc-centos-nginx-cm
        namespace: my-ns-centos
    data:
      user-data: >-
        I2Nsb3VkLWNvbmZpZwoKcGFzc3dvcmQ6IFZNV0FSRQpzc2hfcHdhdXRoOiB0cnVlCgp1c2VyczoKICAtIG5hbWU6IHZtd2FyZQogICAgc3VkbzogQUxMPShBTEwpIE5PUEFTU1dEOkFMTAogICAgbG9ja19wYXNzd2Q6IGZhbHNlCiAgICAjIFBhc3N3b3JkIHNldCB0byBBZG1pbiEyMwogICAgcGFzc3dkOiAnJDEkc2FsdCRTT0MzM2ZWYkEvWnhlSXdENXl3MXUxJwogICAgc2hlbGw6IC9iaW4vYmFzaAoKd3JpdGVfZmlsZXM6CiAgLSBjb250ZW50OiB8CiAgICAgIFZNU1ZDIFNheXMgSGVsbG8gV29ybGQKICAgIHBhdGg6IC9oZWxsb3dvcmxkCg==
    ConfigMap에는 게스트 운영 체제의 사용자 이름 및 암호를 지정하는 cloud-config blob이 포함되어 있습니다. 이 예에서 vmsvc-centos-nginx-cm ConfigMap의 user-data는 base64 형식의 다음 코드 조각을 나타냅니다.
    #cloud-config
    password: VMWARE
    ssh_pwauth: true
    users:
      - name: vmware
        sudo: ALL=(ALL) NOPASSWD:ALL
        lock_passwd: false
        passwd: '$1$salt$SOC33fVbA/ZxeIwD5yw1u1'
        shell: /bin/bash
    write_files:
      - content: |
          VMSVC Says Hello World
        path: /helloworld
    cloud-config 규격에 대한 자세한 내용은 https://cloudinit.readthedocs.io/en/latest/topics/examples.html 항목을 참조하십시오.
  2. VM을 배포합니다.
    kubectl apply -f vmsvc-centos-vm.yaml
  3. VM이 생성되었는지 확인합니다.
    kubectl get vm -n my-ns-centos
    NAME              AGE
    vmsvc-centos-vm   28s
  4. VM 및 관련 이벤트의 상태를 확인합니다.
    kubectl describe virtualmachine vmsvc-centos-vm

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

    Name:         vmsvc-centos-vm
    Namespace:    my-ns-centos
    Annotations:  vmoperator.vmware.com/image-supported-check: disabled
    API Version:  vmoperator.vmware.com/v1alpha1
    Kind:         VirtualMachine
    Metadata:
      Creation Timestamp:  2021-03-23T19:07:36Z
      Finalizers:
        virtualmachine.vmoperator.vmware.com
      Generation:  1
      Managed Fields:
     ...  
     ... 
    Spec:
      Class Name:  custom
      Image Name:  vmservice-centos-20-10-server-cloudimg-amd64
      Network Interfaces:
        Network Name:  primary
        Network Type:  vsphere-distributed
      Power State:     poweredOn
      Storage Class:   wcpglobal-storage-profile
      Vm Metadata:
        Config Map Name:  vmsvc-centos-nginx-cm
        Transport:        OvfEnv
    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 with Tanzu에서 사용 가능한 가상 시스템 모니터링의 내용을 참조하십시오.

다음에 수행할 작업

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

VM에 vGPU용으로 구성된 PCI 디바이스가 포함된 경우 NVIDIA 디스플레이 드라이버를 설치합니다. vSphere with Tanzu의 VM에 NVIDIA 게스트 드라이버 설치의 내용을 참조하십시오.