GKE 클러스터에서 중첩된 VM 사용

_중첩된 가상화_ 를 사용하여 다른 VM 내에서 가상 머신 (VM) 인스턴스를 만들 수 있습니다. Compute Engine은 이러한 VM 인스턴스가 중첩된 VM을 만들 수 있도록 특정 머신 시리즈에 가상화 안내를 추가합니다. Google Kubernetes Engine (GKE) 노드는 Compute Engine VM에서 실행되므로 GKE 워크로드가 중첩된 VM을 만들고 사용할 수 있습니다. 이 문서에서는 GKE에서 중첩된 가상화를 사용 설정하는 방법을 보여줍니다.

GKE에서 중첩된 VM 작동 방식

GKE에서 중첩된 VM을 사용하려면 특정 노드 또는 노드 풀에 대해 중첩된 가상화를 사용 설정합니다. 해당 CPU 가상화 확장 프로그램( 예: Intel 가상화 기술(VT-x) 또는 AMD 가상화(AMD-V) )이 기본 VM에서 사용 설정됩니다. 그런 다음 QEMU 또는 Kata Containers와 같은 소프트웨어를 사용하여 포드에서 중첩된 VM 생성을 트리거할 수 있습니다.

GKE에서 중첩된 VM은 다음과 같은 사용 사례에 유용합니다.

  • Kata Containers와 같은 경량 VM에서 AI 에이전트와 같은 신뢰할 수 없는 코드를 실행합니다. 이 사용 사례에 대한 자세한 내용은 GKE에서 에이전트 샌드박스와 함께 오픈소스 Kata Containers 사용을 참조하세요.
  • 멀티 테넌트 워크로드에 하드웨어 지원 격리 레이어를 추가합니다.
  • 클라우드에서 Android 에뮬레이터와 같은 전문 소프트웨어를 실행합니다.

성능 영향 감소

비중첩 가상화 구성과 달리 하드웨어 보조 중첩 가상화를 사용할 경우 중첩된 VM에서 실행되는 워크로드에서 성능 감소 가 발생할 수 있습니다. 성능 영향의 정도는 I/O 및 메모리 사용 특성을 포함하여 특정 워크로드 프로필에 따라 달라집니다.

또한 GKE 노드의 기본 VM에서 중첩된 VM을 만들면 이러한 노드에서 실행되는 다른 워크로드의 성능에 영향을 줄 수 있습니다.

시작하기 전에

시작하기 전에 다음 태스크를 수행했는지 확인합니다.

  • Google Kubernetes Engine API를 사용 설정합니다.
  • Google Kubernetes Engine API 사용 설정
  • 이 태스크에 Google Cloud CLI를 사용하려면 설치한 후 초기화합니다. gcloud CLI를 이전에 gcloud CLI를 설치했으면 최신 버전을 gcloud components update 명령어를 실행하여 가져옵니다. 이전 gcloud CLI 버전에서는 이 문서의 명령어를 실행하지 못할 수 있습니다.

요구사항 및 제한사항

GKE에서 중첩된 가상화를 사용 설정하고 포드가 중첩된 VM을 만들도록 허용하기 전에 다음 정보를 고려하세요.

  • 제한된 수의 VM 머신 시리즈가 있는 중첩된 VM으로만 노드 풀을 구성할 수 있습니다. 지원되는 머신 시리즈는 머신 시리즈 비교 의 중첩된 가상화 행을 참조하세요.
  • Windows Server 노드 풀에서는 중첩된 가상화가 지원되지 않습니다.
  • 조직 정책에 VM 중첩된 가상화 사용 중지 제약조건 이 적용되면 중첩된 가상화를 사용할 수 없습니다.
  • 중첩된 VM과 상호작용하도록 포드에 대해 securityContext.privileged:true를 설정해야 합니다.
  • GKE Autopilot을 사용하는 경우 다음 시나리오를 제외하고 권한이 있는 포드 노드를 만들 수 없습니다.

  • 기존 노드 풀에서는 중첩된 가상화를 사용 설정할 수 없습니다.

  • 중첩된 가상화는 GKE에서 변경 불가능한 설정입니다.

  • ComputeClass를 사용하여 중첩된 가상화를 사용 설정하는 경우 클러스터에서 GKE 버전 1.37.0-gke.4713000 이상을 실행해야 합니다.

중첩된 가상화 사용 설정

