CNCF 沙箱项目 OCM Placement 多集群调度指南
作者:
?邱見|紅帽資深軟件工程師,Open Cluster Management (OCM) 社區(qū)發(fā)起人,負責人?
?郝青|紅帽高級軟件工程師,Open Cluster Management (OCM) 社區(qū)維護者
?Open Cluster Management(OCM) 項目已經(jīng)在 2021 年 11 月 9 日成為 CNCF 的沙箱項目。OCM 作為一個社區(qū)驅(qū)動的項目,專注于 Kubernetes 應(yīng)用程序的多集群和多云場景。?
最新 OCM 社區(qū)版本 0.6.0 已于 2022 年 1 月 21 日正式發(fā)布。詳細內(nèi)容可訪問?Open Cluster Management 0.6 發(fā)布 [1] 。
在多集群環(huán)境中,不同角色的用戶對多集群操作有著不同的需求。比如管理員等用戶需要對目標集群進行一些配置, 應(yīng)用程序開發(fā)人員可能希望將工作負載部署到特定集群,這些工作負載可以是 Kubernetes 的 Service、Deployment、ConfigMap 或不同 Kubernetes 對象的捆綁包。這些用戶對目標集群會有一些要求,比如:
- 我只想在 Amazon Web Services(AWS) 上配置集群。
- 我只想將工作負載部署到標簽為 group=dev 的集群上。
- 我希望工作負載始終在具有最大可分配內(nèi)存的 3 個集群上運行。
為了選擇出目標集群,可以選擇在部署管道 (deploy pipeline) 中對直接指定目標集群名稱,或使用某種形式的標簽選擇器。對于對資源有要求的工作負載,需要一個細粒度的調(diào)度器來將工作負載分發(fā)到具有足夠資源的群集。當群集屬性更改時,調(diào)度結(jié)果應(yīng)該保持動態(tài)更新。
在 OCM 中,前面描述的調(diào)度功能是通過 Placement 來實現(xiàn)的。在這篇文章中,將介紹 Placement 如何選擇到所需的集群,Placement 可以提供的調(diào)度功能,以及一些場景下的最佳實踐,使用者可以參考示例來編寫符合自己要求的 Placement。其他一些高級調(diào)度功能,如支持污點 (taints) 和容忍 (tolerations),以及拓撲選擇 (spread),正在?OCM 社區(qū) [2] 討論中。
在閱讀本文前,可訪問以下鏈接了解相關(guān)基本概念:
- ManagedCluster 和 ManagedClusterSet [3]
- Placement [4]
為什么我們需要ManagedClusterSet?
“ClusterSet”是在 Kubernetes SIG 多集群工作小組的“多集群服務(wù) (MultiClusterService/MCS)”API 中已經(jīng)實踐許久的概念,它意指多個擁有相同屬性/特征的“集群小組”的概念。在多集群網(wǎng)絡(luò)的場景里我們需要根據(jù)底座基礎(chǔ)設(shè)施的拓撲為集群分組,同樣的在 OCM 多集群管理平臺里我也可以根據(jù)集群的場景用途,工作特性具體分組。這也是 OCM 引入 ClusterSet 模型的最初緣由之一。
在此基礎(chǔ)上,OCM 在引入多集群分組的語義的同時考慮到了不同分組之間的“軟租戶隔離性” — 尤其考慮到不同集群小組可能是由不同的角色/團隊去維護的,同時這些團隊之間應(yīng)該相互自治不干擾。在 OCM 的世界中,我們會允許管理員為每一種角色/團隊會分配一個命名空間/namespace,同時通過利用 Kubernetes 原生提供的命名空間之間的隔離性使不同角色區(qū)別開來(其中所謂的角色落進實際場景里可以是一個應(yīng)用或者也可以是一個組織團隊等等)。那么這些角色只要在被分配的命名空間里活動就可以充分編排所關(guān)聯(lián)的多個集群上的資源。
總而言之,在一個通用的多集群中樞控制平面里,如何解決多個用戶/角色分離的問題其實是最首要的問題之一,OCM 之所以引入了 ClusterSet 模型且額外提供了其到命名空間的映射,是為了希望 OCM 作為一個平臺能解決“多集群場景”里幫助用戶解決最瑣碎同時又最操心的問題。至于如何消費所關(guān)聯(lián)的集群列表請參考下面的 Placement 模型。
什么是 Placement?
Placement API 用于在一個或多個托管集群組(ManagedClusterSet)中選擇一組托管群集(ManagedCluster),以便將工作負載部署到這些群集上。
如果定義了有效的 Placement,則 Placement 控制器 (controller) 將生成相應(yīng)的調(diào)度決策 (PlacementDecision),并在狀態(tài) (Status) 中列出選定的托管群集 (ManagedCluster)。作為最終用戶,你可以解析出選定的集群,然后對目標集群進行操作。你也可以將更高層級的工作負載編排器 (orchestrator) 與 PlacementDecision 集成,來擴展 Placement 的調(diào)度能力。
例如,ArgoCD 已經(jīng)與 Placement 集成。ArgoCD 的使用者可以在 ApplicationSet 的 clusterDecisionResource 中指定一個關(guān)聯(lián)了的 PlacementDecision 資源的 ConfigMap,就可以利用 Placement 的調(diào)度決策,將應(yīng)用自動分配到一組目標集群。如下:
apiVersion: argoproj.io/v1alpha1 kind: ApplicationSet metadata:name: book-import spec:generators:- clusterDecisionResource:configMapRef: ocm-placementlabelSelector:matchLabels:cluster.open-cluster-management.io/placement: local-clusterrequeueAfterSeconds: 30template: …apiVersion: v1 kind: ConfigMap metadata:name: ocm-placement data:apiVersion: cluster.open-cluster-management.io/v1alpha1kind: placementdecisionsstatusListKey: decisionsmatchKey: clusterNameapiVersion: cluster.open-cluster-management.io/v1alpha1 kind: PlacementDecision metadata:labels:cluster.open-cluster-management.io/placement: local-clustername: local-cluster-decision-1 status:decisions:- clusterName: cluster1reason: ""- clusterName: cluster2reason: ""KubeVela 作為開放應(yīng)用程序模型 OAM(Open Application Model) 的實現(xiàn),也即將利用 Placement API 進行工作負載調(diào)度。
與原生 Kubernetes 調(diào)度模型的區(qū)別與聯(lián)系?
與 Kubernetes 的靜態(tài)調(diào)度不同,Placement 使用動態(tài)調(diào)度的機制。調(diào)度抉擇會隨著集群屬性變化也隨之改變,用戶可以通過在 Placement 上調(diào)整調(diào)度的穩(wěn)定值來減少調(diào)度決策的抖動。另外,Placement API 嘗試將整個調(diào)度過程顯示化,讓用戶可以通過 API 查詢調(diào)度抉擇的原委,方便用戶更加容易的調(diào)試調(diào)度配置和參數(shù)。
同時在原生 Kubernetes 中的調(diào)度是一次性的,而在多集群場景里我們往往需要的是一個“聲明式的調(diào)度” — 我們定義出調(diào)度策略的“硬條件”和“軟條件”是什么,再根據(jù)實際的集群拓撲/實時狀態(tài)決策最終匹配的集群,所以它更像是原生 Kubernetes 中的驅(qū)散調(diào)度/反調(diào)度 PodDisruptionBudget 的模型而非靜態(tài)調(diào)度中的 Taint/Toleration 的模型。
OCM 在 Placement 模型中同時考慮到了大規(guī)模多集群調(diào)度時集群列表長度暴漲的問題,在 Placement 的匹配產(chǎn)物 PlacementDecision 中所有匹配結(jié)果都是分頁展示的以避免突破 Kubernetes CRD 對模型的限制。
Placement 如何選擇集群?
有了上述的初步介紹,讓我們更深入地了解 Placement API,看看它是如何選擇所需的集群以及它可以提供哪些調(diào)度功能。
如下是一個 Placement 例子:
apiVersion: cluster.open-cluster-management.io/v1alpha1 kind: Placement metadata:name: placementnamespace: ns1 spec:numberOfClusters: 4clusterSets:- clusterset1- clusterset2predicates:- requiredClusterSelector:labelSelector:matchLabels:vendor: OpenShiftprioritizerPolicy:mode: Exactconfigurations:- scoreCoordinate:builtIn: ResourceAllocatableMemory- scoreCoordinate:builtIn: Steadyweight: 3- scoreCoordinate:type: AddOnaddOn:resourceName: defaultscoreName: cpuratioSpec 包含以下四個字段:
-
numberOfClusters: 表示要選擇的符合要求的 ManagedClusters 數(shù)量。
-
clusterSets: 表示從中選擇 ManagedCluster 的 ManagedClusterSet 名稱。
-
predicates: 包括了一組預選策略。可以使用標簽選擇器 (labelSelector) 和聲明選擇器 (claimSelector) 來選擇 ManagedCluster。每一個預選策略配置之間是或的關(guān)系。
-
prioritizerPolicy: 定義了優(yōu)選策略。優(yōu)選策略中通過 mode 設(shè)置是否使用默認的優(yōu)選器 (prioritizer)。同時也可以在 configurations 中配置具體的優(yōu)選器 (prioritizer)。目前 Placement 內(nèi)置支持的優(yōu)選器 (prioritizer) 包括平衡 (Balance),穩(wěn)定 (Steady),最大可分配CPU資源 (ResourceAllocatableCPU) 和最大可分配內(nèi)存資源 (ResourceAllocatableMemory)。Placement 同時也支持通過第三方提供的分數(shù)來選擇集群。weight 權(quán)重是一個 -10 到 10 的整數(shù),用以調(diào)整不同的優(yōu)選器打分對總分的影響。
如果未定義 Spec 中各字段的值,則使用默認值。每個字段中默認值的詳細信息在?PlacementSpec [5] ?中定義。
如果 Spec 為空,所有綁定到 Placement 命名空間 (namespace) 的?ManagedClusterSet?中的所有 ManagedCluster 將作為可能的選項。
以上每個字段的定義都在調(diào)度中發(fā)揮著作用。如下是一個典型的調(diào)度過程:
調(diào)度框架首先從 clusterSets 中定義的 ManagedClusterSet 中選擇出可用的 ManagedCluster。
過濾器插件 (filter plugin) 通過預選策略 predicates 中定義的標簽 (label) 和聲明 (claim) 選擇器進一步篩選 ManagedCluster。
在優(yōu)選策略 prioritizerPolicy 啟用的優(yōu)選器插件 (prioritizer plugin) 會為每個篩選后的 ManagedCluster 打一個分數(shù),并且按總分從高到低確定優(yōu)先級。
調(diào)度框架會選擇前 k 個 ManagedCluster,并把這些集群列在 PlacementDecision 中。k 的值是在 numberOfClusters 定義的集群數(shù)量。
如果將以上步驟對應(yīng)的上述的例子中,調(diào)度過程如下:
1(ResourceAllocatableMemory 的默認權(quán)重) * ResourceAllocatableMemory 的打分 + 3(Steady 的權(quán)重) * Steady 的打分 + 1(AddOn 的默認權(quán)重) * cpuratio(AddOn 的分數(shù))
在第 3 步優(yōu)選器插件工作時,實際上多個插件的組合。每個插件的算法和權(quán)重都會影響最終的調(diào)度結(jié)果。下一節(jié)中,會更詳細的介紹每個插件,以便你更好的了解 Placement是如何選擇 ManagedCluster 的。
優(yōu)選器插件如何工作?
在撰寫此文時,我們有如下四個默認的優(yōu)選器:
-
平衡 (Balance): 平衡每個集群上的調(diào)度決策 (PlacementDecision) 數(shù)量。擁有 PlacementDecision 數(shù)量最多的集群將得到最低分 -100 分,如果沒有 PlacementDecision 則被賦予最高分 100 分。其他的分數(shù)介于 -100 到 100 之間。
-
穩(wěn)定 (Steady): 確?,F(xiàn)有的 PlacementDecision 中已選集群的結(jié)果保持穩(wěn)定?,F(xiàn)有的 PlacementDecision 已經(jīng)選中的集群將得到最高分 100 分,沒有被選中的集群得到最低分 0 分。
-
最大可分配 CPU 資源 (ResourceAllocatableCPU) 和最大可分配內(nèi)存資源 (ResourceAllocatableMemory)?基于集群的可分配 CPU 或者內(nèi)存做決策。擁有最多可分配資源(CPU 或者內(nèi)存)的集群將得到最高分 100 分,擁有最少資源的集群將得到最低分 -100分。其他的分數(shù)介于 -100 到 100 之間。
優(yōu)選策略 AddOn 還支持通過第三方提供的分數(shù)選擇集群。這部分也是 Placement 在 OCM v0.6.0 中的最新功能。OCM v0.6.0 中提供了新的 API AddOnPlacementScore 用以支持一種基于自定義分數(shù)的更具可擴展性的調(diào)度方式。
-
作為使用者,可以在 yaml 文件中 prioritizerPolicy 下配置 AddOn,來指定自定義分數(shù)以選擇集群。
-
作為分數(shù)的提供者,第三方的控制器 (controller) 可以在中心 (Hub Cluster) 或托管群集 (Managed Cluster) 上運行,controller 需要維護 AddOnPlacementScore 的生命周期并將分數(shù)更新到其中。
關(guān)于可擴展調(diào)度的更多詳細內(nèi)容,可以參考社區(qū)文檔 [6] 。
在做出調(diào)度決策時,ManagedCluster 按照最終的總分排序。總分是每個優(yōu)選器的打分乘以權(quán)重的總和: 總分 = sum(prioritizer_x_weight * prioritizer_x_score),其中 prioritizer_x_weight 是優(yōu)選器 (prioritizer)X 的權(quán)重,prioritizer_x_score是優(yōu)選器 (prioritizer)X 為一個 ManagedCluster 打的分數(shù)。
可以通過調(diào)整優(yōu)選器 (prioritizer) 的權(quán)重來影響最終的分數(shù),比如:
-
通過給資源類型的優(yōu)選器 ResourceAllocatableCPU 和 ResourceAllocatableMemory 設(shè)置權(quán)重,來基于可分配的資源做調(diào)度。
-
通過給資源類型的優(yōu)選器設(shè)置一個更高的權(quán)重,使得調(diào)度結(jié)果對于資源的變化更加敏感。
-
通過給優(yōu)選器 Steady 設(shè)置更高的權(quán)重,使得調(diào)度結(jié)果可以忽略資源的變化保持穩(wěn)定。
如下是一些實際的例子,來說明多個優(yōu)選器是如何共同工作以得到最終的調(diào)度結(jié)果。這些例子也可以視為是在一些場景下的最佳實踐。
以下示例中假設(shè)有三個托管集群 (ManagedCluster) 綁定在命名空間 (namespace)ns1,?其中 cluster1,cluster2,cluster3 分別有 60MB,80MB 和 100MB 可分配內(nèi)存。
示例 1:選擇具有最大可分配內(nèi)存的集群。
在此示例中,希望選擇具有最大可分配內(nèi)存的集群。為了按可分配內(nèi)存對集群進行優(yōu)先級排序,可以在優(yōu)選策略 (prioritizerPolicy) 中配置ResourceAllocatableMemory。
apiVersion: cluster.open-cluster-management.io/v1alpha1 kind: Placement metadata:name: demonamespace: ns1 spec:numberOfClusters: 2prioritizerPolicy:configurations:- scoreCoordinate:builtIn: ResourceAllocatableMemoryPlacement創(chuàng)建之后,可以通過oc describe placement命令,查看events來了解優(yōu)先級排序是如何選中集群的。
# oc describe placement demo -n ns1 Name: demo Namespace: ns1 Labels: <none> Annotations: <none> API Version: cluster.open-cluster-management.io/v1alpha1 Kind: Placement … Status:Conditions:Last Transition Time: 2021-11-09T07:02:14ZMessage: All cluster decisions scheduledReason: AllDecisionsScheduledStatus: TrueType: PlacementSatisfiedNumber 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 ns1Normal DecisionUpdate 10s placementController Decision demo-decision-1 is updated with placement demo in namespace ns1Normal ScoreUpdate 10s placementController cluster1:0 cluster2:100 cluster3:200在這個例子中,在 Additive 模式下,優(yōu)選器包括了默認權(quán)重為 1 的 Balance 和 Steady 以及顯示配置了權(quán)重為 1 的 ResourceAllocatableMemory。一個集群的最終得分將由如下公式?jīng)Q定:
1 * prioritizer_balance_score +? 1 * prioritizer_steady_score +? 1 * prioritizer_resourceallocatablememory_score
從上面的 event 中可以看出來,cluster1 總分為 0,cluster2 總分為 100,cluster3 總分為 200。調(diào)度結(jié)果應(yīng)該選擇 cluster2 和 cluster3。
可以通過 oc describe placementdecision 命令來驗證調(diào)度結(jié)果,如下:
# oc describe placementdecision demo-decision-1 -n ns1 Name: demo-decision-1 Namespace: ns1 Labels: cluster.open-cluster-management.io/placement=placement-jkd42 Annotations: <none> API Version: cluster.open-cluster-management.io/v1alpha1 Kind: PlacementDecision ... Status:Decisions:Cluster Name: cluster2Reason: Cluster Name: cluster3Reason: Events: <none>可以看到,在 PlacementDecision 的 status 中,cluster2 和 cluster3 被列在其中。
讓我們嘗試添加一個新的集群,并且這個集群上有著比被選中集群高出一些的可分配內(nèi)存。
Placement 調(diào)度器會監(jiān)視 (watch) 托管集群。一旦有資源變化,將觸發(fā)重新調(diào)度?,F(xiàn)在,讓我們試著添加一個有 100MB 可分配內(nèi)存的新集群 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 ns1Normal DecisionUpdate 100s placementController Decision demo-decision-1 is updated with placement demo in namespace ns1Normal ScoreUpdate 100s placementController cluster1:0 cluster2:100 cluster3:200可以看到并沒有事件更新,調(diào)度結(jié)果也沒有發(fā)生變化。所以當我們添加一個僅僅比 cluster2 的內(nèi)存高出 20MB 的 cluster4 時,調(diào)度結(jié)果并不會被影響。
讓我們嘗試添加一個新的集群,并且這個集群上有著比被選中集群高出很多的可分配內(nèi)存。
現(xiàn)在,讓我們試著添加一個有 150MB 可分配內(nèi)存的新集群 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 ns1Normal DecisionUpdate 2m10s placementController Decision demo-decision-1 is updated with placement demo in namespace ns1Normal ScoreUpdate 2m10s placementController cluster1:0 cluster2:100 cluster3:200Normal DecisionUpdate 3s placementController Decision demo-decision-1 is updated with placement demo in namespace ns1Normal ScoreUpdate 3s placementController cluster1:200 cluster2:145 cluster3:189 cluster4:200這一次,調(diào)度結(jié)果更新了,Placement 被重新調(diào)度到了 cluster3 和 cluster4 上。
# oc describe placementdecision demo-decision-1 -n ns1 ... Status:Decisions:Cluster Name: cluster3Reason: Cluster Name: cluster4Reason:在上面這個例子中,當資源只發(fā)生了少許變化時,調(diào)度結(jié)果并不會被影響。而當資源發(fā)生比較大的變化時,變化會立刻反應(yīng)在調(diào)度結(jié)果中。這樣便引發(fā)出如下 2 個挑戰(zhàn):
-
如果希望調(diào)度結(jié)果對資源變化保持敏感,應(yīng)該怎么做?
-
如果希望調(diào)度結(jié)果保持穩(wěn)定,忽略資源的變化,應(yīng)該怎么做?
還記得我們在 prioritizerPolicy 中有 4 個優(yōu)選器并且可以調(diào)整他們的權(quán)重嗎?我們可以通過修改 prioritizerPolicy 的配置來解決上面兩個問題。
示例 2:選擇具有最大可分配內(nèi)存的群集,并使 Placement 對資源變化保持敏感。
為了使調(diào)度結(jié)果對資源的變化敏感,這次我們顯式設(shè)置了優(yōu)選器 ResourceAllocatableMemory,權(quán)重為 3。
apiVersion: cluster.open-cluster-management.io/v1alpha1 kind: Placement metadata:name: placement7namespace: ns1 spec:numberOfClusters: 2prioritizerPolicy:configurations:- scoreCoordinate:builtIn: ResourceAllocatableMemoryweight: 3當 Placement 創(chuàng)建好之后,讓我們通過 oc describe 命令來檢查 Placement 和 PlacementDecision 的結(jié)果。
# oc describe placement demo -n ns1 ... Status:Conditions:Last Transition Time: 2021-11-09T08:58:40ZMessage: All cluster decisions scheduledReason: AllDecisionsScheduledStatus: TrueType: PlacementSatisfiedNumber 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 ns1Normal DecisionUpdate 35s placementController Decision demo-decision-1 is updated with placement demo in namespace ns1Normal ScoreUpdate 35s placementController cluster1:-200 cluster2:100 cluster3:400 # oc describe placementdecision demo-decision-1 -n ns1 ... Status:Decisions:Cluster Name: cluster2Reason: Cluster Name: cluster3Reason:初始的調(diào)度結(jié)果為 cluster2 和 cluster3?,F(xiàn)在,讓我們試著再次加入一個有 100MB 可分配內(nèi)存的集群,然后檢查 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 ns1Normal DecisionUpdate 3m1s placementController Decision demo-decision-1 is updated with placement demo in namespace ns1Normal ScoreUpdate 3m1s placementController cluster1:-200 cluster2:100 cluster3:400Normal DecisionUpdate 2s placementController Decision demo-decision-1 is updated with placement demo in namespace ns1Normal ScoreUpdate 2s placementController cluster1:-200 cluster2:200 cluster3:500 cluster4:400這一次,PlacementDecision 更新了,并且結(jié)果重新調(diào)度到了 cluster3 和 cluster4。
# oc describe placementdecision demo-decision-1 -n ns1 ... Status:Decisions:Cluster Name: cluster3Reason: Cluster Name: cluster4Reason:示例 3:選擇具有最大可分配內(nèi)存的集群并穩(wěn)定調(diào)度結(jié)果。
為了使調(diào)度結(jié)果保持穩(wěn)定,這次我們顯式設(shè)置了優(yōu)選器 Steady,并且設(shè)置權(quán)重為 3。
apiVersion: cluster.open-cluster-management.io/v1alpha1 kind: Placement metadata:name: demonamespace: ns1 spec:numberOfClusters: 2prioritizerPolicy:configurations:- scoreCoordinate:builtIn: ResourceAllocatableMemory- scoreCoordinate:builtIn: Steadyweight: 3Placement 創(chuàng)建好之后,再次通過 oc describe 命令來檢查 Placement 和 PlacementDecision 的結(jié)果。
# oc describe placement demo -n ns1 ... Status:Conditions:Last Transition Time: 2021-11-09T09:05:36ZMessage: All cluster decisions scheduledReason: AllDecisionsScheduledStatus: TrueType: PlacementSatisfiedNumber 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 ns1Normal DecisionUpdate 15s placementController Decision demo-decision-1 is updated with placement demo in namespace ns1Normal ScoreUpdate 15s placementController cluster1:0 cluster2:100 cluster3:200 # oc describe placementdecision demo-decision-1 -n ns1 ... Status:Decisions:Cluster Name: cluster2Reason: Cluster Name: cluster3Reason:初始的調(diào)度結(jié)果為 cluster2 和 cluster3。
現(xiàn)在,讓我們試著再次加入一個有 150MB 可分配內(nèi)存的集群,然后檢查 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 ns1Normal DecisionUpdate 80s placementController Decision demo-decision-1 is updated with placement demo in namespace ns1Normal ScoreUpdate 80s placementController cluster1:0 cluster2:100 cluster3:200再次檢查 PlacementDecision,可以看到調(diào)度結(jié)果并沒有變化,固定在了 cluster2 和 cluster3。
# oc describe placementdecision demo-decision-1 -n ns1 ... Status:Decisions:Cluster Name: cluster2Reason: Cluster Name: cluster3Reason:在前面的三個示例中,我們展示了多個優(yōu)選器是如何協(xié)同工作的,以及如何通過調(diào)整每個優(yōu)選器的權(quán)重來影響最終決策。在使用中,你也可以按需求嘗試調(diào)整權(quán)重或更改已啟用的優(yōu)選器。
總結(jié)
通過本文,你可以了解到如何在不同的應(yīng)用場景下使用 Placement API。這篇文章解釋了什么是 Placement 以及它如何和一些主流的開源項目配合使用。介紹了 Placement 如何選擇集群,以及通過一些示例展示多個優(yōu)選器是如何共同工作并做出調(diào)度決策的。在文章的最后,提供了一些示例來展示最佳實踐。歡迎隨時在?open-cluster-management-io GitHub 社區(qū) [7] 中提出問題,或使用?Slack [8] 與我們聯(lián)系,同時加入我們的 Google Groups 以訂閱我們的定期社區(qū)會議。
未來我們將在 OCM 里看到更多結(jié)合 OCM 高級調(diào)度能力的其他高級功能模塊,比如多集群 Workload 調(diào)度/容災等等。
相關(guān)鏈接?
[1] Open Cluster Management 0.6 發(fā)布:
https://open-cluster-management.io/community/releases/
[2] OCM 社區(qū):
https://github.com/open-cluster-management-io/community/issue
[3] ManagedCluster 和 ManagedClusterSet:
https://open-cluster-management.io/concepts/managedcluster/
[4] Placement:
https://open-cluster-management.io/concepts/placement/
[5] PlacementSpec:
https://github.com/open-cluster-management-io/api/blob/main/cluster/v1alpha1/types.go
[6] 社區(qū)文檔:
https://github.com/open-cluster-management-io/enhancements/blob/main/enhancements/sig-architecture/32-extensiblescheduling/32-extensiblescheduling.md
[7] open-cluster-management-io GitHub 社區(qū):
https://github.com/open-cluster-management-io/community/issues
[8] Slack:
https://kubernetes.slack.com/archives/C01GE7YSUUF
參考:??
??https://timewitch.net/post/2020-03-31-multicluster-workloads/??
點擊“??此處??”,快速瀏覽 OpenClusterManagement 中文站點。
總結(jié)
以上是生活随笔為你收集整理的CNCF 沙箱项目 OCM Placement 多集群调度指南的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一个字稳,云原生产品家族支撑冬奥会九大业
- 下一篇: 从中心走向边缘——深度解析云原生边缘计算