VM 기반 워크로드 작업

이 페이지에서는 Anthos VM 런타임을 사용하여 베어메탈용 Anthos 클러스터에 VM을 배포하는 방법을 보여줍니다. Anthos VM 런타임은 KubeVirt를 사용하여 클러스터의 VM을 조정하므로 동일한 개발 환경에서 VM 기반 앱 및 워크로드를 사용할 수 있습니다. 새 클러스터를 만들 때 기존 클러스터에 Anthos VM 런타임을 사용 설정할 수 있습니다.

시작하기 전에

이 안내에서는 클러스터를 준비하여 실행 중이라고 가정합니다. 그렇지 않으면 베어메탈용 Anthos 클러스터 빠른 시작의 안내에 따라 워크스테이션에서 클러스터를 빠르게 설정할 수 있습니다.

Anthos VM 런타임 사용 설정

  1. 다음을 실행하여 클러스터 구성을 엽니다.

    kubectl --kubeconfig bmctl-workspace/CLUSTER_NAME/CLUSTER_NAME-kubeconfig edit cluster CLUSTER_NAME -n cluster-CLUSTER_NAME
    

    CLUSTER_NAME을 클러스터 이름으로 바꿉니다.

  2. 클러스터 구성의 spec 섹션에 kubevirt를 추가합니다. 노드에서 하드웨어 가상화를 지원하는 경우 성능 향상을 위해 useEmulationfalse로 설정합니다. 하드웨어 가상화가 지원되지 않거나 확실하지 않은 경우 true로 설정합니다.

    spec:
      anthosBareMetalVersion: 1.8.9
      kubevirt:
        useEmulation: true
      bypassPreflightCheck: false
    
  3. 구성을 저장하고 KubeVirt가 사용 설정되어 있는지 확인합니다.

    kubectl --kubeconfig bmctl-workspace/CLUSTER_NAME/CLUSTER_NAME-kubeconfig get pods -n kubevirt
    

    CLUSTER_NAME을 클러스터 이름으로 바꿉니다.

    이 명령어는 다음과 비슷한 결과를 반환합니다.

    NAME                              READY   STATUS    RESTARTS   AGE
    virt-api-767bc4ccd5-56fk2         1/1     Running   0          11d
    virt-api-767bc4ccd5-ms8tn         1/1     Running   0          11d
    virt-controller-c8468c84c-l4dzr   1/1     Running   0          11d
    virt-controller-c8468c84c-tljnj   1/1     Running   1          11d
    virt-handler-6wk5v                1/1     Running   0          11d
    virt-handler-ngth6                1/1     Running   0          11d
    virt-operator-7447547957-c6g5d    1/1     Running   1          11d
    virt-operator-7447547957-nl826    1/1     Running   0          11d
    

virtctl 설치

  1. virtctl CLI 도구를 kubectl 플러그인으로 설치합니다.

    export GOOGLE_APPLICATION_CREDENTIALS="bm-gcr.json"
    sudo -E ./bmctl install virtctl
    
  2. virtctl이 설치되어 있는지 확인합니다.

    kubectl plugin list
    

    virtctl이 응답에 나열되면 성공적으로 설치됩니다.

VM 만들기

클러스터에서 KubeVirt를 사용 설정하고 kubectlvirtctl 플러그인을 설치하면 kubectl virt create vm 명령어를 사용하여 클러스터에서 VM을 만들 수 있습니다. 이 명령어를 실행하기 전에 VM이 생성된 후 콘솔에 액세스할 수 있도록 cloud-init 파일을 구성하는 것이 좋습니다.

콘솔 액세스를 위한 커스텀 cloud-init 파일 만들기

커스텀 cloud-init 파일을 만드는 방법에는 두 가지가 있습니다. 가장 쉬운 방법은 VM을 만들 때 --os=<OPERATING_SYSTEM> 플래그를 지정하는 것입니다. 이 메서드는 간단한 cloud-init 파일을 자동으로 구성하고 다음 운영체제에서 작동합니다.

  • Ubuntu
  • CentOS
  • Debian
  • Fedora

VM이 생성되면 다음 사용자 인증 정보로 VM에 처음 액세스한 후 비밀번호를 변경할 수 있습니다.

user: root
password: changeme

이미지에 다른 Linux 기반 OS가 포함되어 있거나 고급 구성이 필요한 경우 수동으로 커스텀 cloud-init 파일을 만들고 --cloud-init-file=<path/to/file> 플래그를 지정하여 해당 파일의 경로를 지정할 수 있습니다. 가장 기본적인 양식에서 cloud-init 파일은 다음을 포함하는 YAML 파일입니다.

#cloud-config
user: root
password: changeme
lock_passwd: false
chpasswd: {expire: false}
disable_root: false
ssh_authorized_keys:
- <ssh-key>

