共用方式為


使用叢集資源覆寫自定義 Azure Kubernetes Fleet Manager 中的叢集範圍資源

本文提供如何使用 ClusterResourceOverride API 在 Azure Kubernetes Fleet Manager 中自定義叢集範圍資源的概觀。

您可以在叢集資源之間修改或覆寫特定屬性。 您可以使用 ClusterResourceOverride,根據叢集卷標定義規則,並指定要套用至各種整個叢集資源的變更。 這些資源包括命名空間、叢集角色、叢集角色系結或自定義資源定義。

這些修改可能包括許可權、組態或其他參數的更新。 這類更新有助於確保透過 Fleet Manager 管理之叢集的一致管理和強制執行設定。

API 元件

ClusterResourceOverride API 是由下列元件組成:

  • clusterResourceSelectors:指定選取要覆寫的叢集資源集合。
  • policy:指定要套用至所選叢集資源的規則集合。

叢集資源選取器

ClusterResourceOverride 物件可以包含一或多個叢集資源選取器,以指定要覆寫的資源。 對象 ClusterResourceSelector 支援下列欄位。

注意

如果您在 中 ClusterResourceSelector選取命名空間,則覆寫會套用至命名空間中的所有資源。

  • group:資源的 API 群組。
  • version:資源的 API 版本。
  • kind:資源的類型。
  • name:資源的名稱。

若要將叢集資源選取器新增至 ClusterResourceOverride 物件,請使用具有下列 YAML 格式的 clusterResourceSelectors 欄位:

apiVersion: placement.kubernetes-fleet.io/v1alpha1
kind: ClusterResourceOverride
metadata:
  name: example-cro
spec:
  clusterResourceSelectors:
    - group: rbac.authorization.k8s.io
      kind: ClusterRole
      version: v1
      name: secret-reader

此範例會ClusterRolesecret-reader API 群組中選取名為 rbac.authorization.k8s.io/v1 的物件,以覆寫:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: secret-reader
rules:
- apiGroups: [""]
  resources: ["secrets"]
  verbs: ["get", "watch", "list"]

原則

Policy 物件包含一組規則 overrideRules,可指定要套用至所選叢集資源的變更。 每個 overrideRules 物件都支援下列欄位:

  • clusterSelector:指定套用覆寫規則的叢集集合。
  • jsonPatchOverrides:指定要套用至所選資源的變更。

若要將覆寫規則新增至 ClusterResourceOverride 物件,請使用具有下列 YAML 格式的 policy 欄位:

apiVersion: placement.kubernetes-fleet.io/v1alpha1
kind: ClusterResourceOverride
metadata:
  name: example-cro
spec:
  clusterResourceSelectors:
    - group: rbac.authorization.k8s.io
      kind: ClusterRole
      version: v1
      name: secret-reader
  policy:
    overrideRules:
      - clusterSelector:
          clusterSelectorTerms:
            - labelSelector:
                matchLabels:
                  env: prod
        jsonPatchOverrides:
          - op: remove
            path: /rules/0/verbs/2

此範例會移除叢集上名為 ClusterRole 且具有 卷標 secret-reader之物件中的env: prod動詞 「list」。。

叢集選取器

您可以使用 clusterSelector 物件中的 overrideRules 欄位來指定要套用覆寫規則的叢集。 ClusterSelector 物件支援下列欄位:

  • clusterSelectorTerms:指定選取叢集準則的字詞清單。 每個字詞都包含一個 labelSelector 欄位,可定義一組要比對的標籤。

重要

labelSelector 欄位中僅支援 clusterSelectorTerms

JSON 修補程式覆寫

