베어메탈용 GKE에서 가상 디스크 만들기 및 관리

이 문서는 베어메탈용 GKE를 실행하는 애플리케이션 소유자를 대상으로 합니다. 이 문서에서는 Google Distributed Cloud용 VM 런타임을 사용하는 가상 머신(VM)에 대해 디스크 리소스를 만들고 관리하는 방법을 설명합니다.

시작하기 전에

이 문서를 완료하려면 다음 리소스에 대해 액세스 권한이 필요합니다.

연결된 디스크가 있는 VM 만들기

VM을 만들 때는 기존 부팅 또는 데이터 디스크를 연결하거나, 이미지에서 디스크를 만들거나(부팅 디스크 포함), 빈 디스크를 만들 수 있습니다.

빈 디스크

이 시나리오에서는 빈 디스크를 만들고 이를 VM에 연결합니다. 이 시나리오에서는 애플리케이션 데이터를 저장하기 위해 데이터 디스크를 만들 수 있습니다.

  1. 원하는 편집기에서 my-vm.yaml과 같이 VirtualMachineDiskVirtualMachine을 정의하는 매니페스트를 만듭니다.

    nano my-vm.yaml
    
  2. 다음 YAML 정의를 복사하여 붙여넣습니다.

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineDisk
    metadata:
      name: DISK_NAME
    spec:
      size: 10Gi
    ---
    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachine
    metadata:
      name: VM_NAME
    spec:
      interfaces:
        - name: eth0
          networkName: pod-network
          default: true
      disks:
        - boot: true
          virtualMachineDiskName: VM_NAME-boot-dv
        - virtualMachineDiskName: DISK_NAME
    

    다음을 바꿉니다.

    • DISK_NAME: VM에 만들고 연결하는 빈 디스크의 이름입니다.

    • VM_NAME: 만들려는 VM의 이름입니다.

      이 예시에서는 DISK_NAME이라는 빈 10Gi(10기비바이트) 디스크를 만듭니다. VM의 spec.disks 섹션에서는 다음 섹션에 표시된 것처럼 이미지에서와 같이 부팅 디스크를 연결해야 합니다.

  3. 편집기에서 매니페스트 파일을 저장하고 닫습니다.

  4. kubectl을 사용하여 VM 및 디스크를 만듭니다.

    kubectl apply -f my-vm.yaml --kubeconfig KUBECONFIG
    

    KUBECONFIG를 클러스터 kubeconfig 파일의 경로로 바꿉니다.

From image

이 시나리오에서는 이미지에서 디스크를 만들고 이를 VM에 연결합니다. 이 시나리오에서는 예를 들어 이미지에서 부팅 디스크를 만들 수 있습니다. 또한 이미지에서 데이터 디스크를 만들고 연결할 수 있습니다.

지원되는 이미지 소스

Google Distributed Cloud용 VM 런타임은 다양한 이미지 형식을 허용하고 VirtualMachineDisk 사양에 지정할 수 있는 세 가지 유형의 이미지 소스를 지원합니다. 다음은 지원되는 다양한 이미지 소스에서 20기비바이트 디스크를 만드는 각 예시입니다.

  • HTTP(Hypertext Transfer Protocol)

    다음 VirtualMachineDisk 예시는 HTTP 이미지 소스의 기본 구조를 보여줍니다. url 필드에는 HTTP 또는 HTTPS URL이 필요합니다.

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineDisk
    metadata:
      name: my-disk
    spec:
      source:
        http:
          url: https://download.cirros-cloud.net/0.4.0/cirros-0.4.0-x86_64-disk.img
      size: 20GiB
      storageClassName: local-shared
    
  • Cloud Storage

    다음 예시에서는 Cloud Storage 버킷의 이미지에서 디스크를 만드는 방법을 보여줍니다. 머신의 애플리케이션 기본 사용자 인증 정보가 Cloud Storage URL에 액세스하는 데 충분하지 않으면 사용자 인증 정보를 제공해야 합니다. 다음 예시에서 my-gcs는 base64로 인코딩된 서비스 계정 키가 포함된 보안 비밀입니다.

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineDisk
    metadata:
      name: my-disk
    spec:
      source:
        gcs:
          url: gs://kubevirt-ci-vm-images/rhel8.2/rhel8_2_cloud.qcow2
          secretRef: my-gcs
      size: 20GiB
      storageClassName: local-shared
    

    다운로드한 서비스 계정 키를 사용하여 클러스터를 만든 경우 Cloud Storage 액세스에 Container Registry 서비스 계정 키를 사용할 수 있습니다. Cloud Storage에 액세스하기 위해 별도의 서비스 계정을 만드는 경우 Cloud Storage 버킷에 액세스할 수 있는 서비스 계정 구성을 참조하세요.

    다음 명령어를 사용하여 다운로드한 서비스 계정 키 파일에서 Kubernetes 보안 비밀을 만듭니다.

    kubectl create secret generic SECRET_NAME --from-file=KEY_FILE --namespace default \
        --kubeconfig KUBECONFIG
    

    다음을 바꿉니다.

    • SECRET_NAME: 보안 비밀의 이름
    • KEY_FILE: 다운로드한 서비스 계정 키 JSON 파일의 경로 예를 들면 bmctl-workspace/.sa-keys/my-project-anthos-baremetal-gcr.json입니다.
    • KUBECONFIG: 클러스터 kubeconfig 파일의 경로

    사용자 인증 정보를 사용하여 Cloud Storage에 액세스하는 방법에 대한 자세한 내용은 사용자 인증 정보를 만들고 사용하여 Cloud Storage에서 이미지 가져오기를 참조하세요.

  • Container Registry 예시

    Open Container Initiative(OCI) 배포 사양을 준수하는 Container Registry가 지원됩니다. 다음 예시에서는 Docker 레지스트리에 저장된 이미지에서 디스크를 만듭니다.

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineDisk
    metadata:
      name: my-disk
    spec:
      source:
        registry:
          url: docker://kubevirt/fedora-cloud-registry-disk-demo
      size: 20GiB
      storageClassName: local-shared
    

