Google Distributed Cloud용 VM 런타임을 사용하는 VM 예약

이 문서는 베어메탈용 GKE를 실행하는 애플리케이션 소유자와 플랫폼 관리자를 대상으로 합니다. 이 문서에서는 Google Distributed Cloud용 VM 런타임을 사용하는 VM의 어피니티 및 안티-어피니티와 같은 예약 구성을 사용하는 방법을 설명합니다.

시작하기 전에

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

일정 구성 개요

예약 구성은 Google Distributed Cloud용 VM 런타임에서 선택 사항인 값입니다. 일정 구성이 지정되지 않으면 VM이 기본적으로 Kubernetes 기본 예약 동작으로 설정됩니다.

기본 예약 동작으로 VM이 클러스터 전체에 분산됩니다. 스케줄러는 CPU 및 메모리와 같은 현재 노드 리소스 가용성을 확인하고 노드에서 VM을 예약하여 컴퓨팅 수요를 분산합니다. 특정 요구사항이 없으면 일정 구성을 정의할 필요가 없습니다.

다음 세 가지 필드를 사용하여 VM을 예약할 수 있습니다.

  • nodeSelector: VM의 호스트 노드에 있어야 하는 노드 라벨을 지정합니다. Google Distributed Cloud용 VM 런타임은 지정된 라벨이 있는 노드에만 VM을 예약합니다.
  • 어피니티: VM의 어피니티 규칙을 지정합니다. 여기에는 노드 어피니티 및 VM 간 어피니티 또는 안티-어피니티가 포함됩니다. 스케줄러의 유연하거나 엄격한 요구사항을 정의합니다.
    • preferredDuringSchedulingIgnoredDuringExecution: 유연한 요구사항입니다. 스케줄러가 요청을 수락하려고 합니다. 스케줄러가 요청을 수락할 수 없는 경우 VM이 권장되지 않는 노드에 예약될 수 있습니다.
    • requiredDuringSchedulingIgnoredDuringExecution: 엄격한 요구사항입니다. 스케줄러가 요청을 수락하려고 합니다. 요구사항에 맞는 노드가 없으면 VM이 예약되지 않습니다.
  • Tolerations: 일치하는 taint가 있는 노드에 VM을 예약할 수 있습니다.

이러한 일정 구성을 정의하여 컴퓨팅 워크로드 및 예약 요구사항을 지원할 수 있습니다. VM 예약은 일정 구성 외에도 사용 가능한 리소스에 따라 다릅니다.

Google Distributed Cloud용 VM 런타임은 Kubernetes와 동일한 VM 예약 로직 및 매니페스트 구조를 사용하여 노드에 포드를 할당합니다. 이러한 일정 구성에 대한 자세한 내용은 다음 링크를 참조하세요.

특정 노드에 VM 배치

특정 하드웨어 구성이 있는 노드가 있다면 이러한 노드에서만 실행되도록 VM을 예약할 수 있습니다. 예를 들어 VM에 특정 CPU 칩셋이 필요하거나 GPU 지원이 필요할 수 있습니다. 기본 nodeSelector 또는 보다 유연한 어피니티 규칙을 사용하여 이러한 노드에서 VM이 실행되도록 예약할 수 있습니다.

nodeSelector

다음 VirtualMachine 매니페스트는 엄격한 일정 요구사항에 nodeSelector를 사용합니다. 일정 구성을 충족하는 노드가 없으면 VM을 예약할 수 없습니다.

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

    nano my-scheduled-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:
        - virtualMachineDiskName: VM_NAME-boot-dv
          boot: true
      scheduling:
        nodeSelector:
          kubernetes.io/hostname: NODE_NAME
    

    다음 값을 바꿉니다.

    • VM_NAME: VM의 이름입니다.
    • NODE_NAME: VM을 예약하려는 노드입니다.

    이름이 VM_NAME-boot-dv인 부팅 디스크가 이미 있어야 합니다. 자세한 내용은 VM 부팅 디스크 만들기를 참조하세요.

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

  4. kubectl을 사용하여 VM 및 일정 구성을 만듭니다.

    kubectl apply -f my-scheduled-vm.yaml
    

