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

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

Anthos 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