首页 >> 科技 >> CNCF 沙箱项目 OCM Placement 多集群调拨指南

CNCF 沙箱项目 OCM Placement 多集群调拨指南

2025-03-13 科技

题之一,OCM 之所以扩展了 ClusterSet 三维且额外发放了其到名称室内空间的映射,是为了想要 OCM 作为一个平台能应付“多坦克部队一幕”内都帮助客户端应付最琐碎同时又最操心的关键问题。至于如何消费所关连的坦克部队表列显露请详见下面的 Placement 三维。

什么是 Placement?

Placement API 用于在一个或多个附属坦克部队组(ManagedClusterSet)内都必必需一组附属;还有(ManagedCluster),以之前将实习电源调动到这些;还有上。

如果界定了有效的 Placement,则 Placement 控制缓冲器 (controller) 将生成也就是说的调拨执行者 (PlacementDecision),并在静止状态 (Status) 内都列显露选定的附属;还有 (ManagedCluster)。作为再一客户端,你可以解析显露选定的坦克部队,然后对期望坦克部队同步进行操作方法。你也可以将更为高层级的实习电源编排缓冲器 (orchestrator) 与 PlacementDecision 自带,来拓展 Placement 的调拨潜能。

例如,ArgoCD 仍然与 Placement 自带。ArgoCD 的介面可以在 ApplicationSet 的 clusterDecisionResource 内都指定一个关连了的 PlacementDecision 森林资源的 ConfigMap,就可以能用 Placement 的调拨执行者,将运用于也就是说平均分配到一组期望坦克部队。如下:

apiVersion: argoproj.io/v1alpha1

kind: ApplicationSet

metadata:

name: book-import

spec:

generators:

- clusterDecisionResource:

configMapRef: ocm-placement

labelSelector:

matchLabels:

cluster.open-cluster-management.io/placement: local-cluster

requeueAfterSeconds: 30

template:

apiVersion: v1

kind: ConfigMap

metadata:

name: ocm-placement

data:

apiVersion: cluster.open-cluster-management.io/v1alpha1

kind: placementdecisions

statusListKey: decisions

matchKey: clusterName

apiVersion: cluster.open-cluster-management.io/v1alpha1

kind: PlacementDecision

metadata:

labels:

cluster.open-cluster-management.io/placement: local-cluster

name: local-cluster-decision-1

status:

decisions:

- clusterName: cluster1

reason: ""

- clusterName: cluster2

reason: ""

KubeVela 作为解禁运用于程序三维 OAM(Open Application Model) 的实现,也就此能用 Placement API 同步进行实习电源调拨。

与原生 Kubernetes 调拨三维的区别于与联系?

与 Kubernetes 的线性调拨完全相异,Placement 用作时序调拨的系统。调拨抉择亦会随着坦克部队要素转变也随之转变,客户端可以通过在 Placement 上优化调拨的稳定个数来减缓调拨执行者的抖动。另外,Placement API 设法将整个调拨更进一步显示既有,让客户端可以通过 API 查看调拨抉择的原委,方之前客户端变得容易的数据处理调拨内置和参数。

同时在原生 Kubernetes 内都的调拨是一次性的,而在多坦克部队一幕内都我们往往无必需的是一个“声明式的调拨” — 我们界定显露调拨手段的“硬必要条件”和“软必要条件”是什么,再根据实际的坦克部队紧致/可视静止状态执行者再一最简单的坦克部队,所以它更为像是原生 Kubernetes 内都的还击调拨/反调拨 PodDisruptionBudget 的三维而非线性调拨内都的 Taint/Toleration 的三维。

OCM 在 Placement 三维内都同时考虑了大规模多坦克部队调拨时坦克部队表列显露长度骤降的关键问题,在 Placement 的最简单产物 PlacementDecision 内都所有最简单结果都是分页展示的以避免突破 Kubernetes CRD 对三维的限制。

Placement 如何必必需坦克部队?

有了上述的初步参考,让我们更为深入地洞察 Placement API,看看它是如何必必需所必需的坦克部队以及它可以发放哪些调拨原先功能。