고급 구성에 대해서는 Cloud 구성 예시를 참조하세요.

사용할 방법을 결정했으면 VM을 만들 준비가 된 것입니다.

kubectl virt create vm 명령어 실행

공개 이미지 또는 커스텀 이미지를 사용하여 VM을 만들 수 있습니다.

공개 이미지

클러스터에 외부 연결이 있는 경우 다음을 실행하여 공개 이미지에서 VM을 만들 수 있습니다.

kubectl virt create vm VM_NAME \
    --boot-disk-access-mode=MODE \
    --boot-disk-size=DISK_SIZE \
    --boot-disk-storage-class="DISK_CLASS" \
    --cloud-init-file=FILE_PATH \
    --cpu=CPU_NUMBER \
    --image=IMAGE_NAME \
    --memory=MEMORY_SIZE

다음을 바꿉니다.

  • VM_NAME을 만들려는 VM의 이름으로 바꿉니다.
  • MODE를 부팅 디스크의 액세스 모드로 바꿉니다. 가능한 값은 ReadWriteOnce(기본값) 또는 ReadWriteMany입니다.
  • DISK_SIZE를 원하는 부팅 디스크 크기로 바꿉니다. 기본값은 20Gi입니다.
  • DISK_CLASS를 부팅 디스크의 스토리지 클래스로 바꿉니다. 기본값은 local-shared입니다. 사용 가능한 스토리지 클래스 목록을 보려면 kubectl get storageclass를 실행합니다.
  • FILE_PATH를 맞춤설정된 cloud-init 파일의 전체 경로로 바꿉니다. 이미지에 따라 VM을 만든 후 콘솔 액세스 권한을 얻는 데 필요할 수 있습니다. cloud-init 파일을 --os 플래그를 사용하여 자동으로 구성하려면 --cloud-init-file 플래그를 지정하지 마세요. --cloud-init-file 플래그를 지정하면 --os 플래그가 무시됩니다. --os에 허용되는 값은 ubuntu, centos, debian, fedora입니다.
  • CPU_NUMBER를 VM에 구성할 CPU 수로 바꿉니다. 기본값은 1입니다.
  • IMAGE_NAME를 VM 이미지(ubuntu20.04(기본값), centos8 또는 URL 이미지)로 바꿉니다.
  • MEMORY_SIZE를 VM의 메모리 크기로 바꿉니다. 기본값은 4Gi입니다.

커스텀 이미지

커스텀 이미지를 사용하여 VM을 만들 때 HTTP 이미지 서버 또는 로컬에 저장된 이미지에서 이미지를 지정할 수 있습니다.

HTTP 이미지 서버

Apache 또는 nginx를 사용하여 HTTP 서버를 설정하고 커스텀 이미지를 노출된 폴더에 업로드할 수 있습니다. 그런 후 다음을 실행하여 커스텀 이미지에서 VM을 만들 수 있습니다.

kubectl virt create vm VM_NAME \
    --boot-disk-access-mode=DISK_ACCESS_MODE \
    --boot-disk-size=DISK_SIZE \
    --boot-disk-storage-class=DISK_CLASS \
    --cloud-init-file=FILE_PATH \
    --cpu=CPU_NUMBER \
    --image=http://SERVER_IP/IMAGE_NAME \
    --memory=MEMORY_SIZE

다음을 바꿉니다.

  • VM_NAME을 만들려는 VM의 이름으로 바꿉니다.
  • DISK_ACCESS_MODE를 부팅 디스크의 액세스 모드로 바꿉니다. 가능한 값은 ReadWriteOnce(기본값) 또는 ReadWriteMany입니다.
  • DISK_SIZE를 원하는 부팅 디스크 크기로 바꿉니다. 기본값은 20Gi입니다.
  • DISK_CLASS를 부팅 디스크의 스토리지 클래스로 바꿉니다. 기본값은 local-shared입니다. 사용 가능한 스토리지 클래스 목록을 보려면 kubectl get storageclass를 실행합니다.
  • FILE_PATH를 맞춤설정된 cloud-init 파일의 전체 경로로 바꿉니다. 이미지에 따라 VM을 만든 후 콘솔 액세스 권한을 얻는 데 필요할 수 있습니다. cloud-init 파일을 --os 플래그를 사용하여 자동으로 구성하려면 --cloud-init-file 플래그를 지정하지 마세요. --cloud-init-file 플래그를 지정하면 --os 플래그가 무시됩니다. --os에 허용되는 값은 ubuntu, centos, debian, fedora입니다.
  • CPU_NUMBER를 VM에 구성할 CPU 수로 바꿉니다. 기본값은 1입니다.
  • SERVER_IP를 이미지를 호스팅하는 서버의 IP 주소로 바꿉니다.
  • IMAGE_NAME을 커스텀 이미지의 파일 이름으로 바꿉니다.
  • MEMORY_SIZE를 VM의 메모리 크기로 바꿉니다. 기본값은 4Gi입니다.

