你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
本文概述了如何使用 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-nginx
的 test-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
:要添加、删除或替换的值。 如果op
为remove
,则无法指定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
映像。
应用群集资源放置
创建
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
列表。 此列表包含相关的资源替代快照。 每个群集的单独状态消息指示是否已成功应用替代规则。