為 VM 設定高可用性政策

本文說明如何為透過 GDC 上的 VM 執行階段執行的虛擬機器 (VM) 設定高可用性政策。

在 GDC 上啟用 VM 執行階段時,叢集會建立名為 default 的 VMHighAvailabilityPolicy 物件。這個物件會指定叢集節點執行 VM 時發生故障的預設復原策略。可能的預設復原策略包括:

  • 重新排程:在另一個叢集節點上重新排程 VM。
  • 忽略:不採取任何行動。

預設復原策略一開始會設為 Reschedule

在下列情況中,預設的 Reschedule 復原策略適用:

  • 叢集至少有兩個工作站節點。

  • 系統會使用以網路檔案為基礎的儲存空間類別,佈建 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 的值變更為您選擇的值:RescheduleIgnore。關閉文字編輯器。

覆寫 VM 的預設復原策略

預設復原策略會套用至叢集中執行的所有 VM。 不過,您可能需要覆寫個別 VM 的預設復原策略。

舉例來說,假設您的大部分 VM 都是以網路檔案型儲存空間類別佈建,但有少數 VM 是以區塊型儲存空間類別佈建。對於使用以區塊為基礎的儲存空間的每個 VM,我們建議您將個別 VM 的復原策略設為 Ignore,藉此覆寫預設復原策略。

如要覆寫 VM 的預設復原策略,請將 vm.cluster.gke.io/vm-ha-recovery-strategy 註解新增至 VirtualMachineInstance (VMI) 物件和 GVM 物件。

舉例來說,下列指令會將名為 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 伺服器造成無法接受的負載。

請將心跳間隔設為低於寬限期,以免單一心跳遺漏就導致節點遭判定為健康狀態不良。

執行 kubectl edit,開啟 VMHighAvailabilityPolicy 物件進行編輯。將 nodeHeartbeatIntervalnodeMonitorGracePeriod 設為您選擇的值。

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