유효한 이미지 형식

이미지에서 디스크를 만들 때 다음 이미지 형식 중 하나를 사용할 수 있습니다.

  • GNU zip(gzip) 보관 파일(.gz)
  • 원시(.raw, .img)
  • 쓰기 버전 2(qcow2) 디스크 이미지의 QEMU 사본(.qcow2)
  • XZ 압축 보관 파일(.xz)
  • 가상 머신 디스크(VMDK) 파일(.vmdk)
  • VirtualBox 가상 디스크 이미지(VDI) 파일(.vdi)
  • 가상 하드 디스크(VHD) 이미지 파일(.vdh)
  • 가상 하드 디스크 버전 2(VDHX) 파일(.vdhx)
  • ISO 디스크 이미지 파일(.iso)

HTTP 이미지에서 만든 디스크의 예시

다음 단계에서는 Ubuntu 이미지에서 부팅 디스크를 만듭니다.

  1. 원하는 편집기에서 my-vm.yaml과 같이 VirtualMachineDiskVirtualMachine을 정의하는 매니페스트를 만듭니다.

    nano my-vm.yaml
    
  2. 다음 YAML 정의를 복사하여 붙여넣습니다.

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineDisk
    metadata:
      name: VM_NAME-boot-dv
    spec:
      size: 20Gi
      source:
        http:
          url: https://cloud-images.ubuntu.com/releases/focal/release/ubuntu-20.04-server-cloudimg-amd64.img
    ---
    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachine
    metadata:
      name: VM_NAME
    spec:
      interfaces:
        - name: eth0
          networkName: pod-network
          default: true
      disks:
        - boot: true
          virtualMachineDiskName: VM_NAME-boot-dv
    

    이 예시에서는 공개 Ubuntu 이미지를 사용하여 VM_NAME-boot-dv이라는 20Gi(20기비바이트) 디스크를 만듭니다. VM의 spec.disks 섹션에서는 디스크가 boot: true로 설정됩니다.

  3. 편집기에서 매니페스트를 저장하고 닫습니다.

  4. kubectl을 사용하여 VM 및 디스크를 만듭니다.

    kubectl apply -f my-vm.yaml --kubeconfig KUBECONFIG
    

    KUBECONFIG를 클러스터 kubeconfig 파일의 경로로 바꿉니다.

기존 디스크

이 시나리오에서는 빈 디스크를 만들고 이를 VM에 연결합니다. 이 시나리오에서는 애플리케이션 데이터를 저장하기 위해 데이터 디스크를 만들 수 있습니다.

  1. 원하는 편집기에서 my-vm.yaml과 같은 VirtualMachine 매니페스트를 만듭니다.

    nano my-vm.yaml
    
  2. 다음 YAML 정의를 복사하여 붙여넣습니다.

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachine
    metadata:
      name: VM_NAME
    spec:
      interfaces:
        - name: eth0
          networkName: pod-network
          default: true
      disks:
        - boot: true
          virtualMachineDiskName: VM_NAME-boot-dv
        - virtualMachineDiskName: EXISTING_DISK_NAME
    

    이 예시에서는 EXISTING_DISK_NAME이라는 기존 디스크를 연결합니다.

    VM의 spec.disks 섹션에서는 이전 섹션에 표시된 것처럼 이미지에서와 같이 부팅 디스크를 연결해야 합니다.

  3. 편집기에서 VM 매니페스트를 저장하고 닫습니다.

  4. kubectl을 사용하여 VM을 만듭니다.

    kubectl apply -f my-vm.yaml --kubeconfig KUBECONFIG
    

    KUBECONFIG를 클러스터 kubeconfig 파일의 경로로 바꿉니다.