어피니티

다음 VirtualMachine 매니페스트는 유연한 일정 요구사항에 어피니티를 사용합니다. 스케줄러가 요청을 수락하려고 합니다. 스케줄러가 요청을 수락할 수 없는 경우 VM은 권장되지 않는 노드에 예약됩니다.

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

    nano my-scheduled-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:
        - virtualMachineDiskName: VM_NAME-boot-dv
          boot: true
      scheduling:
          affinity:
            nodeAffinity:
              preferredDuringSchedulingIgnoredDuringExecution:
              - weight: 100
                preference:
                  matchExpressions:
                  - key: kubernetes.io/hostname
                    operator: In
                    values:
                    - NODE_NAME
    

    다음 값을 바꿉니다.

    • VM_NAME: VM의 이름입니다.
    • NODE_NAME: VM을 예약하려는 노드입니다.

    이름이 VM_NAME-boot-dv인 부팅 디스크가 이미 있어야 합니다. 자세한 내용은 VM 부팅 디스크 만들기를 참조하세요.

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

  4. kubectl을 사용하여 VM 및 일정 구성을 만듭니다.

    kubectl apply -f my-scheduled-vm.yaml
    

특정 노드에 VM 배치 안함

특정 VM에는 특정 노드에서 실행되지 않는 워크로드가 있을 수 있습니다. 안티-어피니티 규칙을 사용하여 이러한 노드에서 VM을 예약하지 않도록 할 수 있습니다.

다음 VirtualMachine 매니페스트는 유연한 일정 요구사항에 어피니티를 사용합니다. 스케줄러가 요청을 수락하려고 합니다. 스케줄러가 요청을 수락할 수 없는 경우 VM이 부적절한 노드에 예약될 수 있습니다.

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

    nano my-scheduled-vm.yaml
    
  2. 다음 YAML 매니페스트를 복사하여 붙여넣습니다.

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachine
    metadata:
      name: VVM_NAME
    spec:
      interfaces:
        - name: eth0
          networkName: pod-network
          default: true
      disks:
        - virtualMachineDiskName: VM_NAME-boot-dv
          boot: true
      scheduling:
        affinity:
          nodeAffinity:
            preferredDuringSchedulingIgnoredDuringExecution:
            - weight: 100
              preference:
                matchExpressions:
                - key: kubernetes.io/hostname
                  operator: NotIn
                  values:
                  - NODE_NAME
    

    다음 값을 바꿉니다.

    • VM_NAME: VM의 이름입니다.
    • NODE_NAME: VM을 예약하려는 노드입니다.

    이름이 VM_NAME-boot-dv인 부팅 디스크가 이미 있어야 합니다. 자세한 내용은 VM 부팅 디스크 만들기를 참조하세요.

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

  4. kubectl을 사용하여 VM 및 일정 구성을 만듭니다.

    kubectl apply -f my-scheduled-vm.yaml
    

VM을 별도로 유지

컴퓨팅 워크로드에는 프런트엔드 VM 풀과 같이 고가용성을 위해 노드 전체에 분산되어야 하는 VM이 있을 수 있습니다. VM 간 안티-어피니티 규칙을 사용하여 노드에서 VM을 함께 예약하지 않도록 할 수 있습니다.

다음 VirtualMachine 매니페스트는 유연한 일정 요구사항에 어피니티를 사용합니다. 스케줄러가 요청을 수락하려고 합니다. 스케줄러가 요청을 수락할 수 없는 경우 VM이 부적절한 노드에 예약될 수 있습니다.

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

    nano my-scheduled-vm.yaml
    
  2. 다음 YAML 매니페스트를 복사하여 붙여넣습니다.

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachine
    metadata:
      name: VM_NAME
      labels:
        KEY:VALUE
    spec:
      interfaces:
        - name: eth0
          networkName: pod-network
          default: true
      disks:
        - virtualMachineDiskName: VM_NAME-boot-dv
          boot: true
      scheduling:
        affinity:
          podAntiAffinity:
            preferredDuringSchedulingIgnoredDuringExecution:
            - weight: 100
              podAffinityTerm:
                topologyKey: kubernetes.io/hostname
                labelSelector:
                  matchLabels:
                    KEY:VALUE
    

    다음 값을 바꿉니다.

    • VM_NAME: VM의 이름입니다.
    • KEY:VALUE: 여러 노드에서 예약하려는 VM에 적용할 key:value 라벨입니다. 자세한 내용은 라벨 및 선택기를 참조하세요.

    이름이 VM_NAME-boot-dv인 부팅 디스크가 이미 있어야 합니다. 자세한 내용은 VM 부팅 디스크 만들기를 참조하세요.

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

  4. kubectl을 사용하여 VM 및 일정 구성을 만듭니다.

    kubectl apply -f my-scheduled-vm.yaml
    