로컬에 저장된 이미지

다음을 실행하여 커스텀 이미지를 로컬에 저장하고 다음을 실행하여 이미지에서 VM을 만들 수 있습니다.

kubectl virt create vm VM_NAME \
    --boot-disk-access-mode=DISK_ACCESS_MODE \
    --boot-disk-size=DISK_SIZE \
    --boot-disk-storage-class=DISK_CLASS \
    --cloud-init-file=FILE_PATH \
    --cpu=CPU_NUMBER \
    --image=IMAGE_PATH \
    --memory=MEMORY_SIZE \

다음을 바꿉니다.

  • VM_NAME을 만들려는 VM의 이름으로 바꿉니다.
  • DISK_ACCESS_MODE를 부팅 디스크의 액세스 모드로 바꿉니다. 가능한 값은 ReadWriteOnce(기본값) 또는 ReadWriteMany입니다.
  • DISK_SIZE를 원하는 부팅 디스크 크기로 바꿉니다. 기본값은 20Gi입니다.
  • DISK_CLASS를 부팅 디스크의 스토리지 클래스로 바꿉니다. 기본값은 local-shared입니다.
  • FILE_PATH를 맞춤설정된 cloud-init 파일의 전체 경로로 바꿉니다. 이미지에 따라 VM을 만든 후 콘솔 액세스 권한을 얻는 데 필요할 수 있습니다. cloud-init 파일을 --os 플래그를 사용하여 자동으로 구성하려면 --cloud-init-file 플래그를 지정하지 마세요. --cloud-init-file 플래그를 지정하면 --os 플래그가 무시됩니다. --os에 허용되는 값은 ubuntu, centos, debian, fedora입니다.
  • CPU_NUMBER를 VM에 구성할 CPU 수로 바꿉니다. 기본값은 1입니다.
  • IMAGE_PATH를 커스텀 이미지의 로컬 파일 경로로 바꿉니다.
  • MEMORY_SIZE를 VM의 메모리 크기로 바꿉니다. 기본값은 4Gi입니다.

플래그 기본값 변경

kubectl virt create vm 명령어는 기본값을 사용하여 명령어가 실행될 때 지정되지 않은 플래그를 자동으로 채웁니다. 다음 명령어를 실행하여 이러한 기본값을 변경할 수 있습니다.

kubectl virt config default FLAG

FLAG를 기본값을 변경할 매개변수의 플래그로 바꿉니다.

: 다음 명령어는 기본 CPU 구성을 초기 기본값 1에서 2로 변경합니다.

kubectl virt config default --cpu=2

지원되는 플래그 및 현재 기본값의 목록을 보려면 다음을 실행합니다.

kubectl virt config default -h

기본 구성은 클라이언트 측에 ~/.virtctl.default라는 로컬 파일로 저장됩니다. 이 파일을 수정하여 기본 구성을 변경할 수도 있습니다.

VM에 액세스

VM에 액세스하는 방법은 다음과 같습니다.

콘솔 액세스

콘솔에서 VM에 액세스하려면 다음을 실행합니다.

kubectl virt console VM_NAME

VM_NAME을 액세스하려는 VM의 이름으로 바꿉니다.

VNC 액세스

VNC를 사용하여 VM에 액세스하려면 다음을 실행합니다.

# This requires remote-viewer from the virt-viewer package and a graphical desktop from where you run virtctl
kubectl virt vnc VM_NAME

VM_NAME을 액세스하려는 VM의 이름으로 바꿉니다.

내부 액세스

클러스터 VM의 IP 주소는 클러스터의 다른 모든 포드에서 직접 액세스할 수 있습니다. VM의 IP 주소를 찾으려면 다음을 실행합니다.

kubectl get vmi VM_NAME

VM_NAME을 액세스하려는 VM의 이름으로 바꿉니다.

이 명령어는 다음과 비슷한 결과를 반환합니다.

NAME     AGE   PHASE     IP              NODENAME
vm1      13m   Running   192.168.1.194   upgi-bm002

외부 액세스

클러스터에서 만든 VM에는 클러스터 내에서만 액세스할 수 있는 포드 네트워크 주소가 있습니다. 클러스터 VM을 외부에 액세스하려면 다음 안내를 따르세요.

  1. VM을 부하 분산기 서비스로 노출합니다.

    kubectl virt expose vm VM_NAME \
        --port=LB_PORT \
        --target-port=VM_PORT \
        --type=LoadBalancer \
        --name=SERVICE_NAME
    

    다음을 바꿉니다.

    • VM_NAME을 액세스하려는 VM의 이름으로 바꿉니다.
    • LB_PORT를 노출된 부하 분산기 서비스의 포트로 바꿉니다.
    • VM_PORT를 부하 분산기 서비스를 통해 액세스하려는 VM의 포트로 바꿉니다.
    • SERVICE_NAME을 이 부하 분산기 서비스에 지정할 이름으로 바꿉니다.
  2. 부하 분산기 서비스의 외부 IP 주소를 가져옵니다.

    kubectl get svc SERVICE_NAME
    

    SERVICE_NAME을 VM을 노출하는 부하 분산기 서비스의 이름으로 바꿉니다.

    응답의 EXTERNAL-IP 필드에 나열된 IP 주소를 통해 VM의 대상 포트에 액세스할 수 있습니다.