디스크 찾기

베어메탈용 GKE 버전 1.13.0부터는 VM을 만들 때 Google Distributed Cloud용 VM 런타임이 VM 리소스에 지정한 디스크 이름을 사용하여 디스크 일련번호를 설정합니다. 특히 VirtualMachine 커스텀 리소스에서 spec.disks.virtualMachineDiskName로 지정하는 이름은 디스크의 일련번호에 사용됩니다. 이 기능을 사용하면 포맷 또는 마운트와 같은 디스크 작업을 수행해야 할 때 VM에서 디스크를 더 쉽게 찾을 수 있습니다.

예를 들어 VM을 만들고 sample-boot-dv라는 부팅 디스크를 지정한 경우 VirtualMachine 커스텀 리소스는 다음과 같습니다.

apiVersion: vm.cluster.gke.io/v1
kind: VirtualMachine
metadata:
  name: sample-vm
spec:
  osType: Linux
  compute:
    cpu:
      vcpus: 2
    memory:
      capacity: 4Gi
  interfaces:
    - name: eth0
      networkName: pod-network
      default: true
  disks:
    - boot: true
      virtualMachineDiskName: sample-vm-boot-dv
    - virtualMachineDiskName: attached-disk

Linux VM의 경우 VM에 로그인할 때 다음 명령어를 실행하여 일련번호별로 디스크를 나열할 수 있습니다.

ls -l /dev/disk/by-id/

응답은 다음 예시 출력과 같이 디스크 이름이 일련번호로 표시됩니다.

total 0
lrwxrwxrwx 1 root root  9 Oct 19 17:17 ata-QEMU_HARDDISK_agentInstallation -> ../../sdb
lrwxrwxrwx 1 root root  9 Oct 19 17:17 ata-QEMU_HARDDISK_agentSADisk -> ../../sda
lrwxrwxrwx 1 root root  9 Oct 19 17:17 virtio-sample-boot-dv -> ../../vda
lrwxrwxrwx 1 root root 10 Oct 19 17:17 virtio-sample-boot-dv-part1 -> ../../vda1
lrwxrwxrwx 1 root root 11 Oct 19 17:17 virtio-sample-boot-dv-part14 -> ../../vda14
lrwxrwxrwx 1 root root 11 Oct 19 17:17 virtio-sample-boot-dv-part15 -> ../../vda15
lrwxrwxrwx 1 root root 11 Oct 19 17:17 virtio-attached-disk -> ../../vdb

다음과 같은 상황의 특성에 유의하세요.

  • virtualMachineDiskName 값이 20자를 초과하면 Google Distributed Cloud용 VM 런타임은 처음 20자만 일련번호로 사용합니다.
  • 처음 20자가 동일한 2개의 디스크가 있는 경우 첫 번째 디스크만 일련번호를 가집니다.

디스크를 만들고 기존 VM에 연결

기존 VM이 있으면 디스크를 만들고 연결하여 애플리케이션 수명 주기를 지원할 수 있습니다. VM은 디스크를 연결하기 전에 중지된 상태여야 합니다.

빈 디스크

이 시나리오에서는 빈 디스크를 만들고 이를 VM에 연결합니다. 이 시나리오에서는 애플리케이션 데이터를 저장하기 위해 데이터 디스크를 만들 수 있습니다.

  1. 필요한 경우 kubectl을 사용하여 VM을 중지합니다.

    kubectl virt stop vm VM_NAME --kubeconfig KUBECONFIG
    

    다음을 바꿉니다.

    • VM_NAME: 중지할 VM의 이름
    • KUBECONFIG: 관리자 클러스터 kubeconfig 파일의 경로
  2. my-vm과 같은 기존 VM 리소스를 수정합니다.

    kubectl edit gvm VM_NAME --kubeconfig KUBECONFIG
    
  3. VirtualMachine YAML 매니페스트를 업데이트하여 위에 VirtualMachineDisk 섹션을 추가한 후 VM의 spec.disks 섹션의 끝에 디스크를 연결합니다.

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineDisk
    metadata:
      name: DISK_NAME
    spec:
      size: 10Gi
    ---
    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachine
    metadata:
      name: VM_NAME
    spec:
      interfaces:
        - name: eth0
          networkName: pod-network
          default: true
      disks:
        - boot: true
          virtualMachineDiskName: VM_NAME-boot-dv
        - virtualMachineDiskName: DISK_NAME
    

    이 예시에서는 DISK_NAME이라는 빈 10Gi(10기비바이트) 디스크를 만듭니다.

  4. 편집기에서 업데이트된 VM 매니페스트를 저장하고 닫습니다.

  5. kubectl을 사용하여 VM을 시작합니다.

    kubectl virt start vm VM_NAME --kubeconfig KUBECONFIG
    

