Google Distributed Cloud 上の VM ランタイムを使用する VM をスケジュールする

このドキュメントは、ベアメタル版 GKE を実行するアプリケーション オーナーとプラットフォーム管理者を対象としています。このドキュメントでは、Google Distributed Cloud 上の VM ランタイムを使用する VM でアフィニティや反アフィニティなどのスケジュール構成を使用する方法について説明します。

準備

このドキュメントの内容を実施するには、次のリソースへのアクセス権が必要です。

スケジュール構成の概要

スケジュール構成は Google Distributed Cloud 上の VM ランタイムのオプション値です。スケジューリング構成が指定されていない場合、VM はデフォルトで Kubernetes のデフォルトのスケジューリング動作になります。

デフォルトのスケジューリング動作では、VM はクラスタ全体に分散されます。スケジューラは、現在のノードリソースの可用性(CPU やメモリなど)を確認し、ノードで VM をスケジュールしてコンピューティング要求を分散します。特定の要件がない場合は、スケジュール構成を定義する必要はありません。

次の 3 つのフィールドを使用して VM をスケジュールできます。

  • nodeSelector: VM のホストノードに必要なノードラベルを指定します。Google Distributed Cloud 上の VM ランタイムは、指定されたラベルを持つノードでのみ VM のスケジュールを設定します。
  • アフィニティ: VM のアフィニティ ルールを指定します。これには、ノード アフィニティと VM 間のアフィニティまたはアンチアフィニティが含まれます。スケジューラにソフト要件またはハード要件を定義します。
    • preferredDuringSchedulingIgnoredDuringExecution: ソフト要件です。スケジューラはリクエストを処理しようとします。スケジューラがリクエストに対応できない場合、VM は優先されないノードでスケジュールされる可能性があります。
    • requiredDuringSchedulingIgnoredDuringExecution: ハード要件です。スケジューラはリクエストを処理しようとします。要件を満たすノードが使用できない場合、VM はスケジュールされません。
  • Tolerations: 一致する taint を持つノードに VM をスケジュールできます。

こうしたスケジューリング構成は、コンピューティングのワークロードやスケジューリングのニーズに対応するために定義できます。構成のスケジューリングに加えて、VM のスケジューリングは使用可能なリソースによって異なります。

Google Distributed Cloud 上の VM ランタイムは、Kubernetes と同じ VM スケジューリング ロジックとマニフェスト構造を使用して、Pod をノードに割り当てます。これらのスケジューリング構成の詳細については、以下のリンクをご覧ください。

VM を特定のノードに配置する

特定のハードウェア構成のノードがある場合は、そのノードでのみ実行するように VM をスケジュールできます。たとえば、VM に特定の CPU チップセットが必要な場合や、GPU のサポートが必要な場合などです。基本的な nodeSelector またはより柔軟なアフィニティ ルールを使用して、これらのノードで実行するように VM をスケジュールできます。

nodeSelector

次の VirtualMachine マニフェストでは、ハード スケジューリングの要件として nodeSelector を使用しています。スケジューリング構成を満たす使用可能なノードがない場合、VM はスケジュールされません。

  1. 選択したエディタで VirtualMachine マニフェスト(my-scheduled-vm.yaml など)を作成します。

    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. VM を作成し、kubectl を使用して構成をスケジュールします。

    kubectl apply -f my-scheduled-vm.yaml
    

アフィニティ

次の VirtualMachine マニフェストは、ソフト スケジューリング要件でアフィニティを使用します。スケジューラはリクエストを処理しようとします。スケジューラがリクエストに対応できない場合、VM は優先されないノードでスケジュールされます。

  1. 選択したエディタで VirtualMachine マニフェスト(my-scheduled-vm.yaml など)を作成します。

    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. VM を作成し、kubectl を使用して構成をスケジュールします。

    kubectl apply -f my-scheduled-vm.yaml
    

特定のノードに VM を配置しない

特定の VM には、特定のノードで実行されないワークロードが存在する場合があります。これらのノードで VM のスケジューリングを避けるには、反アフィニティ ルールを使用します。

次の VirtualMachine マニフェストは、ソフト スケジューリング要件でアフィニティを使用します。スケジューラはリクエストを処理しようとします。スケジューラがリクエストに対応できない場合は、VM が適切でないノードでスケジュール設定される可能性があります。

  1. 選択したエディタで VirtualMachine マニフェスト(my-scheduled-vm.yaml など)を作成します。

    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. VM を作成し、kubectl を使用して構成をスケジュールします。

    kubectl apply -f my-scheduled-vm.yaml
    

VM を離す

コンピューティング ワークロードには、フロントエンド VM のプールなど、高可用性のためにノード間で分散する必要がある VM がある場合があります。VM 間の反アフィニティ ルールを使用して、ノード上で VM が一緒にスケジュールされることを回避できます。

次の VirtualMachine マニフェストは、ソフト スケジューリング要件でアフィニティを使用します。スケジューラはリクエストを処理しようとします。スケジューラがリクエストに対応できない場合は、VM が適切でないノードでスケジュール設定される可能性があります。

  1. 選択したエディタで VirtualMachine マニフェスト(my-scheduled-vm.yaml など)を作成します。

    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. VM を作成し、kubectl を使用して構成をスケジュールします。

    kubectl apply -f my-scheduled-vm.yaml
    

VM をまとめる

コンピューティング ワークロードには、ミドルウェアやデータベース階層など、レイテンシを減らすためにノードでまとめて保持する必要がある VM が存在する場合があります。VM 間のアフィニティ ルールを使用して、ノードでまとめて VM をスケジュールできます。

次の VirtualMachine マニフェストは、ソフト スケジューリング要件でアフィニティを使用します。スケジューラはリクエストを処理しようとします。スケジューラがリクエストに対応できない場合は、VM が適切でないノードでスケジュール設定される可能性があります。

  1. 選択したエディタで VirtualMachine マニフェスト(my-scheduled-vm.yaml など)を作成します。

    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. VM を作成し、kubectl を使用して構成をスケジュールします。

    kubectl apply -f my-scheduled-vm.yaml
    

taint が設定されているノードで VM をスケジュールする

taint は、ノードが特定の容認機能を持つ VM のみを実行するようにスケジュールできるスケジューリング プロパティです。ノードに taint を適用すると、VirtualMachine マニフェストでノードを VM で実行させる容認機能を定義します。詳しくは、taint と容認をご覧ください。

  1. 選択したエディタで VirtualMachine マニフェスト(my-scheduled-vm.yaml など)を作成します。

    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 と一致する容認機能のキー名。
    • KEY_VALUE: ノードの taint と一致する容認機能のキーの値。

    VM_NAME-boot-dv という名前のブートディスクがすでに存在している必要があります。詳細については、VM ブートディスクを作成するをご覧ください。

  3. エディタで、VM マニフェストを保存して閉じます。

  4. VM を作成し、kubectl を使用して構成をスケジュールします。

    kubectl apply -f my-scheduled-vm.yaml
    

次のステップ