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

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

GKE에서 중첩 VM 작동 방식

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

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

  • Kata Containers와 같은 경량 VM에서 AI 에이전트와 같은 신뢰할 수 없는 코드를 실행합니다. 이 사용 사례에 대한 자세한 내용은 GKE 에이전트 Sandbox와 함께 오픈소스 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에서 변경할 수 없는 설정입니다.

  • ComputeClasses를 사용하여 중첩 가상화를 사용 설정하는 경우 클러스터에서 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가 필요할 때 포드를 실행할 새 노드 풀을 만들 수 있도록 노드 풀 자동 생성을 사용 설정합니다.

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

  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 클러스터의 특정 새 노드 풀에 대해 중첩된 가상화를 수동으로 사용 설정하면 됩니다.

  • 기본 노드 풀에 중첩된 가상화를 사용 설정하는 새 표준 클러스터를 만드는 경우 이 사용 설정은 기본 노드 풀에만 적용됩니다. 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를 구성하여 포드를 권한이 있는 포드로 설정해야 합니다.

다음 단계