您可以在 jsonPatchOverrides 物件中使用 overrideRules 來指定要套用至所選資源的變更。 JsonPatch 物件支援下列欄位:

  • op:要執行的作業。 支援的作業包括:

    • add:將新的值新增至指定路徑。
    • remove:移除位於指定路徑的值。
    • replace:取代位於指定路徑的值。
  • path:要修改欄位的路徑。 指定路徑的指引包括:

    • 必須以斜線 (/) 字元開頭。
    • 不能是空的或包含空字串。
    • 不能是 TypeMeta 欄位 (/kind/apiVersion)。
    • 不能是 Metadata 欄位 (/metadata/name/metadata/namespace),但欄位 /metadata/labels/metadata/annotations除外。
    • 不能是資源狀態中的任何欄位。

    有效路徑的範例包括:

    • /metadata/labels/new-label
    • /metadata/annotations/new-annotation
    • /spec/template/spec/containers/0/resources/limits/cpu
    • /spec/template/spec/containers/0/resources/requests/memory
  • value:要新增、移除或取代的值。 如果 opremove,則無法指定 value

欄位會 jsonPatchOverrides 遵循 RFC 6902,在選取的資源上套用 JSON 修補程式。

多個覆寫修補程式

您可以將多個 jsonPatchOverrides 欄位新增至 overrideRules 物件,以將多個變更套用至選取的叢集資源。 以下是範例:

apiVersion: placement.kubernetes-fleet.io/v1alpha1
kind: ClusterResourceOverride
metadata:
  name: cro-1
spec:
  clusterResourceSelectors:
    - group: rbac.authorization.k8s.io
      kind: ClusterRole
      version: v1
      name: secret-reader
  policy:
    overrideRules:
      - clusterSelector:
          clusterSelectorTerms:
            - labelSelector:
                matchLabels:
                  env: prod
        jsonPatchOverrides:
          - op: remove
            path: /rules/0/verbs/2
          - op: remove
            path: /rules/0/verbs/1

此範例會移除具有標籤ClusterRolesecret-reader叢集上名為 env: prod 的物件中的動詞 「list」 和 「watch」 動詞:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: secret-reader
rules:
- apiGroups: [""]
  resources: ["secrets"]
  verbs: ["get", "watch", "list"]

套用叢集資源放置

  1. 建立 ClusterResourcePlacement 資源,以指定將叢集資源覆寫分散到叢集基礎結構的放置規則。 下列程式代碼是範例。 請務必選取適當的資源。

    apiVersion: placement.kubernetes-fleet.io/v1
    kind: ClusterResourcePlacement
    metadata:
      name: crp
    spec:
      resourceSelectors:
        - group: rbac.authorization.k8s.io
          kind: ClusterRole
          version: v1
          name: secret-reader
      policy:
        placementType: PickAll
        affinity:
          clusterAffinity:
            requiredDuringSchedulingIgnoredDuringExecution:
              clusterSelectorTerms:
                - labelSelector:
                    matchLabels:
                      env: prod
    

    此範例將資源散發在所有以 env: prod 標籤的叢集中。 實作變更時,對應的 ClusterResourceOverride 組態會套用至指定的叢集。 選取相符的叢集角色資源 secret-reader會觸發組態對叢集的應用程式。

  2. 使用 命令套 ClusterResourcePlacementkubectl apply 資源:

    kubectl apply -f cluster-resource-placement.yaml
    
  3. ClusterResourceOverride透過 命令檢查資源的狀態ClusterResourcePlacement,確認物件已套用至選取的資源kubectl describe

    kubectl describe clusterresourceplacement crp
    

    您的輸出應該類似下列範例:

    Status:
      Conditions:
        ...
        Last Transition Time:   2024-04-27T04:18:00Z
        Message:                The selected resources are successfully overridden in the 10 clusters
        Observed Generation:    1
        Reason:                 OverriddenSucceeded
        Status:                 True
        Type:                   ClusterResourcePlacementOverridden
        ...
      Observed Resource Index:  0
      Placement Statuses:
        Applicable Cluster Resource Overrides:
          example-cro-0
        Cluster Name:  member-50
        Conditions:
          ...
          Message:               Successfully applied the override rules on the resources
          Observed Generation:   1
          Reason:                OverriddenSucceeded
          Status:                True
          Type:                  Overridden
         ...
    

    ClusterResourcePlacementOverridden 條件指示資源覆寫是否已成功套用至叢集中的所選資源。 每個叢集都會維護自己的 Applicable Cluster Resource Overrides 清單。 如果相關,此清單包含叢集資源覆寫的快照集。 每個叢集的個別狀態訊息會指出覆寫規則是否已成功套用。