Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
本文概述了如何使用 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-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"}
示例 ResourceOverride
对象在 fleet-clustername-chinanorth3
Azure 区域的群集上,把 chinanorth3
值添加到指定的 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
列表。 此列表包含相关的资源替代快照。 每个群集的单独状态消息指示是否已成功应用替代规则。