다음 섹션에서는 다음과 같은 방법으로 GKE에서 중첩된 가상화를 사용 설정하는 방법을 보여줍니다.

  • ComputeClass 사용: Autopilot 또는 일반 모드에서 ComputeClass의 특정 노드 구성에 대해 중첩된 가상화를 사용 설정합니다. 이 방법을 사용하면 자동 생성된 노드 풀에서 중첩된 가상화를 사용 설정하고 여러 우선순위 노드 구성 간에 대체할 수 있습니다.
  • GKE API 사용: Standard 모드에서 Google Cloud 콘솔, gcloud CLI 또는 Terraform과 같은 클라이언트를 사용하여 중첩된 가상화를 사용하는 특정 노드 풀을 만듭니다.

ComputeClass를 사용하여 사용 설정

ComputeClass를 사용하여 Autopilot 또는 일반 모드에서 특정 노드 그룹에 대해 중첩된 가상화를 사용 설정할 수 있습니다. ComputeClass는 자동 생성된 노드 풀 및 Autopilot 노드에 대해 중첩된 가상화를 사용 설정할 수 있는 유일한 방법입니다. 중첩된 가상화를 사용 설정하는 ComputeClass의 예를 배포하려면 다음 단계를 따르세요.

  1. 다음 ComputeClass 매니페스트를 nested-virt-class.yaml이라는 파일로 저장합니다.

    apiVersion: cloud.google.com/v1
    kind: ComputeClass
    metadata:
      name: nested-virt-class
    spec:
      priorities:
      - machineFamily: c3
        spot: true
        enableNestedVirtualization: true
      - machineFamily: c4
        spot: false
        enableNestedVirtualization: true
      - machineFamily: c4d
        spot: true
        enableNestedVirtualization: true
      nodePoolConfig:
        imageType: "cos_containerd"
      nodePoolAutoCreation:
        enabled: true
      whenUnsatisfiable: DoNotScaleUp
    

    이 ComputeClass 예시에는 다음과 같은 속성이 있습니다.

    • 스팟 VM의 C3 인스턴스를 우선시하고, 주문형 C4 인스턴스로 대체한 후 스팟 VM의 C4D 인스턴스로 대체합니다.
    • 모든 인스턴스에 대해 중첩된 가상화를 사용 설정합니다.
    • 우선순위 인스턴스를 사용할 수 없는 경우 GKE가 클러스터 기본 머신 시리즈를 확장하지 못하도록 합니다.
    • 모든 노드에 Container-Optimized OS 노드 이미지를 사용합니다.
    • 노드 풀 자동 생성을 사용 설정하여 GKE가 필요할 때 포드를 실행할 새 노드 풀을 만들 수 있도록 합니다.

    또는 ComputeClass의 모든 우선순위 규칙 에 대해 중첩된 가상화를 사용 설정할 수 있습니다. enableNestedVirtualization: true 필드에서 spec.priorityDefaults 필드를 지정합니다.

  2. ComputeClass를 만듭니다.

    kubectl apply -f nested-virt-class.yaml
    

    ComputeClass에서 중첩된 가상화를 사용 설정하면 GKE는 지정된 머신 시리즈가 중첩된 VM과 호환되는지 확인합니다. 중첩된 가상화를 사용 설정하는 우선순위 규칙의 머신 시리즈가 호환되지 않으면 GKE에서 경고를 표시합니다. 하지만 이 검사에서는 호환되지 않는 모든 구성을 찾지 못할 수 있습니다.

  3. 노드 풀 생성을 트리거하려면 ComputeClass를 선택하는 포드를 만듭니다.

    1. 다음 포드 매니페스트를 nested-virt-example-pod.yaml이라는 파일로 저장합니다.

      apiVersion: v1
      kind: Pod
      metadata:
        name: nested-virt-example-pod
      spec:
        nodeSelector:
          cloud.google.com/compute-class: nested-virt-class
        containers:
        - name: example-container
          image: registry.k8s.io/pause:3.9
      
    2. 포드를 만듭니다.

      kubectl apply -f nested-virt-example-pod.yaml
      

이 ComputeClass를 위해 GKE에서 만드는 노드에는 중첩된 가상화가 사용 설정되어 있습니다. 이러한 노드에서 중첩된 VM을 만드는 애플리케이션을 실행할 수 있습니다. ComputeClass를 사용하는 모든 포드는 중첩된 VM을 만들 수 있습니다. 예를 들어 노드 선택기 를 지정하여 cloud.google.com/compute-class="nested-virt-class" 이러한 노드에 Kata Containers를 설치할 수 있습니다.

Standard 노드 풀에서 사용 설정

ComputeClass를 사용하지 않으려면 다음 작업 중에 Standard 클러스터의 특정 새 노드 풀에 대해 중첩된 가상화를 수동으로 사용 설정할 수 있습니다.

  • 새 Standard 클러스터를 만들 때 기본 노드 풀에 대해 중첩된 가상화를 사용 설정합니다. 이 사용 설정은 기본 노드 풀에만 적용됩니다. GKE는 나중에 만드는 추가 노드 풀에 대해 중첩된 가상화를 자동으로 사용 설정하지 않습니다.
  • 기존 Standard 클러스터에서 새 노드 풀을 만들 때.