如下是一个 Placement 举例:

apiVersion: cluster.open-cluster-management.io/v1alpha1

kind: Placement

metadata:

name: placement

namespace: ns1

spec:

numberOfClusters: 4

clusterSets:

- clusterset1

- clusterset2

predicates:

- requiredClusterSelector:

labelSelector:

matchLabels:

vendor: OpenShift

prioritizerPolicy:

mode: Exact

configurations:

- scoreCoordinate:

builtIn: ResourceAllocatableMemory

- scoreCoordinate:

builtIn: Steady

weight: 3

- scoreCoordinate:

type: AddOn

addOn:

resourceName: default

scoreName: cpuratio

Spec 包含以下四个字段:

numberOfClusters: 表示要必必需的相符尽快的 ManagedClusters 数目。 clusterSets: 表示从内都必必需 ManagedCluster 的 ManagedClusterSet 名称。 predicates: 仅限于了一组复赛手段。可以用作附加必必需缓冲器 (labelSelector) 和声明必必需缓冲器 (claimSelector) 来必必需 ManagedCluster。每一个复赛手段内置二者之间是或的关系。 prioritizerPolicy: 界定了譬如说手段。譬如说手段内都通过 mode 另设是否用作普标准既有户的譬如说缓冲器 (prioritizer)。同时也可以在 configurations 内都内置就其的譬如说缓冲器 (prioritizer)。以外所 Placement 内置支持者的譬如说缓冲器 (prioritizer) 仅限于平衡静止状态 (Balance),稳定 (Steady),最大者可平均分配CPU森林资源 (ResourceAllocatableCPU) 和最大者可平均分配线程森林资源 (ResourceAllocatableMemory)。Placement 同时也支持者通过第三方发放的平均分来必必需坦克部队。weight 系数是一个 -10 到 10 的整数,用意优化完全相异的譬如说缓冲器更高分对平均分的严重影响。

如果未界定 Spec 内都各字段的个数,则用作普标准既有户个数。每个字段内都普标准既有户个数的详尽信息在 PlacementSpec[5] 内都界定。

如果 Spec 为空,所有加载到 Placement 名称室内空间 (namespace) 的 ManagedClusterSet 内都的所有 ManagedCluster 将作为似乎的选项。

以上每个字段的界定都在调拨内都发挥着作用。如下是一个典型的调拨更进一步:

调拨组件首先从 clusterSets 内都界定的 ManagedClusterSet 内都必必需显露可视的 ManagedCluster。 过滤缓冲器该软件 (filter plugin) 通过复赛手段 predicates 内都界定的附加 (label) 和声明 (claim) 必必需缓冲器进一步配对 ManagedCluster。 在譬如说手段 prioritizerPolicy 完工的譬如说缓冲器该软件 (prioritizer plugin) 亦会为每个配对后的 ManagedCluster 打一个平均分,并且按平均分从高到更高确切权重。 调拨组件亦会必必需前所 k 个 ManagedCluster,并把这些坦克部队列在 PlacementDecision 内都。k 的个数是在 numberOfClusters 界定的坦克部队数目。

如果将以上两步并不相异的上述的举例内都,调拨更进一步如下:

调拨组件首先必必需 ManagedClusterSet clusterset1 和 clusterset2 内都的坦克部队作为可视的 ManagedCluster。 过滤缓冲器该软件 (filter plugin) 配对显露带有附加 (label)vendor=OpenShift 的 ManagedCluster。 譬如说缓冲器该软件 (prioritizer plugin)ResourceAllocatableMemory 和 Steady 为每一个配对的 ManagedCluster 更高分。当内置了譬如说手段 AddOn,Placement 亦会设法给予坦克部队并不相异的第三方森林资源发放的平均分 cpuratio。并用如下方程组计算每个 ManagedCluster 的平均分:

1(ResourceAllocatableMemory 的普标准既有户系数) * ResourceAllocatableMemory 的更高分 + 3(Steady 的系数) * Steady 的更高分 + 1(AddOn 的普标准既有户系数) * cpuratio(AddOn 的平均分)

