你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

使用资源替代自定义 Azure Kubernetes 舰队管理器中的命名空间范围资源

本文概述了如何使用 ResourceOverride API 替代 Azure Kubernetes Fleet Manager 中的命名空间范围资源。

你可以修改或替代命名空间中现有资源的特定属性。 使用 ResourceOverride,可以根据群集标签定义规则,指定要应用于部署、有状态集、配置映射或机密等资源的更改。

这些修改可以包括对容器映像、环境变量、资源限制或任何其他可配置参数的更新。 此类更新有助于确保跨通过 Fleet Manager 管理的 Kubernetes 群集中的配置进行一致的管理和强制实施。

ResourceOverride API 包含以下组成部分:

  • resourceSelectors:指定选定要替代的资源集。
  • policy:指定要应用于所选资源的规则集。

资源选择器

ResourceOverride 对象可以包含一个或多个资源选择器,以指定要替代的资源。 ResourceSelector 对象包含以下字段。

  • group:资源的 API 组。
  • version:资源的 API 版本。
  • kind:资源的种类。
  • namespace:资源的命名空间。

若要将资源选择器添加到 ResourceOverride 对象,请使用以下 YAML 格式的 resourceSelectors 字段。

apiVersion: placement.kubernetes-fleet.io/v1alpha1
kind: ResourceOverride
metadata:
  name: example-resource-override
  namespace: test-namespace
spec:
  resourceSelectors:
    -  group: apps
       kind: Deployment
       version: v1
       name: test-nginx

重要

  • 如果选择命名空间 ResourceSelector,替代将应用于命名空间中的所有资源。
  • 对象 ResourceOverride 需要与要重写的资源位于同一命名空间中。

此示例从 Deployment 命名空间中选择了一个名为 test-nginxtest-namespace 对象进行替代。

策略

一个 Policy 对象由一组 overrideRules 组成,它们指定要应用于所选资源的更改。 每个 overrideRules 对象都支持以下字段:

  • clusterSelector:指定替代规则要应用于的群集集。
  • jsonPatchOverrides:指定要应用于所选资源的更改。

若要将替代规则添加到 ResourceOverride 对象,请使用具有以下 YAML 格式的 policy 字段:

apiVersion: placement.kubernetes-fleet.io/v1alpha1
kind: ResourceOverride
metadata:
  name: example-resource-override
  namespace: test-namespace
spec:
  resourceSelectors:
    -  group: apps
       kind: Deployment
       version: v1
       name: test-nginx
  policy:
    overrideRules:
      - clusterSelector:
          clusterSelectorTerms:
            - labelSelector:
                matchLabels:
                  env: prod
        jsonPatchOverrides:
          - op: replace
            path: /spec/template/spec/containers/0/image
            value: "nginx:1.20.0"

本示例将 Deployment 对象中的容器映像替换为标为 nginx:1.20.0 群集的 env: prod 映像。

群集选择器

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

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

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 补丁。

JSON 补丁替代值中的保留变量

保留变量被 JSON 补丁替代规则的 value 中使用的值替换。 当前支持的保留变量:

  • ${MEMBER-CLUSTER-NAME}:替换为 memberCluster 的名称。

例如,若要创建包含群集名称的 Azure DNS 主机名,可以使用类似于以下内容的配置:

apiVersion: placement.kubernetes-fleet.io/v1alpha1
kind: ResourceOverride
metadata:
  name: ro-kuard-demo-eastus
  namespace: kuard-demo
spec:
  placement:
    name: crp-kuard-demo
  resourceSelectors:
    -  group: ""
        kind: Service
        version: v1
        name: kuard-svc
  policy:
    overrideRules:
      - clusterSelector:
          clusterSelectorTerms:
            - labelSelector:
                matchLabels:
                  fleet.azure.com/___location: eastus
        jsonPatchOverrides:
          - op: add
            path: /metadata/annotations
            value:
              {"service.beta.kubernetes.io/azure-dns-label-name":"fleet-${MEMBER-CLUSTER-NAME}-eastus"}

示例 ResourceOverride 对象在 fleet-clustername-eastus Azure 区域的群集上,把 eastus 值添加到指定的 JSON 路径。

多个替代规则

你可以将多个 overrideRules 对象添加到 policy 字段,以对所选资源应用多个修改。 下面是一个示例:

apiVersion: placement.kubernetes-fleet.io/v1alpha1
kind: ResourceOverride
metadata:
  name: ro-1
  namespace: test
spec:
  resourceSelectors:
    -  group: apps
       kind: Deployment
       version: v1
       name: test-nginx
  policy:
    overrideRules:
      - clusterSelector:
          clusterSelectorTerms:
            - labelSelector:
                matchLabels:
                  env: prod
        jsonPatchOverrides:
          - op: replace
            path: /spec/template/spec/containers/0/image
            value: "nginx:1.20.0"
      - clusterSelector:
          clusterSelectorTerms:
            - labelSelector:
                matchLabels:
                  env: test
        jsonPatchOverrides:
          - op: replace
            path: /spec/template/spec/containers/0/image
            value: "nginx:latest"

此示例将 Deployment 对象中的容器映像替换为:

  • 标为 nginx:1.20.0 群集的 env: prod 映像。
  • 标为 nginx:latest 群集的 env: test 映像。

应用群集资源放置

  1. 创建 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: PickAll
        affinity:
          clusterAffinity:
            requiredDuringSchedulingIgnoredDuringExecution:
              clusterSelectorTerms:
                - labelSelector:
                    matchLabels:
                      env: prod
                - labelSelector:
                    matchLabels:
                      env: test
    

    该示例将 test-namespace 内的资源分配给所有标为 env:prodenv:test 的群集。 实现修改后,相应的 ResourceOverride 配置将应用于指定的资源。 选择匹配的部署资源 (my-deployment) 会触发将配置应用到指定的资源。

  2. 使用 ClusterResourcePlacement 命令应用 kubectl apply 资源:

    kubectl apply -f cluster-resource-placement.yaml
    
  3. 使用 ResourceOverride 命令查看 ClusterResourcePlacement 资源的状态,确认 kubectl describe 对象已应用到所选的资源:

    kubectl describe clusterresourceplacement crp-example
    

    输出应与以下示例类似:

    Status:
      Conditions:
        ...
        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 Resource Overrides:
          Name:        ro-1-0
          Namespace:   test-namespace
        Cluster Name:  member-50
        Conditions:
          ...
          Last Transition Time:  2024-04-26T22:57:14Z
          Message:               Successfully applied the override rules on the resources
          Observed Generation:   1
          Reason:                OverriddenSucceeded
          Status:                True
          Type:                  Overridden
         ...
    

    ClusterResourcePlacementOverridden 条件指示资源替代是否已成功应用于所选资源。 每个群集保持其自己的 Applicable Resource Overrides 列表。 此列表包含相关的资源替代快照。 每个群集的单独状态消息指示是否已成功应用替代规则。