수동으로 만든 노드 풀에서 중첩된 가상화를 사용 설정하려면 다음 옵션 중 하나를 선택합니다.

콘솔

  • 새 클러스터의 기본 노드 풀에 대해 중첩된 가상화를 사용 설정합니다.

    1. Google Cloud 콘솔에서 Kubernetes 클러스터 만들기 페이지로 이동합니다.

      Kubernetes 클러스터 만들기로 이동

    2. 클러스터의 기본 설정을 구성합니다.
    3. 탐색 메뉴의 노드 풀 섹션에서 default-pool 섹션을 펼치고 노드 를 클릭합니다.
    4. 머신 구성 섹션에서 지원되는 머신 유형 (중첩된 가상화 행)을 선택합니다.
    5. 예약 섹션에서 중첩된 가상화 사용 설정 체크박스를 선택합니다.
    6. 만들기 를 클릭하여 클러스터를 만듭니다.
  • 기존 클러스터의 새 노드 풀에 대해 중첩된 가상화를 사용 설정합니다.

    1. Google Cloud 콘솔에서 Kubernetes 클러스터 페이지로 이동합니다.

      Kubernetes 클러스터로 이동

    2. 새 노드 풀을 만들 클러스터의 이름을 클릭합니다.

    3. 노드 풀을 구성합니다.

    4. 노드 탭을 클릭합니다.

    5. 노드 풀 섹션의 제목에서 사용자 관리형 노드 풀 만들기 를 클릭합니다.

    6. 탐색 메뉴에서 노드 를 선택합니다.

    7. 머신 구성 섹션에서 중첩된 가상화를 지원하는 머신 시리즈를 선택합니다. 자세한 내용은 머신 시리즈 비교표 에서 중첩된 가상화 속성을 필터링하세요.

    8. 중첩된 가상화 사용 설정 체크박스를 선택합니다. 이 체크박스가 사용 중지되어 있으면 중첩된 가상화를 지원하는 머신 시리즈를 선택했는지 확인합니다.

    9. 만들기 를 클릭합니다.

gcloud

  • 새 클러스터의 기본 노드 풀에 대해 중첩된 가상화를 사용 설정합니다.

    gcloud container clusters create CLUSTER_NAME \
        --location=CONTROL_PLANE_LOCATION
        --enable-nested-virtualization \
        --node-labels=nested-virtualization=enabled \
        --machine-type=MACHINE_TYPE
    

    다음을 바꿉니다.

    • CLUSTER_NAME: 클러스터의 이름입니다.
    • CONTROL_PLANE_LOCATION: 클러스터의 컨트롤 플레인 리전 또는 영역입니다.
    • MACHINE_TYPE: 중첩된 가상화를 지원하는 머신 유형(예: n4-standard-8)입니다. 자세한 내용은 머신 시리즈 비교표에서 **중첩된 가상화** 속성을 필터링하세요.
  • 기존 클러스터의 새 노드 풀에 대해 중첩된 가상화를 사용 설정합니다.

    gcloud container node-pools create NODEPOOL_NAME \
        --enable-nested-virtualization \
        --node-labels=nested-virtualization=enabled \
        --cluster=CLUSTER_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --machine-type=MACHINE_TYPE
    

    다음을 바꿉니다.

    • NODEPOOL_NAME: 노드 풀의 이름입니다.
    • CLUSTER_NAME: 기존 클러스터의 이름입니다.
    • CONTROL_PLANE_LOCATION: 클러스터의 컨트롤 플레인 위치입니다.
    • MACHINE_TYPE: 중첩된 가상화를 지원하는 머신 유형(예: n4-standard-8)입니다. 자세한 내용은 머신 시리즈 비교표에서 **중첩된 가상화** 속성을 필터링하세요.

클러스터 또는 노드 풀을 만든 후 중첩된 가상화가 사용 설정되어 있는지 확인할 수 있습니다. 이러한 노드 풀의 노드에는 nested-virtualization=enabled Kubernetes 노드 라벨이 있으며, 이를 사용하여 중첩된 VM을 만드는 포드를 예약할 수 있습니다.

중첩된 가상화를 지원하는 노드에 포드 예약

중첩된 가상화가 사용 설정된 노드에서 포드를 예약하려면 다음 노드 선택기를 사양에 추가합니다.

nodeSelector:
  nested-virtualization: enabled

또한 포드를 중첩된 VM과 연결하려면 securityContext.privileged:true를 구성하여 포드를 권한이 있는 포드로 설정해야 합니다.

다음 단계