调拨组件按照每个 ManagedCluster 的平均分从高到更高分列,并返回最高平均分的 ManagedCluster 作为结果。

在第 3 步譬如说缓冲器该软件实习时,仅仅多个该软件的组合。每个该软件的算法和系数都亦会严重影响再一的调拨结果。下一节内都,亦会更为详尽的参考每个该软件,以之前你更为好的洞察 Placement是如何必必需 ManagedCluster 的。

譬如说缓冲器该软件如何实习?

在撰写此文时,我们有如下四个普标准既有户的譬如说缓冲器:

平衡静止状态 (Balance): 平衡静止状态每个坦克部队上的调拨执行者 (PlacementDecision) 数目。拥有 PlacementDecision 数目多于的坦克部队将赢取最更高分 -100 分,如果并未 PlacementDecision 则被区分开优胜者 100 分。其他的平均分介于 -100 到 100 二者之间。 稳定 (Steady): 确保现有的 PlacementDecision 内都已选坦克部队的结果保有稳定。现有的 PlacementDecision 仍然顺位的坦克部队将赢取优胜者 100 分,并未被顺位的坦克部队赢取最更高分 0 分。 最大者可平均分配 CPU 森林资源 (ResourceAllocatableCPU) 和最大者可平均分配线程森林资源 (ResourceAllocatableMemory) 基于坦克部队的可平均分配 CPU 或者线程动手执行者。拥有多于可平均分配森林资源(CPU 或者线程)的坦克部队将赢取优胜者 100 分,拥有最少森林资源的坦克部队将赢取最更高分 -100分。其他的平均分介于 -100 到 100 二者之间。

譬如说手段 AddOn 还支持者通过第三方发放的平均分必必需坦克部队。这部分也是 Placement 在 OCM v0.6.0 内都的除此以外原先功能。OCM v0.6.0 内都发放了继续 API AddOnPlacementScore 用意支持者一种基于自界定平均分的更为具可拓展性的调拨方式。

作为介面,可以在 yaml 份文件内都 prioritizerPolicy 下内置 AddOn,来指定自界定平均分以必必需坦克部队。 作为平均分的发放者,第三方的控制缓冲器 (controller) 可以在内都心 (Hub Cluster) 或附属;还有 (Managed Cluster) 上运行,controller 无必需维护 AddOnPlacementScore 的生命周期并将平均分更为换到其内都。

关于可拓展调拨的更为多详尽素材,可以详见小区文档[6]。

在动手显露调拨执行者时,ManagedCluster 按照再一的平均分排序。平均分是每个譬如说缓冲器的更高分除以系数的总和: 平均分 = sum(prioritizer_x_weight * prioritizer_x_score),其内都 prioritizer_x_weight 是譬如说缓冲器 (prioritizer)X 的系数,prioritizer_x_score是譬如说缓冲器 (prioritizer)X 为一个 ManagedCluster 挥显露平均分。

可以通过优化譬如说缓冲器 (prioritizer) 的系数来严重影响再一的平均分,比如:

通过给森林资源类型的譬如说缓冲器 ResourceAllocatableCPU 和 ResourceAllocatableMemory 另设系数,来基于可平均分配的森林资源动手调拨。 通过给森林资源类型的譬如说缓冲器另设一个更为高的系数,使得调拨结果对于森林资源的转变变得寻常。 通过给譬如说缓冲器 Steady 另设更为高的系数,使得调拨结果可以忽略森林资源的转变保有稳定。

如下是一些实际的举例,来说明多个譬如说缓冲器是如何协力实习以赢取再一的调拨结果。这些举例也可以当成是在一些一幕下的最佳倡导。

以下请注意内都假设有三个附属坦克部队 (ManagedCluster) 加载在名称室内空间 (namespace)ns1, 其内都 cluster1,cluster2,cluster3 分别有 60MB,80MB 和 100MB 可平均分配线程。

请注意 1:必必需很强最大者可平均分配线程的坦克部队。

在此请注意内都,想要必必需很强最大者可平均分配线程的坦克部队。为了按可平均分配线程对坦克部队同步进行权重排序,可以在譬如说手段 (prioritizerPolicy) 内都内置ResourceAllocatableMemory。