From image

이 시나리오에서는 소스 이미지에서 디스크를 만들고 이를 VM에 연결합니다.

  1. 필요한 경우 kubectl을 사용하여 VM을 중지합니다.

    kubectl virt stop vm VM_NAME --kubeconfig KUBECONFIG
    

    다음을 바꿉니다.

    • VM_NAME: 중지할 VM의 이름
    • KUBECONFIG: 관리자 클러스터 kubeconfig 파일의 경로
  2. my-vm과 같은 기존 VM 리소스를 수정합니다.

    kubectl edit gvm VM_NAME --kubeconfig KUBECONFIG
    
  3. VirtualMachine 매니페스트를 업데이트하여 위에 VirtualMachineDisk 섹션을 추가한 후 VM의 spec.disks 섹션 끝에 디스크를 연결합니다.

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineDisk
    metadata:
      name: DISK_NAME
    spec:
      size: 10Gi
      source:
        http:
          url: http://example.com/my-disk-img.qcow2
    ---
    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachine
    metadata:
      name: VM_NAME
    spec:
      interfaces:
        - name: eth0
          networkName: pod-network
          default: true
      disks:
        - boot: true
          virtualMachineDiskName: VM_NAME-boot-dv
        - virtualMachineDiskName: DISK_NAME
    

    이 예시에서는 http://example.com/my-disk-img.qcow2 HTTP 소스에서 DISK_NAME이라는 10Gi(10기비바이트) 디스크를 만듭니다.

  4. 편집기에서 업데이트된 VM 매니페스트를 저장하고 닫습니다.

  5. kubectl을 사용하여 VM을 시작합니다.

    kubectl virt start vm VM_NAME --kubeconfig KUBECONFIG
    

디스크 만들기

이 시나리오에서는 VM 리소스와 별개로 디스크 리소스를 만듭니다. 이 시나리오에서는 미리 디스크를 만든 후 필요에 따라 VM에 연결할 수 있습니다.

빈 디스크

빈 디스크를 만들려면 다음 단계를 완료합니다.

  1. 원하는 편집기에서 my-disk.yaml과 같은 VirtualMachineDisk 매니페스트를 만듭니다.

    nano my-disk.yaml
    
  2. 다음 YAML 정의를 복사하여 붙여넣습니다.

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineDisk
    metadata:
      name: DISK_NAME
    spec:
      size: 10Gi
    

    이 예시에서는 DISK_NAME이라는 빈 10Gi(10기비바이트) 디스크를 만듭니다.

  3. 편집기에서 디스크 매니페스트를 저장하고 닫습니다.

  4. kubectl을 사용하여 디스크를 만듭니다.

    kubectl apply -f my-disk.yaml --kubeconfig KUBECONFIG
    

    KUBECONFIG를 클러스터 kubeconfig 파일의 경로로 바꿉니다.

From image

이미지에서 디스크를 만들려면 다음 단계를 완료합니다.

  1. 원하는 편집기에서 my-disk.yaml과 같은 VirtualMachineDisk 매니페스트를 만듭니다.

    nano my-disk.yaml
    
  2. 다음 YAML 정의를 복사하여 붙여넣습니다.

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineDisk
    metadata:
      name: DISK_NAME
    spec:
      size: 20Gi
      source:
        http:
          url: https://cloud-images.ubuntu.com/releases/focal/release/ubuntu-20.04-server-cloudimg-amd64.img
    

    이 예시에서는 공개 Ubuntu 이미지를 사용하여 DISK_NAME이라는 20Gi(20기비바이트) 디스크를 만듭니다.

  3. 편집기에서 디스크 매니페스트를 저장하고 닫습니다.

  4. kubectl을 사용하여 디스크를 만듭니다.

    kubectl apply -f my-disk.yaml --kubeconfig KUBECONFIG
    

    KUBECONFIG를 클러스터 kubeconfig 파일의 경로로 바꿉니다.

다음 단계