이 문서는 베어메탈용 GKE를 실행하는 애플리케이션 소유자와 플랫폼 관리자를 대상으로 합니다. 이 문서에서는 Google Distributed Cloud용 VM 런타임을 사용하는 VM의 어피니티 및 안티-어피니티와 같은 예약 구성을 사용하는 방법을 설명합니다.
시작하기 전에
이 문서를 완료하려면 다음 리소스에 대해 액세스 권한이 필요합니다.
- 베어메탈용 GKE 버전 1.12.0(
anthosBareMetalVersion: 1.12.0
) 이상 클러스터에 대한 액세스 권한. 워크로드 실행이 가능한 모든 클러스터 유형을 사용할 수 있습니다. 필요한 경우 Compute Engine에서 베어메탈용 GKE를 사용하거나 클러스터 만들기 개요를 참조하세요. kubectl
의 플러그인으로 설치되는virtctl
클라이언트 도구. 필요한 경우 virtctl 클라이언트 도구를 설치합니다.
일정 구성 개요
예약 구성은 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을 예약할 수 없습니다.
원하는 편집기에서 my-scheduled-vm.yaml과 같은
VirtualMachine
매니페스트를 만듭니다.nano my-scheduled-vm.yaml
다음 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 부팅 디스크 만들기를 참조하세요.편집기에서 VM 매니페스트를 저장하고 닫습니다.
kubectl
을 사용하여 VM 및 일정 구성을 만듭니다.kubectl apply -f my-scheduled-vm.yaml
어피니티
다음 VirtualMachine
매니페스트는 유연한 일정 요구사항에 어피니티를 사용합니다. 스케줄러가 요청을 수락하려고 합니다. 스케줄러가 요청을 수락할 수 없는 경우 VM은 권장되지 않는 노드에 예약됩니다.
원하는 편집기에서 my-scheduled-vm.yaml과 같은
VirtualMachine
매니페스트를 만듭니다.nano my-scheduled-vm.yaml
다음 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 부팅 디스크 만들기를 참조하세요.편집기에서 VM 매니페스트를 저장하고 닫습니다.
kubectl
을 사용하여 VM 및 일정 구성을 만듭니다.kubectl apply -f my-scheduled-vm.yaml
특정 노드에 VM 배치 안함
특정 VM에는 특정 노드에서 실행되지 않는 워크로드가 있을 수 있습니다. 안티-어피니티 규칙을 사용하여 이러한 노드에서 VM을 예약하지 않도록 할 수 있습니다.
다음 VirtualMachine
매니페스트는 유연한 일정 요구사항에 어피니티를 사용합니다. 스케줄러가 요청을 수락하려고 합니다. 스케줄러가 요청을 수락할 수 없는 경우 VM이 부적절한 노드에 예약될 수 있습니다.
원하는 편집기에서 my-scheduled-vm.yaml과 같은
VirtualMachine
매니페스트를 만듭니다.nano my-scheduled-vm.yaml
다음 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 부팅 디스크 만들기를 참조하세요.편집기에서 VM 매니페스트를 저장하고 닫습니다.
kubectl
을 사용하여 VM 및 일정 구성을 만듭니다.kubectl apply -f my-scheduled-vm.yaml
VM을 별도로 유지
컴퓨팅 워크로드에는 프런트엔드 VM 풀과 같이 고가용성을 위해 노드 전체에 분산되어야 하는 VM이 있을 수 있습니다. VM 간 안티-어피니티 규칙을 사용하여 노드에서 VM을 함께 예약하지 않도록 할 수 있습니다.
다음 VirtualMachine
매니페스트는 유연한 일정 요구사항에 어피니티를 사용합니다. 스케줄러가 요청을 수락하려고 합니다. 스케줄러가 요청을 수락할 수 없는 경우 VM이 부적절한 노드에 예약될 수 있습니다.
원하는 편집기에서 my-scheduled-vm.yaml과 같은
VirtualMachine
매니페스트를 만듭니다.nano my-scheduled-vm.yaml
다음 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 부팅 디스크 만들기를 참조하세요.편집기에서 VM 매니페스트를 저장하고 닫습니다.
kubectl
을 사용하여 VM 및 일정 구성을 만듭니다.kubectl apply -f my-scheduled-vm.yaml
VM을 함께 유지
컴퓨팅 워크로드에는 미들웨어 및 데이터베이스 계층과 같이 지연 시간을 줄이기 위해 노드에 함께 유지해야 하는 VM이 있을 수 있습니다. VM 간 어피니티 규칙을 사용하여 노드에서 VM을 함께 예약할 수 있습니다.
다음 VirtualMachine
매니페스트는 유연한 일정 요구사항에 어피니티를 사용합니다. 스케줄러가 요청을 수락하려고 합니다. 스케줄러가 요청을 수락할 수 없는 경우 VM이 부적절한 노드에 예약될 수 있습니다.
원하는 편집기에서 my-scheduled-vm.yaml과 같은
VirtualMachine
매니페스트를 만듭니다.nano my-scheduled-vm.yaml
다음 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 부팅 디스크 만들기를 참조하세요.편집기에서 VM 매니페스트를 저장하고 닫습니다.
kubectl
을 사용하여 VM 및 일정 구성을 만듭니다.kubectl apply -f my-scheduled-vm.yaml
taint가 있는 노드에서 VM 예약
taint는 노드가 지정된 톨러레이션이 있는 VM만 실행되도록 예약할 수 있도록 하는 일정 속성입니다. 노드에 taint를 적용한 다음 VirtualMachine
매니페스트에서 톨러레이션(toleration)을 정의하여 VM이 노드에서 실행되도록 합니다. 자세한 내용은 taint 및 톨러레이션을 참조하세요.
원하는 편집기에서 my-scheduled-vm.yaml과 같은
VirtualMachine
매니페스트를 만듭니다.nano my-scheduled-vm.yaml
다음 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 부팅 디스크 만들기를 참조하세요.편집기에서 VM 매니페스트를 저장하고 닫습니다.
kubectl
을 사용하여 VM 및 일정 구성을 만듭니다.kubectl apply -f my-scheduled-vm.yaml