apiVersion: cluster.open-cluster-management.io/v1alpha1

kind: Placement

metadata:

name: demo

namespace: ns1

spec:

numberOfClusters: 2

prioritizerPolicy:

configurations:

- scoreCoordinate:

builtIn: ResourceAllocatableMemory

Placement创建者之后,可以通过oc describe placement指令,查看events来洞察权重排序是如何顺位坦克部队的。

# oc describe placement demo -n ns1

Name: demo

Namespace: ns1

Labels:

Annotations:

API Version: cluster.open-cluster-management.io/v1alpha1

Kind: Placement

Status:

Conditions:

Last Transition Time: 2021-11-09T07:02:14Z

Message: All cluster decisions scheduled

Reason: AllDecisionsScheduled

Status: True

Type: PlacementSatisfied

Number Of Selected Clusters: 2

Events:

Type Reason Age From Message

-- ---- -- -- -----

Normal DecisionCreate 10s placementController Decision demo-decision-1 is created with placement demo in namespace ns1

Normal DecisionUpdate 10s placementController Decision demo-decision-1 is updated with placement demo in namespace ns1

Normal ScoreUpdate 10s placementController cluster1:0 cluster2:100 cluster3:200

在这个举例内都,在 Additive 方式而下,譬如说缓冲器仅限于了普标准既有户系数为 1 的 Balance 和 Steady 以及显示内置了系数为 1 的 ResourceAllocatableMemory。一个坦克部队的再一得分将由如下方程组决定:

1 * prioritizer_balance_score + 1 * prioritizer_steady_score + 1 * prioritizer_resourceallocatablememory_score

从里面的 event 内都可以看显露来,cluster1 平均可分 0,cluster2 平均可分 100,cluster3 平均可分 200。调拨结果不该必必需 cluster2 和 cluster3。

可以通过 oc describe placementdecision 指令来验证调拨结果,如下:

# oc describe placementdecision demo-decision-1 -n ns1

Name: demo-decision-1

Namespace: ns1

Labels: cluster.open-cluster-management.io/placement=placement-jkd42

Annotations:

API Version: cluster.open-cluster-management.io/v1alpha1

Kind: PlacementDecision

Status:

Decisions:

Cluster Name: cluster2

Reason:

Cluster Name: cluster3

Reason:

Events:

可以看着,在 PlacementDecision 的 status 内都,cluster2 和 cluster3 被列在其内都。

让我们设法加到一个继续坦克部队,并且这个坦克部队上看作比被顺位坦克部队高一些的可平均分配线程。

Placement 调拨缓冲器亦会监视 (watch) 附属坦克部队。一旦有森林资源转变,将启动时继续调拨。过去,让我们起初加到一个有 100MB 可平均分配线程的原先坦克部队 cluster4,同时检验 Placement 内都的意外事件 (event)。

# oc describe placement demo -n ns1

Events:

Type Reason Age From Message

-- ---- -- -- -----

Normal DecisionCreate 100s placementController Decision demo-decision-1 is created with placement demo in namespace ns1

Normal DecisionUpdate 100s placementController Decision demo-decision-1 is updated with placement demo in namespace ns1

Normal ScoreUpdate 100s placementController cluster1:0 cluster2:100 cluster3:200

可以看着并并未意外事件更为换,调拨结果也并未引发转变。所以当我们加到一个仅仅比 cluster2 的线程高 20MB 的 cluster4 时,调拨结果并不亦会被严重影响。

让我们设法加到一个继续坦克部队,并且这个坦克部队上看作比被顺位坦克部队高很多的可平均分配线程。

过去,让我们起初加到一个有 150MB 可平均分配线程的原先坦克部队 cluster4,同时最终检验 Placement 内都的意外事件 (event)。

# oc describe placement demo -n ns1

Events:

Type Reason Age From Message

-- ---- -- -- -----

Normal DecisionCreate 2m10s placementController Decision demo-decision-1 is created with placement demo in namespace ns1

Normal DecisionUpdate 2m10s placementController Decision demo-decision-1 is updated with placement demo in namespace ns1

