設定 VM 的高可用性政策

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