예시

SSH를 사용하여 클러스터 외부에서 VM에 액세스하려는 galaxy라는 VM이 있는 경우 다음을 실행합니다.

kubectl virt expose vm galaxy \
   --port=25022 \
   --target-port=22 \
   --type=LoadBalancer \
   --name=galaxy-ssh

그 다음 부하 분산기 IP 주소를 가져옵니다.

kubectl get svc galaxy-ssh

이 명령어는 다음과 비슷한 결과를 반환합니다.

NAME        TYPE          CLUSTER-IP     EXTERNAL-IP   PORT(S)           AGE
galaxy-ssh  LoadBalancer  10.96.250.76   21.1.38.202   25000:30499/TCP   4m40s

이제 클러스터 외부에서 21.1.38.202:25022(VIP:port)를 통해 SSH를 사용하여 VM에 액세스할 수 있습니다.

ssh root@21.1.38.202:22 -p 25022

VM 원격 분석 및 콘솔 로그 검사

VM 원격 분석 로그와 콘솔 로그가 Google Cloud 콘솔에 통합되었습니다. 원격 분석 정보 및 로그 데이터는 VM의 상태를 모니터링하고 클러스터 VM의 문제를 해결하는 데 매우 중요합니다.

VM 원격 분석

Anthos 클러스터 VM 상태 대시보드에서는 클러스터 VM의 실시간 원격 분석 데이터를 제공합니다.

클러스터 VM의 원격 분석 정보를 보려면 다음 안내를 따르세요.

  1. Google Cloud 콘솔에서 Monitoring을 선택하거나 다음 버튼을 클릭합니다.

    모니터링으로 이동

  2. 대시보드를 선택합니다.

    Monitoring 대시보드 목록의 Anthos 클러스터 VM 상태 대시보드

  3. 모든 대시보드 목록에서 Anthos 클러스터 VM 상태를 클릭합니다.

    Anthos 클러스터 VM 상태 세부정보

VM 콘솔 로그

VM 직렬 콘솔 로그는 Cloud Logging으로 스트리밍되며 로그 탐색기에서 볼 수 있습니다.

Anthos 클러스터 VM 데이터가 표시된 로그 탐색기

VM 및 해당 리소스 삭제

VM만 삭제

kubectl virt delete vm VM_NAME

VM_NAME을 삭제할 VM의 이름으로 바꿉니다.

VM 디스크만 삭제

kubectl virt delete disk DISK_NAME

DISK_NAME을 삭제할 디스크의 이름으로 바꿉니다. VM을 삭제하기 전에 VM 디스크를 삭제하려고 하면 VM 삭제를 보류하는 동안 디스크가 삭제 표시됩니다.

VM 및 리소스 삭제

kubectl virt delete vm VM_NAME --all

VM_NAME을 삭제할 VM의 이름으로 바꿉니다.

삭제될 VM에서 사용한 리소스를 확인하려면 --dry-run 플래그를 --all과 함께 지정하면 됩니다.

Anthos VM 런타임 사용 중지

클러스터에서 Anthos VM 런타임을 사용 중지하려면 먼저 클러스터의 모든 VM이 삭제되었는지 확인해야 합니다. Anthos VM 런타임을 사용 중지하면 KubeVirt 및 CDI 네임스페이스의 포드 및 서비스와 같은 모든 KubeVirt 관련 배포가 삭제됩니다.

  1. 클러스터에 기존 VM이 있는지 확인합니다.

    kubectl get vm
    

    명령어가 클러스터에 아직 VM이 있다고 표시되면 계속 진행하기 전에 VM을 삭제해야 합니다.

  2. 다음을 실행하여 클러스터 구성을 엽니다.

    kubectl --kubeconfig bmctl-workspace/CLUSTER_NAME/CLUSTER_NAME-kubeconfig edit cluster CLUSTER_NAME -n cluster-CLUSTER_NAME
    

    CLUSTER_NAME을 클러스터 이름으로 바꿉니다.

  3. 클러스터 구성의 spec 섹션에서 kubevirt를 삭제합니다.

    spec:
      anthosBareMetalVersion: 1.8.9
      kubevirt:
        useEmulation: true
      bypassPreflightCheck: false
    
  4. 구성을 저장합니다.

다음 단계