Normal ScoreUpdate 2m10s placementController cluster1:0 cluster2:100 cluster3:200

Normal DecisionUpdate 3s placementController Decision demo-decision-1 is updated with placement demo in namespace ns1

Normal ScoreUpdate 3s placementController cluster1:200 cluster2:145 cluster3:189 cluster4:200

这一次,调拨结果更为换了,Placement 被继续调拨到了 cluster3 和 cluster4 上。

# oc describe placementdecision demo-decision-1 -n ns1

Status:

Decisions:

Cluster Name: cluster3

Reason:

Cluster Name: cluster4

Reason:

在里面这个举例内都,当森林资源只引发了少许转变时,调拨结果并不亦会被严重影响。而当森林资源引发相比较大的转变时,转变亦会立刻反应在调拨结果内都。这样之前引发显露如下 2 个面对:

如果想要调拨结果对森林资源转变保有寻常,不该怎么动手? 如果想要调拨结果保有稳定,忽略森林资源的转变,不该怎么动手?

还想起我们在 prioritizerPolicy 内都有 4 个譬如说缓冲器并且可以优化他们的系数吗?我们可以通过修改 prioritizerPolicy 的内置来应付里面两个关键问题。

请注意 2:必必需很强最大者可平均分配线程的;还有,并使 Placement 对森林资源转变保有寻常。

为了使调拨结果对森林资源的转变寻常,这次我们显式另设了譬如说缓冲器 ResourceAllocatableMemory,系数为 3。

apiVersion: cluster.open-cluster-management.io/v1alpha1

kind: Placement

metadata:

name: placement7

namespace: ns1

spec:

numberOfClusters: 2

prioritizerPolicy:

configurations:

- scoreCoordinate:

builtIn: ResourceAllocatableMemory

weight: 3

当 Placement 创建者好之后,让我们通过 oc describe 指令来检验 Placement 和 PlacementDecision 的结果。

# oc describe placement demo -n ns1

Status:

Conditions:

Last Transition Time: 2021-11-09T08:58:40Z

Message: All cluster decisions scheduled

Reason: AllDecisionsScheduled

Status: True

Type: PlacementSatisfied

Number Of Selected Clusters: 2

Events:

Type Reason Age From Message

-- ---- -- -- -----

Normal DecisionCreate 35s placementController Decision demo-decision-1 is created with placement demo in namespace ns1

Normal DecisionUpdate 35s placementController Decision demo-decision-1 is updated with placement demo in namespace ns1

Normal ScoreUpdate 35s placementController cluster1:-200 cluster2:100 cluster3:400

# oc describe placementdecision demo-decision-1 -n ns1

Status:

Decisions:

Cluster Name: cluster2

Reason:

Cluster Name: cluster3

Reason:

初始的调拨结果为 cluster2 和 cluster3。过去,让我们起初最终加入一个有 100MB 可平均分配线程的坦克部队,然后检验 Placement 意外事件。

# oc describe placement demo -n ns1

Events:

Type Reason Age From Message

-- ---- -- -- -----

Normal DecisionCreate 3m1s placementController Decision demo-decision-1 is created with placement demo in namespace ns1

Normal DecisionUpdate 3m1s placementController Decision demo-decision-1 is updated with placement demo in namespace ns1

Normal ScoreUpdate 3m1s placementController cluster1:-200 cluster2:100 cluster3:400

Normal DecisionUpdate 2s placementController Decision demo-decision-1 is updated with placement demo in namespace ns1

Normal ScoreUpdate 2s placementController cluster1:-200 cluster2:200 cluster3:500 cluster4:400

这一次,PlacementDecision 更为换了,并且结果继续调拨到了 cluster3 和 cluster4。

# oc describe placementdecision demo-decision-1 -n ns1

Status:

Decisions:

Cluster Name: cluster3

Reason:

Cluster Name: cluster4

Reason:

请注意 3:必必需很强最大者可平均分配线程的坦克部队并稳定调拨结果。

为了使调拨结果保有稳定,这次我们显式另设了譬如说缓冲器 Steady,并且另设系数为 3。