VM을 함께 유지

컴퓨팅 워크로드에는 미들웨어 및 데이터베이스 계층과 같이 지연 시간을 줄이기 위해 노드에 함께 유지해야 하는 VM이 있을 수 있습니다. VM 간 어피니티 규칙을 사용하여 노드에서 VM을 함께 예약할 수 있습니다.

다음 VirtualMachine 매니페스트는 유연한 일정 요구사항에 어피니티를 사용합니다. 스케줄러가 요청을 수락하려고 합니다. 스케줄러가 요청을 수락할 수 없는 경우 VM이 부적절한 노드에 예약될 수 있습니다.

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

    nano my-scheduled-vm.yaml
    
  2. 다음 YAML 매니페스트를 복사하여 붙여넣습니다.

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachine
    metadata:
      name: VM_NAME
      labels:
        KEY:VALUE
    spec:
      interfaces:
        - name: eth0
          networkName: pod-network
          default: true
      disks:
        - virtualMachineDiskName: VM_NAME-boot-dv
          boot: true
      scheduling:
        affinity:
          podAffinity:
            preferredDuringSchedulingIgnoredDuringExecution
            - podAffinityTerm:
                topologyKey: kubernetes.io/hostname
                labelSelector:
                  matchLabels:
                    KEY:VALUE
              weight: 100
    

    다음 값을 바꿉니다.

    • VM_NAME: VM의 이름입니다.
    • KEY:VALUE: 여러 노드에서 예약하려는 VM에 적용할 key:value 라벨 쌍입니다. 자세한 내용은 라벨 및 선택기를 참조하세요.

    이름이 VM_NAME-boot-dv인 부팅 디스크가 이미 있어야 합니다. 자세한 내용은 VM 부팅 디스크 만들기를 참조하세요.

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

  4. kubectl을 사용하여 VM 및 일정 구성을 만듭니다.

    kubectl apply -f my-scheduled-vm.yaml
    

taint가 있는 노드에서 VM 예약

taint는 노드가 지정된 톨러레이션이 있는 VM만 실행되도록 예약할 수 있도록 하는 일정 속성입니다. 노드에 taint를 적용한 다음 VirtualMachine 매니페스트에서 톨러레이션(toleration)을 정의하여 VM이 노드에서 실행되도록 합니다. 자세한 내용은 taint 및 톨러레이션을 참조하세요.

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

    nano my-scheduled-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:
        - virtualMachineDiskName: VM_NAME-boot-dv
          boot: true
      scheduling:
        tolerations:
        - key: KEY_NAME
          operator: "Equal"
          value: KEY_VALUE
          effect: "NoSchedule"
    

    다음 값을 바꿉니다.

    • VM_NAME: VM의 이름입니다.
    • KEY_NAME: 노드의 taint와 일치하는 톨러레이션(toleration)의 키 이름입니다.
    • KEY_VALUE: 노드의 taint와 일치하는 톨러레이션(toleration)의 키 값입니다.

    이름이 VM_NAME-boot-dv인 부팅 디스크가 이미 있어야 합니다. 자세한 내용은 VM 부팅 디스크 만들기를 참조하세요.

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

  4. kubectl을 사용하여 VM 및 일정 구성을 만듭니다.

    kubectl apply -f my-scheduled-vm.yaml
    

다음 단계