このドキュメントは、Google Distributed Cloud を実行するアプリケーション オーナーとプラットフォーム管理者を対象としています。このドキュメントでは、GDC 上の VM ランタイムを使用する VM でアフィニティやアンチ アフィニティなどのスケジュール構成を使用する方法について説明します。
始める前に
このドキュメントの内容を実施するには、次のリソースへのアクセス権が必要です。
- Google Distributed Cloud バージョン 1.12.0(
anthosBareMetalVersion: 1.12.0
)以降のクラスタへのアクセス権。ワークロードを実行可能な、どのクラスタタイプでも使用できます。必要に応じて、Compute Engine 上の Google Distributed Cloud を試すか、クラスタ作成の概要をご覧ください。 kubectl
のプラグインとしてインストールされたvirtctl
クライアント ツール。必要に応じて、virtctl クライアント ツールをインストールします。
スケジュール構成の概要
スケジュール構成とは、GDC 上の VM ランタイムのオプション値のことです。スケジューリング構成が指定されていない場合、VM はデフォルトで Kubernetes のデフォルトのスケジューリング動作になります。
デフォルトのスケジューリング動作では、VM はクラスタ全体に分散されます。スケジューラは、現在のノードリソースの可用性(CPU やメモリなど)を確認し、ノードで VM をスケジュールしてコンピューティング要求を分散します。特定の要件がない場合は、スケジュール構成を定義する必要はありません。
次の 3 つのフィールドを使用して VM をスケジュールできます。
nodeSelector
: VM のホストノードに必要なノードラベルを指定します。GDC 上の VM ランタイムは、指定されたラベルを持つノードでのみ VM のスケジュールを設定します。- アフィニティ: VM のアフィニティ ルールを指定します。これには、ノード アフィニティと VM 間のアフィニティまたはアンチアフィニティが含まれます。スケジューラにソフト要件またはハード要件を定義します。
preferredDuringSchedulingIgnoredDuringExecution
: ソフト要件です。スケジューラはリクエストを処理しようとします。スケジューラがリクエストに対応できない場合、VM は優先されないノードでスケジュールされる可能性があります。requiredDuringSchedulingIgnoredDuringExecution
: ハード要件です。スケジューラはリクエストを処理しようとします。要件を満たすノードが使用できない場合、VM はスケジュールされません。
Tolerations
: 一致する taint を持つノードに VM をスケジュールできます。
こうしたスケジューリング構成は、コンピューティングのワークロードやスケジューリングのニーズに対応するために定義できます。構成のスケジューリングに加えて、VM のスケジューリングは使用可能なリソースによって異なります。
GDC 上の VM ランタイムは、Kubernetes と同じ VM スケジューリング ロジックとマニフェスト構造を使用して、Pod をノードに割り当てます。これらのスケジューリング構成の詳細については、以下のリンクをご覧ください。
VM を特定のノードに配置する
特定のハードウェア構成のノードがある場合は、そのノードでのみ実行するように VM をスケジュールできます。たとえば、VM に特定の CPU チップセットが必要な場合や、GPU のサポートが必要な場合などです。基本的な nodeSelector
またはより柔軟なアフィニティ ルールを使用して、これらのノードで実行するように VM をスケジュールできます。
nodeSelector
次の VirtualMachine
マニフェストでは、ハード スケジューリングの要件として nodeSelector
を使用しています。スケジューリング構成を満たす使用可能なノードがない場合、VM はスケジュールされません。
選択したエディタで
VirtualMachine
マニフェスト(my-scheduled-vm.yaml など)を作成します。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 マニフェストを保存して閉じます。
VM を作成し、
kubectl
を使用して構成をスケジュールします。kubectl apply -f my-scheduled-vm.yaml
アフィニティ
次の VirtualMachine
マニフェストは、ソフト スケジューリング要件でアフィニティを使用します。スケジューラはリクエストを処理しようとします。スケジューラがリクエストに対応できない場合、VM は優先されないノードでスケジュールされます。
選択したエディタで
VirtualMachine
マニフェスト(my-scheduled-vm.yaml など)を作成します。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 マニフェストを保存して閉じます。
VM を作成し、
kubectl
を使用して構成をスケジュールします。kubectl apply -f my-scheduled-vm.yaml
特定のノードに VM を配置しない
特定の VM には、特定のノードで実行されないワークロードが存在する場合があります。これらのノードで VM のスケジューリングを避けるには、反アフィニティ ルールを使用します。
次の VirtualMachine
マニフェストは、ソフト スケジューリング要件でアフィニティを使用します。スケジューラはリクエストを処理しようとします。スケジューラがリクエストに対応できない場合は、VM が適切でないノードでスケジュール設定される可能性があります。
選択したエディタで
VirtualMachine
マニフェスト(my-scheduled-vm.yaml など)を作成します。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 マニフェストを保存して閉じます。
VM を作成し、
kubectl
を使用して構成をスケジュールします。kubectl apply -f my-scheduled-vm.yaml
VM を離す
コンピューティング ワークロードには、フロントエンド VM のプールなど、高可用性のためにノード間で分散する必要がある VM がある場合があります。VM 間の反アフィニティ ルールを使用して、ノード上で VM が一緒にスケジュールされることを回避できます。
次の VirtualMachine
マニフェストは、ソフト スケジューリング要件でアフィニティを使用します。スケジューラはリクエストを処理しようとします。スケジューラがリクエストに対応できない場合は、VM が適切でないノードでスケジュール設定される可能性があります。
選択したエディタで
VirtualMachine
マニフェスト(my-scheduled-vm.yaml など)を作成します。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 マニフェストを保存して閉じます。
VM を作成し、
kubectl
を使用して構成をスケジュールします。kubectl apply -f my-scheduled-vm.yaml
VM をまとめる
コンピューティング ワークロードには、ミドルウェアやデータベース階層など、レイテンシを減らすためにノードでまとめて保持する必要がある VM が存在する場合があります。VM 間のアフィニティ ルールを使用して、ノードでまとめて VM をスケジュールできます。
次の VirtualMachine
マニフェストは、ソフト スケジューリング要件でアフィニティを使用します。スケジューラはリクエストを処理しようとします。スケジューラがリクエストに対応できない場合は、VM が適切でないノードでスケジュール設定される可能性があります。
選択したエディタで
VirtualMachine
マニフェスト(my-scheduled-vm.yaml など)を作成します。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 マニフェストを保存して閉じます。
VM を作成し、
kubectl
を使用して構成をスケジュールします。kubectl apply -f my-scheduled-vm.yaml
taint が設定されているノードで VM をスケジュールする
taint は、ノードが特定の容認機能を持つ VM のみを実行するようにスケジュールできるスケジューリング プロパティです。ノードに taint を適用すると、VirtualMachine
マニフェストでノードを VM で実行させる容認機能を定義します。詳しくは、taint と容認をご覧ください。
選択したエディタで
VirtualMachine
マニフェスト(my-scheduled-vm.yaml など)を作成します。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 と一致する容認機能のキー名。KEY_VALUE
: ノードの taint と一致する容認機能のキーの値。
VM_NAME-boot-dv
という名前のブートディスクがすでに存在している必要があります。詳細については、VM ブートディスクを作成するをご覧ください。エディタで、VM マニフェストを保存して閉じます。
VM を作成し、
kubectl
を使用して構成をスケジュールします。kubectl apply -f my-scheduled-vm.yaml