共用方式為


定義Azure Kubernetes Fleet Manager資源配置的推出策略

在資源佈置(叢集範圍ClusterResourcePlacement或命名空間範圍ResourcePlacement)的生命周期中,可能會進行變更,從而導致以下情境之一:

  • 可能需要在所有選定的叢集上放置新的工作負載
  • 已放置在指定叢集上的工作負載可能會被更新或刪除
  • 先前挑選的一些叢集現在已取消選取,而且必須從這類叢集移除工作負載
  • 有些叢集是新挑選的,而且工作負載必須新增至它們。

大多數情境可能導致服務中斷,因為在成員叢集上運行的工作負載可能暫時無法使用,當 Fleet Manager 分派更新的資源時。 不再選取的叢集會遺失所有放置的資源,導致流量遺失。 如果選擇過多新叢集,且艦隊管理員同時將資源放到它們上,叢集可能會過載。 具體的中斷模式可能會因投入的資源而有所不同。

為了減少中斷,Fleet Manager 的資源配置 API 允許用戶配置類似原生 Kubernetes 部署的部署策略,以盡可能順暢地轉換變更。

在本文中,我們將介紹針對ClusterResourcePlacement 以及ResourcePlacement 的推出策略選項。

Note

如果你還不熟悉 Fleet Manager 的資源配置概念,請先閱讀資源 配置的概念概述 再閱讀本文。

沒有明確策略的預設行為

兩者ClusterResourcePlacementResourcePlacement都不需要你去定義推出策略。 如果您未指定,預設設定是使用 RollingUpdate 策略搭配 maxSurge 為 25%、maxUnavailable 為 25%,及 unavailablePeriodSeconds 為 10 秒。

滾動更新策略

可在strategy中加入規範ClusterResourcePlacementResourcePlacement,以採用明確的滾動更新策略,如上所示。 你可以定義參數,來控制艦隊管理員資源放置的干擾程度。

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 會使用放置類型來判斷計算 NmaxUnavailable時要使用的叢集基準數目 (maxSurge) :

  • PickFixed:指定的clusterNames數目
  • PickAll:挑選的叢集數目
  • PickNnumberOfClusters 值。

如果你使用百分比作為參數,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.

階段進展

機隊管理系統會循序處理階段:

  1. 階段中的所有叢集都會根據其排序順序接收更新
  2. 成功更新階段中的所有叢集之後,任何設定的階段後工作都會執行
  3. 下一個階段只會在所有前一個階段的工作完成後開始

針對核准型進展,Fleet Manager 會建立 ClusterApprovalRequest(用於叢集範圍的配置)或 ApprovalRequest(用於命名空間範圍的配置)的資源,必須先核准後才能進入下一階段。

範例部署模式

下圖說明典型的三階段部署模式:

包含預備、金絲雀部署與生產階段的三階段部署模式,並且設有等待時間及審核閘道。

此模式可讓您:

  • 先部署至預備叢集以進行初始驗證
  • 等候指定的時間,再進入 Canary 叢集
  • 在推出至生產環境之前,需要手動核准
  • 控制 Canary 和生產階段內的更新順序

使用分段更新的時機

當您需要時,分段更新策略是理想的方法:

  • 環境型推出 (開發→暫存→生產環境)
  • 階段之間的驗證延遲核准閘道
  • 階段內叢集更新的決定性順序
  • 跨多資源配置的可重複使用部署模式

對於百分比型推出已足夠的較簡單案例,請考慮改用內嵌滾動更新策略。

Note

分階段更新策略對 ClusterResourcePlacementResourcePlacement的運作方式相同,唯一的差別在於自訂資源的範圍(叢集範圍與命名空間範圍)。

Tip

若要了解如何一步一步實作分段更新執行,請參閱 如何使用 ClusterStagedUpdateRun 來管理分段推出

後續步驟