VM の高可用性ポリシーを構成する

このドキュメントでは、GDC 上の VM ランタイムを使用して動作する仮想マシン(VM)の高可用性ポリシーを構成する方法について説明します。

GDC 上の VM ランタイムを有効にすると、クラスタは default という名前の VMHighAvailabilityPolicy オブジェクトを作成します。このオブジェクトは、VM を実行しているクラスタノードで障害が発生した場合のデフォルトの復元戦略を指定します。考えられるデフォルトの復元戦略は次のとおりです。

  • Reschedule: 別のクラスタノードで VM を再スケジュールします。
  • Ignore: 何もしません。

最初は、デフォルトの復元戦略は Reschedule に設定されています。

次の状況では、Reschedule のデフォルトの復元戦略が適しています。

  • クラスタに 2 つ以上のワーカーノードがある。

  • VM ディスクは、ネットワーク ファイルベースのストレージ クラスを使用してプロビジョニングされる。つまり、ストレージ クラスは、異なるクライアント間で POSIX ファイルロックを調整するネットワーク ファイル システムに基づいている。ネットワーク ファイル システム(NFS)は、ネットワーク ファイルベースのストレージ クラスの例です。

VM がローカル ストレージまたはブロックベースのストレージ システムを使用している場合、デフォルトの復元戦略を Ignore に設定することをおすすめします。これをおすすめするのは、以下の理由からです。

  • VM でローカル ストレージを使用していてノードに障害が発生した場合は、保存されたデータを復旧して新しいノードに移動する方法はありません。

  • VM でブロックベースのストレージ システムが使用している場合は、ストレージに分離の保証が十分にない可能性があります。その結果、VM のスケジューリング中に同時ディスク アクセスが発生し、データ破損が起きる可能性があります。

VMHighAvailabilityPolicy オブジェクトを調べる

VMHighAvailabilityPolicy オブジェクトが存在することを確認します。

kubectl --kubeconfig USER_CLUSTER_KUBECONFIG get VMHighAvailabilityPolicy --namespace vm-system

USER_CLUSTER_KUBECONFIG は、ユーザー クラスタ kubeconfig ファイルのパスに置き換えます。

出力には、default という名前の VMHighAvailabilityPolicy オブジェクトが存在することが示されます。出力には、defaultRecoveryStrategy の現在値も表示されます。たとえば、次の出力は、defaultRecoveryStrategy の現在の値が Reschedule であることを示しています。

vm-system   default   5m55s   Reschedule   15s   1m30s

VMHighAvailabilityPolicy オブジェクトの詳細ビューを取得します。

kubectl --kubeconfig USER_CLUSTER_KUBECONFIG get VMHighAvailabilityPolicy \
    --namespace vm-system --output yaml

出力例:

apiVersion: vm.cluster.gke.io/v1alpha1
kind: VMHighAvailabilityPolicy
metadata:
  ...
  labels:
    app.kubernetes.io/component: kubevirt
    app.kubernetes.io/managed-by: virt-operator
    kubevirt.io: virt-api
  name: default
  namespace: vm-system
  ..
spec:
  defaultRecoveryStrategy: Reschedule
  nodeHeartbeatInterval: 15s
  nodeMonitorGracePeriod: 1m30s

デフォルトの復元戦略を変更する

状況によっては、デフォルトの復元戦略を変更することをおすすめします。たとえば、VM でローカル ストレージまたはネットワークファイルベース以外のファイル システムを使用している場合は、defaultRecoveryStrategy の値を Ignore に変更することをおすすめします。

defaultRecoveryStrategy の値を変更するには、VMHighAvailabilityPolicy オブジェクトを開いて編集します。

kubectl --kubeconfig USER_CLUSTER_KUBECONFIG edit VMHighAvailabilityPolicy \
    default --namespace vm-system

テキスト エディタで、defaultRecoveryStrategy の値を Reschedule または Ignore のいずれかの値に変更します。テキスト エディタを閉じます。

VM のデフォルトの復元戦略をオーバーライドする

デフォルトの復元戦略は、クラスタ内で実行されているすべての VM に適用されます。ただし、個々の VM のデフォルトの復元戦略のオーバーライドが必要な場合もあります。

たとえば、ほとんどの VM がネットワークファイルベースのストレージ クラスでプロビジョニングされているものの、一部の VM はブロックベースのストレージ クラスでプロビジョニングされているとします。ブロックベースのストレージを使用する VM ごとに、個々の VM の復元戦略を Ignore に設定して、デフォルトの復元戦略をオーバーライドすることをおすすめします。

VM のデフォルトの復元戦略をオーバーライドするには、VirtualMachineInstance(VMI)オブジェクトと GVM オブジェクトの両方に vm.cluster.gke.io/vm-ha-recovery-strategy アノテーションを追加します。

たとえば、次のコマンドは、my-vm という名前の VM の復元戦略を Ignore に設定します。

kubectl --kubeconfig USER_CLUSTER_KUBECONFIG \
  annotate vmi my-vm \
  vm.cluster.gke.io/vm-ha-recovery-strategy=Ignore --overwrite

kubectl --kubeconfig USER_CLUSTER_KUBECONFIG \
  annotate gvm my-vm \
  vm.cluster.gke.io/vm-ha-recovery-strategy=Ignore --overwrite

後でアノテーションを削除する必要がある場合は、アノテーション名の末尾にハイフンを使用します。例:

kubectl --kubeconfig USER_CLUSTER_KUBECONFIG \
  annotate vmi my-vm \
  vm.cluster.gke.io/vm-ha-recovery-strategy-

kubectl --kubeconfig USER_CLUSTER_KUBECONFIG \
  annotate gvm my-vm \
  vm.cluster.gke.io/vm-ha-recovery-strategy-

詳細構成

デフォルトの復元戦略を構成するだけでなく、次のように構成できます。

  • ノード ハートビート間隔: 各クラスタノードごとに送信されるハートビートの間隔

  • ノードモニターの猶予期間: ノードがハートビートを送信できず、異常であると判断されるまでの最大時間

ほとんどの場合、ハートビート間隔と猶予期間はデフォルト値で十分です。ただし、復元速度とオーバーヘッドのトレードオフを微調整したい場合は、これらの値を調整することもできます。ハートビート間隔を短くすると復元時間は短くなりますが、オーバーヘッドも増加します。大規模なクラスタで多数のノードからのハートビートが頻繁に発生すると、Kubernetes API サーバーに許容できない負荷がかかる可能性があるため、ハートビート間隔を長くすることを選択する場合があります。

1 回のハートビートの欠落でノードが異常と判断されるのを避けるために、ハートビート間隔は猶予期間よりも短くします。

kubectl edit を実行して、VMHighAvailabilityPolicy オブジェクトを編集用に開きます。nodeHeartbeatIntervalnodeMonitorGracePeriod を任意の値に設定します。

spec:
  defaultRecoveryStrategy: Reschedule
  nodeHeartbeatInterval: 15s
  nodeMonitorGracePeriod: 1m30s