适用于: ✔️具有中心群集的 Fleet Manager
Azure Kubernetes Fleet Manager 智能资源放置可将同一资源部署到一个机群中的多个群集。 通常,需要修改资源配置,以在不同的环境(开发、测试、生产)中强制实施有关行为的规则。 为此,Fleet Manager 提供了资源替代,该功能在概念上类似于 Helm 模板和 Kustomize 修补程序的使用方式。
在以下情况下,修改资源配置非常有用:
- 你想要在所有集群上使用一个名为
ClusterRole的secret-reader,但在生产集群上,该角色允许执行的操作范围要更小。 - 您希望在所有集群上使用相同的
Deployment,但在生产集群上使用不同的容器映像或端口。
本文介绍如何为由 Fleet Manager 资源放置所部署的资源创建覆盖配置。
Azure Kubernetes Fleet Manager 支持两个替代范围:
-
群集范围:
ClusterResourceOverride和ClusterResourcePlacement用于管理基础设施级更改的集群管理员。 -
命名空间范围:用于
ResourceOverrideResourcePlacement管理其特定命名空间内推出的应用程序团队。
从文章顶部的范围类型选项中选择最适用的范围。
群集范围的资源替代
ClusterResourceOverride 具有以下属性:
-
clusterResourceSelectors:指定为重写选择的群集资源集。 -
policy:指定要应用于所选群集资源的规则集。
注释
Policy 对于群集和命名空间范围内的资源,定义是相同的。
下面这个示例ClusterRole名为secret-reader,演示了ClusterResourceOverride的工作原理。
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: secret-reader
rules:
- apiGroups: [""]
resources: ["secrets"]
verbs: ["get", "watch", "list"]
选择群集资源
可以在ClusterResourceOverride中包含一个或多个clusterResourceSelector资源以选择需要替代的资源。 每个 clusterResourceSelector 字段都支持以下字段。
-
group:资源的 API 组。 -
version:资源的 API 版本。 -
kind:资源的种类。 -
name:资源的名称。
注释
如果选择命名空间 ClusterResourceSelector,替代将应用于命名空间中的所有资源。
使用我们的示例 ClusterRole,让我们看看如何在一个 ClusterResourceOverride示例中选择它。
apiVersion: placement.kubernetes-fleet.io/v1
kind: ClusterResourceOverride
metadata:
name: example-cro
spec:
clusterResourceSelectors:
- group: rbac.authorization.k8s.io
kind: ClusterRole
version: v1
name: secret-reader
命名空间范围内的资源替代
ResourceOverride 具有以下属性:
-
resourceSelectors:指定要覆盖的资源集。 -
policy:指定要应用于所选资源的规则集。
注释
Policy 对于群集和命名空间范围内的资源,定义是相同的。
若要演示 ResourceOverride 的工作方式,请使用下面名为 Deployment 的示例 nginx-sample。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-sample
namespace: nginx-demo
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.25
ports:
- containerPort: 80
选择命名空间资源
可以在ResourceOverride中包含一个或多个resourceSelector资源以选择需要替代的资源。 各个 resourceSelector 支持以下字段:
-
group:资源的 API 组。 -
version:资源的 API 版本。 -
kind:资源的种类。 -
name:资源的名称。
通过在 namespace 的 metadata 中指定 ResourceOverride 集,可以确定要重写的资源的命名空间。
使用示例 Deployment,可了解如何在一个 ResourceOverride中将其选中。
apiVersion: placement.kubernetes-fleet.io/v1
kind: ResourceOverride
metadata:
name: example-resource-override
namespace: nginx-demo
spec:
resourceSelectors:
- group: apps
kind: Deployment
version: v1
name: nginx-sample
重要
- 如果在
resourceSelector(kind: Namespace)中选择一个命名空间,则该重写将应用于命名空间中的所有资源。 - 需要
ResourceOverride与要重写的资源位于同一命名空间中。
现在您已选择该资源,下面来看看如何使用 policy 配置覆盖设置。
Policy
由 policy 组成的一组 overrideRules 用于指定要应用于所选资源的更改。 各个 overrideRules 支持以下字段:
-
clusterSelector:指定替代规则应用到的群集集。 -
jsonPatchOverrides:指定要应用于所选资源的更改。
群集选择器
使用 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:要添加、删除或替换的值。op如果是remove,则无法指定value。
这些 jsonPatchOverrides 字段遵循 RFC 6902 对所选资源应用 JSON 修补程序。
扩展我们的示例,你将配置一个 policy,以便在带有 list 标签的集群上,从名为 ClusterRole 的 secret-reader 中删除 env:prod 动词。
apiVersion: placement.kubernetes-fleet.io/v1
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
在前面的示例基础上,您可以配置一个 policy,以便在带有 Deployment 标签的群集中,将 nginx:1.30.0 中的容器映像替换为 env: prod 映像。
apiVersion: placement.kubernetes-fleet.io/v1
kind: ResourceOverride
metadata:
name: example-resource-override
namespace: nginx-demo
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.30.0"
定义多个替代
向 jsonPatchOverrides 添加多个 overrideRules 字段,以对所选群集资源应用多项更改。 下面是一个示例:
此示例会在带有标签 list 的集群上,删除名为 watch 的示例 ClusterRole 中的动词 secret-reader 和 env: prod。
apiVersion: placement.kubernetes-fleet.io/v1
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
此示例在带有 Deployment 标签的群集内,将容器映像和端口 443 替换为 env: prod。
apiVersion: placement.kubernetes-fleet.io/v1
kind: ResourceOverride
metadata:
name: example-resource-override
namespace: nginx-demo
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.30.0"
- op: replace
path: /spec/template/spec/containers/0/ports/0/containerPort
value: "443"
JSON 补丁中的保留变量覆盖值
JSON 补丁覆盖规则中的 value 会在放置时替换保留变量。 当前支持的保留变量:
-
${MEMBER-CLUSTER-NAME}:替换为memberCluster的名称。
例如,若要创建包含群集名称的Azure DNS主机名,示例 ResourceOverride在 fleet-clustername-chinanorth3 Azure 区域中的群集上添加 eastus 值。
apiVersion: placement.kubernetes-fleet.io/v1
kind: ResourceOverride
metadata:
name: ro-kuard-demo-chinanorth3
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: chinanorth3
jsonPatchOverrides:
- op: add
path: /metadata/annotations
value:
{"service.beta.kubernetes.io/azure-dns-label-name":"fleet-${MEMBER-CLUSTER-NAME}-chinanorth3"}
多个替代规则
将多个 overrideRules 添加到 policy 字段,以对所选资源应用多个更改。 这是一个针对ResourceOverride的示例。
此示例将在 Deployment 中的容器镜像替换为:
- 带有
nginx:1.20.0标签的env: prod群集的图像。 - 带有
nginx:latest标签的env: test群集的图像。
apiVersion: placement.kubernetes-fleet.io/v1
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"
与群集资源放置配合使用
创建一个
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会触发对群集进行配置应用。ClusterResourcePlacement,使用kubectl apply命令应用。kubectl apply -f cluster-resource-placement.yaml通过
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列表。 此列表包含群集资源替代的快照(如果相关)。 每个群集的单个状态消息指示是否已成功应用替代规则。
与资源放置一起使用
创建一个
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:prod的群集中分配env:test内的资源。 实现更改后,相应的ResourceOverride配置将应用于指定的资源。 选择匹配的部署资源时my-deployment,会触发将配置的应用程序应用到指定的资源。使用命令
ClusterResourcePlacement来应用kubectl apply资源。kubectl apply -f cluster-resource-placement.yaml通过
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列表。 此列表包含资源替代快照(如果相关)。 每个群集的单个状态消息指示是否已成功应用替代规则。