apiVersion: cluster.open-cluster-management.io/v1alpha1

kind: Placement

metadata:

name: demo

namespace: ns1

spec:

numberOfClusters: 2

prioritizerPolicy:

configurations:

- scoreCoordinate:

builtIn: ResourceAllocatableMemory

- scoreCoordinate:

builtIn: Steady

weight: 3

Placement 创建者好之后,最终通过 oc describe 指令来检验 Placement 和 PlacementDecision 的结果。

# oc describe placement demo -n ns1

Status:

Conditions:

Last Transition Time: 2021-11-09T09:05:36Z

Message: All cluster decisions scheduled

Reason: AllDecisionsScheduled

Status: True

Type: PlacementSatisfied

Number Of Selected Clusters: 2

Events:

Type Reason Age From Message

-- ---- -- -- -----

Normal DecisionCreate 15s placementController Decision demo-decision-1 is created with placement demo in namespace ns1

Normal DecisionUpdate 15s placementController Decision demo-decision-1 is updated with placement demo in namespace ns1

Normal ScoreUpdate 15s placementController cluster1:0 cluster2:100 cluster3:200

# oc describe placementdecision demo-decision-1 -n ns1

Status:

Decisions:

Cluster Name: cluster2

Reason:

Cluster Name: cluster3

Reason:

初始的调拨结果为 cluster2 和 cluster3。

过去,让我们起初最终加入一个有 150MB 可平均分配线程的坦克部队,然后检验 Placement 意外事件。这一次 event 并并未更为换。

# oc describe placement demo -n ns1

Events:

Type Reason Age From Message

-- ---- -- -- -----

Normal DecisionCreate 80s placementController Decision demo-decision-1 is created with placement demo in namespace ns1

Normal DecisionUpdate 80s placementController Decision demo-decision-1 is updated with placement demo in namespace ns1

Normal ScoreUpdate 80s placementController cluster1:0 cluster2:100 cluster3:200

最终检验 PlacementDecision,可以看着调拨结果并并未转变,通常在了 cluster2 和 cluster3。

# oc describe placementdecision demo-decision-1 -n ns1

Status:

Decisions:

Cluster Name: cluster2

Reason:

Cluster Name: cluster3

Reason:

在前所面的三个请注意内都,我们展示了多个譬如说缓冲器是如何协同实习的,以及如何通过优化每个譬如说缓冲器的系数来严重影响再一执行者。在用作内都,你也可以按必需求设法优化系数或修改已完工的譬如说缓冲器。

阐述

通过本文,你可以洞察到如何在完全相异的运用于一幕下用作 Placement API。这篇文章解释了什么是 Placement 以及它如何和一些主流的开源项目配合用作。参考了 Placement 如何必必需坦克部队,以及通过一些请注意展示多个譬如说缓冲器是如何协力实习并动手显露调拨执行者的。在文章的之前,发放了一些请注意来展示最佳倡导。喜爱随时在 open-cluster-management-io GitHub 小区[7]内都设想关键问题,或用作 Slack[8]与我们联系,同时加入我们的 Google Groups 以在线我们的定期小区亦大会。

未来我们将在 OCM 内都看着更为多融合 OCM 见习调拨潜能的其他见习原先功能模块,比如多坦克部队 Workload 调拨/容灾等等。

方面页面

[1] Open Cluster Management 0.6 发布:

[2] OCM 小区:

[3] ManagedCluster 和 ManagedClusterSet:

[4] Placement:

[5] PlacementSpec:

[6] 小区文档:

[7] open-cluster-management-io GitHub 小区:

[8] Slack:

详见:

本文为阿内都云原创素材,未获允许不得转载。

贵阳甲状腺检查哪家医院好
广州癫痫医院哪家专业好
北京牛皮癣医院怎么样
银川男科检查哪些项目
沈阳看妇科去哪家医院好
腱鞘炎吃什么药管用
类风湿关节僵硬可以治疗吗
眼睛干涩疼痛有什么办法解决
视疲劳的治疗方法
有机黄芪和普通黄芪有什么区别
友情链接