베어메탈용 Anthos 클러스터에서 가상 디스크 만들기 및 관리

이 문서에서는 베어메탈용 Anthos 클러스터를 실행하는 애플리케이션 소유자를 대상으로 합니다. 이 문서에서는 Anthos 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에 연결합니다. 이 시나리오에서는 예를 들어 이미지에서 부팅 디스크를 만들 수 있습니다. 또한 이미지에서 데이터 디스크를 만들고 연결할 수 있습니다.

지원되는 이미지 소스

Anthos VM 런타임은 다양한 이미지 형식을 허용하며 VirtualMachineDisk 사양에서 지정할 수 있는 3가지 유형의 이미지 소스를 지원합니다. 다음 각 예시에서는 지원되는 다른 이미지 소스에서 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 파일의 경로로 바꿉니다.

디스크 찾기

베어메탈용 Anthos 클러스터 버전 1.13.0부터는 VM을 만들 때 Anthos 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자(영문 기준)를 초과하면 Anthos 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 파일의 경로로 바꿉니다.

다음 단계