共用方式為


使用 Azure Kubernetes Fleet Manager 叢集資源放置接管現有的工作負載 (預覽)

當多叢集環境成熟時,多個叢集上存在特定工作負載是常見的情況。 將叢集新增至車隊的其中一個原因是集中管理工作負載,以改善多個叢集工作負載的可見度和管理能力。 不過,將具有現有工作負載的叢集新增至機隊時,當 Fleet Manager 嘗試將受控工作負載放在已新增的成員叢集時,可能會導致放置衝突。

在本文中,我們將探討如何在叢集資源放置(CRP)中,利用 whenToTakeOverapplyStrategy 屬性來明確控制 Fleet Manager 在執行放置時如何處理現有的工作負載。

備註

如果您還不熟悉 Fleet Manager 的叢集資源放置 (CRP),請先閱讀 資源放置的概念概觀 ,再閱讀本文。

這很重要

Azure Kubernetes 機群管理員預覽功能由客戶自行決定取用。 預覽是「依現況」及「可用時」提供的,並不包括在服務等級協定和有限保固之內。 客戶支援部門會竭盡全力支援一部分的 Azure Kubernetes 機群管理員預覽功能。 因此,這些功能不適合實際執行用途。

我們的數據平面預覽會透過 v1beta1 API 發行。 如果您沒有看到預覽物件,請檢查您是否在與 Fleet Manager 中樞叢集互動時要求 v1beta1 API。

工作負載移轉選項

工作負載切換的第一步是將工作負載清單部署到您的 Fleet Manager 中樞叢集。 部署之後,您需要定義一個 CRP,該 CRP 使用 whenToTakeOver 屬性來指定明確的接管行為。

屬性 whenToTakeOver 允許下列值:

  • Always:Fleet Manager 會立即從中樞叢集套用對應的工作負載,並在目標叢集上覆蓋受管欄位中的任何值差異。 此行為是沒有明確 whenToTakeOver 設定之CRP的預設值。

  • IfNoDiff:Fleet Manager 會在找到現有的工作負載時檢查組態差異,如果找不到任何設定差異,則只會套用中樞叢集工作負載。

  • Never:Fleet Manager 會忽略現有的工作負載,而且不會套用中樞叢集工作負載。 車隊管理系統仍會識別相符的工作負載並引發應用錯誤,使您能夠安全地檢查現有工作負載是否存在。

定義用於比較的欄位

您可以使用選擇性 comparisonOptions 屬性來微調如何 whenToTakeOver 判斷組態差異。

  • partialComparison:只有中樞叢集工作負載和目標叢集工作負載上存在的字段才會用於值比較。 忽略目標叢集工作負載上的任何額外未受管理的欄位。 此行為是沒有明確 comparisonOptions 設定之CRP的預設值。

  • fullComparison:艦隊中樞叢集上工作負載定義的所有欄位都必須出現在選取的成員叢集上。 如果目標叢集有任何額外的未受管理欄位,比對會失敗。

檢查是否有衝突的工作負載

若要檢查 CRP 的現有工作負載,請先新增一個applyStrategy並指定whenToTakeOver的值為Never,如範例所示。

apiVersion: placement.kubernetes-fleet.io/v1beta1
kind: ClusterResourcePlacement
metadata:
  name: web-2-crp
spec:
  resourceSelectors:
    - group: ""
      kind: Namespace
      version: v1 
      labelSelector:
        matchLabels:
          app: web-2
  policy:
    placementType: PickAll
  strategy:
    applyStrategy:
      whenToTakeOver: Never     
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 100%
      unavailablePeriodSeconds: 1            

將CRP套用至您的 Fleet Manager 中樞叢集。

kubectl apply -f web-2-crp.yaml

Fleet Manager 會嘗試放置工作負載,當在目標成員叢集上找到相符的工作負載時,傳回 failedPlacement 回應。

您可以使用下列命令來判斷哪些成員叢集因工作負載衝突而無法進行配置。 jq 命令用來格式化輸出。

kubectl get clusterresourceplacement.v1beta1.placement.kubernetes-fleet.io web-2-crp -o jsonpath='{.status.placementStatuses}' \
    | jq '[.[] | select (.failedPlacements != null)] | map({clusterName, failedPlacements})'

由於現有工作負載,導致放置失敗的每個叢集都會傳回以下範例中類似的條目。

{
    "clusterName": "member-2",
    "failedPlacements": [
        {
            "condition": {
                "lastTransitionTime": "...",
                "message": "Failed to apply the manifest (error: no ownership of the object in the member cluster; takeover is needed)",
                "reason": "NotTakenOver",
                "status": "False",
                "type": "Applied"
            },
            "kind": "Namespace",
            "name": "web-2",
            "version": "v1"
        }
    ]
}

安全接管匹配的工作負載

若要繼續接管現有的工作負載,您可以修改現有的 CRP,變更 whenToTakeOverIfNoDiff

Fleet Manager 會套用中樞叢集工作負載,以取代目標叢集上現有的工作負載,這兩個工作負載上的受控字段之間沒有任何差異。 會忽略額外的欄位。

apiVersion: placement.kubernetes-fleet.io/v1beta1
kind: ClusterResourcePlacement
metadata:
  name: web-2-crp
spec:
  resourceSelectors:
    - group: ""
      kind: Namespace
      version: v1 
      labelSelector:
        matchLabels:
          app: web-2
  policy:
    placementType: PickAll
  strategy:
    applyStrategy:
      whenToTakeOver: IfNoDiff
      comparisonOption: partialComparison
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 100%
      unavailablePeriodSeconds: 1            

將CRP套用至您的 Fleet Manager 中樞叢集。

kubectl apply -f web-2-crp.yaml

Fleet Manager 會嘗試安置工作負載,並覆蓋具有相符欄位的目標成員集群。

配置仍然可能會失敗,因此請確認是否存在多餘的failedPlacement訊息。 使用下列命令判斷哪些成員叢集失敗。 jq 命令用來格式化輸出。

kubectl get clusterresourceplacement.v1beta1.placement.kubernetes-fleet.io web-2-crp -o jsonpath='{.status.placementStatuses}' \
    | jq '[.[] | select (.failedPlacements != null)] | map({clusterName, failedPlacements})'

由於設定差異而無法放置的每個叢集都會傳回類似下列範例的項目。

{
    "clusterName": "member-2",
    "failedPlacements": [
        {
            "condition": {
                "lastTransitionTime": "...",
                "message": "Failed to apply the manifest (error: cannot take over object: configuration differences are found between the manifest object and the corresponding object in the member cluster)",
                "reason": "FailedToTakeOver",
                "status": "False",
                "type": "Applied"
            },
            "kind": "Namespace",
            "name": "work-2",
            "version": "v1"
        }
    ]
}

您可以依照漂移偵測文件中叢集報告一節中詳述的過程,來檢視漂移欄位。

此時,您必須決定如何處理漂移,方法是將成員叢集變更納入中樞叢集工作負載定義,或選擇將 屬性設定 whenToTakeOverAlways來覆寫成員叢集工作負載。

後續步驟