本文說明如何為透過 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
的值變更為您選擇的值:Reschedule
或 Ignore
。關閉文字編輯器。
覆寫 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 物件進行編輯。將 nodeHeartbeatInterval
和 nodeMonitorGracePeriod
設為您選擇的值。
spec: defaultRecoveryStrategy: Reschedule nodeHeartbeatInterval: 15s nodeMonitorGracePeriod: 1m30s