在資源佈置(叢集範圍ClusterResourcePlacement或命名空間範圍ResourcePlacement)的生命周期中,可能會進行變更,從而導致以下情境之一:
- 可能需要在所有選定的叢集上放置新的工作負載
- 已放置在指定叢集上的工作負載可能會被更新或刪除
- 先前挑選的一些叢集現在已取消選取,而且必須從這類叢集移除工作負載
- 有些叢集是新挑選的,而且工作負載必須新增至它們。
大多數情境可能導致服務中斷,因為在成員叢集上運行的工作負載可能暫時無法使用,當 Fleet Manager 分派更新的資源時。 不再選取的叢集會遺失所有放置的資源,導致流量遺失。 如果選擇過多新叢集,且艦隊管理員同時將資源放到它們上,叢集可能會過載。 具體的中斷模式可能會因投入的資源而有所不同。
為了減少中斷,Fleet Manager 的資源配置 API 允許用戶配置類似原生 Kubernetes 部署的部署策略,以盡可能順暢地轉換變更。
在本文中,我們將介紹針對ClusterResourcePlacement 以及ResourcePlacement 的推出策略選項。
Note
如果你還不熟悉 Fleet Manager 的資源配置概念,請先閱讀資源 配置的概念概述 再閱讀本文。
沒有明確策略的預設行為
兩者ClusterResourcePlacement和ResourcePlacement都不需要你去定義推出策略。 如果您未指定,預設設定是使用 RollingUpdate 策略搭配 maxSurge 為 25%、maxUnavailable 為 25%,及 unavailablePeriodSeconds 為 10 秒。
滾動更新策略
可在strategy中加入規範ClusterResourcePlacement或ResourcePlacement,以採用明確的滾動更新策略,如上所示。 你可以定義參數,來控制艦隊管理員資源放置的干擾程度。
ClusterResourcePlacement 範例
apiVersion: placement.kubernetes-fleet.io/v1
kind: ClusterResourcePlacement
metadata:
name: crp-example
spec:
resourceSelectors:
- group: ""
kind: Namespace
name: test-namespace
version: v1
policy:
placementType: PickN
numberOfClusters: 2
affinity:
clusterAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
clusterSelectorTerms:
- labelSelector:
matchLabels:
fleet.azure.com/location: westus
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
maxSurge: 50%
ResourcePlacement 範例
apiVersion: placement.kubernetes-fleet.io/v1beta1
kind: ResourcePlacement
metadata:
name: rp-example
namespace: test-namespace
spec:
resourceSelectors:
- group: "apps"
kind: Deployment
name: my-app
version: v1
policy:
placementType: PickN
numberOfClusters: 3
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
maxSurge: 50%
組態參數
滾動更新策略可以使用下列參數進行設定:
maxUnavailable: 若資源未成功套用叢集,則視為不可用,並確保在任何時候 至少有 ( N -
maxUnavailable) 個叢集可用。 您可以將 設定為絕對數位或百分比。 默認值為 25%,不應使用零。 將此參數設定為較低的值會減少變更期間的中斷,但會導致推出速度較慢。maxSurge: 確保隨時都有可用的叢集數目 最多 (N +
maxSurge) 個。 您可以將 設定為絕對數位或百分比。 默認值為 25%,不應使用零。 將此參數設定為較低的值,會降低 Fleet Manager 在更多叢集上的資源位置,這會減緩推出程式的速度。unavailablePeriodSeconds 可讓您定義資源應評估為「就緒」之前的時間週期。 預設值為 60 秒。 Fleet Manager 只會將叢集中新套用的資源,在成功套用至該叢集後的
unavailablePeriodSeconds秒,將其視為「就緒」。 為此參數設定較低的值會導致更快速的推出。 不過,我們強烈建議用戶設定值,以允許完成初始化/準備工作。
如何判斷叢集計數
Fleet Manager 會使用放置類型來判斷計算 N 或 maxUnavailable時要使用的叢集基準數目 (maxSurge) :
-
PickFixed:指定的
clusterNames數目 - PickAll:挑選的叢集數目
-
PickN:
numberOfClusters值。
如果你使用百分比作為參數,Fleet Manager 也會對 N 進行計算。
分段更新原則 (預覽)
分段更新策略透過使用可設定的進度規則,將叢集組織成循序階段,提供對資源推出的精細控制。 不同於滾動更新策略,分段更新會使用個別的自定義資源在外部定義,這些自定義資源會共同協調部署。
Important
Azure Kubernetes 機群管理員預覽功能由客戶自行決定取用。 預覽是「依現況」及「可用時」提供的,並不包括在服務等級協定和有限保固之內。 客戶支援部門會竭盡全力支援一部分的 Azure Kubernetes 機群管理員預覽功能。 因此,這些功能不適合實際執行用途。
分段更新的運作方式
階段更新會根據範圍使用不同的自訂資源:
對於叢集範圍的配置:
-
ClusterResourcePlacement - 設定
strategy.type: External為 表示外部策略管理 - ClusterStagedUpdateStrategy - 定義階段、叢集選取和進展規則
-
ClusterStagedUpdateRun - 對特定的
ClusterResourcePlacement與叢集資源快照執行 clusterStagedUpdateStrategy
對於命名空間範圍的配置:
-
ResourcePlacement - 配置使用
strategy.type: External來表示外部策略管理 - StagedUpdateStrategy - 定義階段、叢集選擇與進度規則(命名空間範圍)
-
StagedUpdateRun - 執行 stagedUpdateStrategy,以對特定
ResourcePlacement及資源快照(命名空間範圍)進行更新
具有外部策略的叢集資源配置 (ClusterResourcePlacement)
apiVersion: placement.kubernetes-fleet.io/v1beta1
kind: ClusterResourcePlacement
metadata:
name: my-app-placement
spec:
resourceSelectors:
- group: ""
kind: Namespace
name: my-app
version: v1
policy:
placementType: PickAll
strategy:
type: External # Rollout is controlled by ClusterStagedUpdateRun, ClusterStagedUpdateStrategy.
資源置放搭配外部策略
apiVersion: placement.kubernetes-fleet.io/v1beta1
kind: ResourcePlacement
metadata:
name: my-app-placement
namespace: my-app
spec:
resourceSelectors:
- group: "apps"
kind: Deployment
name: my-deployment
version: v1
policy:
placementType: PickAll
strategy:
type: External # Rollout is controlled by StagedUpdateRun, StagedUpdateStrategy.
ClusterStagedUpdateStrategy (叢集範圍)
apiVersion: placement.kubernetes-fleet.io/v1beta1
kind: ClusterStagedUpdateStrategy
metadata:
name: three-stage-strategy
spec:
stages:
- name: staging
labelSelector:
matchLabels:
environment: staging
afterStageTasks:
- type: TimedWait
waitTime: 1h
- name: canary
labelSelector:
matchLabels:
environment: canary
sortingLabelKey: name
afterStageTasks:
- type: Approval
- name: production
labelSelector:
matchLabels:
environment: production
sortingLabelKey: order
StagedUpdateStrategy(命名空間範圍限定)
apiVersion: placement.kubernetes-fleet.io/v1beta1
kind: StagedUpdateStrategy
metadata:
name: three-stage-strategy
namespace: my-app
spec:
stages:
- name: staging
labelSelector:
matchLabels:
environment: staging
afterStageTasks:
- type: TimedWait
waitTime: 1h
- name: canary
labelSelector:
matchLabels:
environment: canary
sortingLabelKey: name
afterStageTasks:
- type: Approval
- name: production
labelSelector:
matchLabels:
environment: production
sortingLabelKey: order
舞台配置
策略的每個階段都可以指定:
- 用來判斷哪些叢集屬於階段的標籤選取器
-
排序次序為階段內的叢集使用
sortingLabelKey(選擇性 - 如果未指定,則依名稱依字母順序排序叢集) - 階段後工作 可選擇計時等待或核准要求(選擇性,每個階段最多包含 2 項任務,且每種類型最多一項)
ClusterStagedUpdateRun (cluster-scoped)
apiVersion: placement.kubernetes-fleet.io/v1beta1
kind: ClusterStagedUpdateRun
metadata:
name: my-app-rollout
spec:
placementName: my-app-placement # ClusterResourcePlacement name the update run is applied to.
resourceSnapshotIndex: "0" # ClusterResourceSnapshot index of the selected resources to be updated across clusters.
stagedRolloutStrategyName: three-stage-strategy # The name of the update strategy to use.
StagedUpdateRun(限定於命名空間)
apiVersion: placement.kubernetes-fleet.io/v1beta1
kind: StagedUpdateRun
metadata:
name: my-app-rollout
namespace: my-app
spec:
placementName: my-app-placement # ResourcePlacement name the update run is applied to.
resourceSnapshotIndex: "0" # ResourceSnapshot index of the selected resources to be updated across clusters.
stagedRolloutStrategyName: three-stage-strategy # The name of the update strategy to use.
階段進展
機隊管理系統會循序處理階段:
- 階段中的所有叢集都會根據其排序順序接收更新
- 成功更新階段中的所有叢集之後,任何設定的階段後工作都會執行
- 下一個階段只會在所有前一個階段的工作完成後開始
針對核准型進展,Fleet Manager 會建立 ClusterApprovalRequest(用於叢集範圍的配置)或 ApprovalRequest(用於命名空間範圍的配置)的資源,必須先核准後才能進入下一階段。
範例部署模式
下圖說明典型的三階段部署模式:
此模式可讓您:
- 先部署至預備叢集以進行初始驗證
- 等候指定的時間,再進入 Canary 叢集
- 在推出至生產環境之前,需要手動核准
- 控制 Canary 和生產階段內的更新順序
使用分段更新的時機
當您需要時,分段更新策略是理想的方法:
- 環境型推出 (開發→暫存→生產環境)
- 階段之間的驗證延遲和核准閘道
- 階段內叢集更新的決定性順序
- 跨多資源配置的可重複使用部署模式
對於百分比型推出已足夠的較簡單案例,請考慮改用內嵌滾動更新策略。
Note
分階段更新策略對 ClusterResourcePlacement 和 ResourcePlacement的運作方式相同,唯一的差別在於自訂資源的範圍(叢集範圍與命名空間範圍)。
Tip
若要了解如何一步一步實作分段更新執行,請參閱 如何使用 ClusterStagedUpdateRun 來管理分段推出。