使用群集资源替代自定义 Azure Kubernetes 舰队管理器中的群集范围资源

本文概述了如何使用舰队开源项目ClusterResourceOverride API 在 Azure Kubernetes 舰队管理器中自定义群集范围资源。

群集资源替代概述

群集资源替代功能可用于跨群集范围资源修改或替代特定属性。 使用 ClusterResourceOverride,可以基于群集标签定义规则,指定要应用于各种群集范围资源的更改,例如命名空间、群集角色、群集角色绑定或自定义资源定义 (CRD)。 这些修改可能包括对权限、配置或其他参数的更新,以确保在舰队托管 Kubernetes 群集之间对配置进行一致的管理和实施。

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

此示例从 rbac.authorization.k8s.io/v1 API 组中选择一个名为 secret-readerClusterRole 进行替代,如下所示。

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

策略

Policy 对象由一组规则 (overrideRules) 组成,这些规则指定要应用于所选群集资源的更改。 每个 overrideRule 对象都支持以下字段:

  • 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

此示例在具有标签 env: prod 的群集上删除名为 secret-readerClusterRole 中的谓词“list”。

群集选择器

可以使用 overrideRule 对象中的 clusterSelector 字段来指定替代规则要应用于的群集。 ClusterSelector 对象支持以下字段:

  • clusterSelectorTerms:指定选择群集的条件的术语列表。 每个术语都包含一个 labelSelector 字段,用于定义一组要匹配的标签。

重要

clusterSelectorTerms 字段中仅支持 labelSelector

JSON 补丁替代

可以使用 overrideRule 对象中的 jsonPatchOverrides 来指定要应用于所选资源的更改。 JsonPatch 对象支持以下字段:

  • op:要执行的操作。
    • 支持的操作包括 addremovereplace
      • add:向指定路径添加新值。
      • remove:移除位于指定路径处的值。
      • replace:替换位于指定路径处的值。
  • path:要修改的字段的路径。
    • 有关指定路径的指南包括:
      • 必须以 / 字符开头。
      • 不能为空或包含空字符串。
      • 不能是 TypeMeta 字段(“/kind”或“/apiVersion”)。
      • 不能是除字段“metadata/labels”和“/metadata/annotations”以外的 Metadata 字段(“/metadata/name”或“/metadata/namespace”)。
      • 不能是资源状态中的任何字段。
      • 有效路径的示例包括:
        • /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 添加到 overrideRule,以对所选群集资源应用多个更改,如以下示例所示:

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

此示例在具有标签 env: prod 的群集上删除名为 secret-readerClusterRole 中的谓词“list”或“watch”,如下所示。

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

jsonPatchOverrides 按照 RFC 6902 对所选资源应用 JSON 补丁。

应用群集资源放置

  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. 使用 kubectl apply 命令应用 ClusterResourcePlacement

    kubectl apply -f cluster-resource-placement.yaml
    
  3. 使用 kubectl describe 命令检查 ClusterResourcePlacement 资源的状态,验证应用于所选资源的 ClusterResourceOverride 对象。

    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 列表,其中包含群集资源替代快照(如果相关)。 每个群集的单独状态消息指示是否已成功应用替代规则。

后续步骤

若要了解有关舰队的详细信息,请参阅以下资源: