GDC 的 VM 執行階段高可用性政策,可讓您管理叢集節點故障時,虛擬機器 (VM) 的復原方式。使用這些政策,有助於在主機意外中斷時,維持工作負載運作時間。
在 GDC 啟用 VM Runtime 時,叢集會建立名為 default 的 VMHighAvailabilityPolicy 物件。這個物件會定義叢集是否自動在另一個叢集節點上重新排定 VM (Reschedule),或不採取任何動作 (Ignore)。一開始,預設復原策略會設為 Reschedule。
預設復原策略
在下列情況下,適合採用 Reschedule 的預設復原策略:
叢集至少有兩個 worker 節點。
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 伺服器造成無法接受的負載。
請將活動訊號間隔設為低於寬限期,以免單次活動訊號遺漏導致節點被視為健康狀態不良。
執行 kubectl edit,開啟 VMHighAvailabilityPolicy 物件進行編輯。將 nodeHeartbeatInterval 和 nodeMonitorGracePeriod 設為您選擇的值。
spec: defaultRecoveryStrategy: Reschedule nodeHeartbeatInterval: 15s nodeMonitorGracePeriod: 1m30s