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

我只想在 Amazon Web Services(AWS) 上配置集群。 我只想将工作负载部署到标签为 group=dev 的集群上。 我希望工作负载始终在具有最大可分配内存的 3 个集群上运行。 
ManagedCluster 和 ManagedClusterSet[3] Placement[4] 
为什么我们需要
ManagedClusterSet?
Cloud Native
什么是 Placement?
Cloud Native
apiVersion: argoproj.io/v1alpha1kind: ApplicationSetmetadata:name: book-importspec:generators:- clusterDecisionResource:configMapRef: ocm-placementlabelSelector:matchLabels:cluster.open-cluster-management.io/placement: local-clusterrequeueAfterSeconds: 30template:…apiVersion: v1kind: ConfigMapmetadata:name: ocm-placementdata:apiVersion: cluster.open-cluster-management.io/v1alpha1kind: placementdecisionsstatusListKey: decisionsmatchKey: clusterNameapiVersion: cluster.open-cluster-management.io/v1alpha1kind: PlacementDecisionmetadata:labels:cluster.open-cluster-management.io/placement: local-clustername: local-cluster-decision-1status:decisions:- clusterName: cluster1reason: ""- clusterName: cluster2reason: ""
Placement 如何选择集群?
Cloud Native
apiVersion: cluster.open-cluster-management.io/v1alpha1kind: Placementmetadata:name: placementnamespace: ns1spec:numberOfClusters: 4clusterSets:- clusterset1- clusterset2predicates:- requiredClusterSelector:labelSelector:matchLabels:vendor: OpenShiftprioritizerPolicy:mode: Exactconfigurations:- scoreCoordinate:builtIn: ResourceAllocatableMemory- scoreCoordinate:builtIn: Steadyweight: 3- scoreCoordinate:type: AddOnaddOn:resourceName: defaultscoreName: cpuratio
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 的整数,用以调整不同的优选器打分对总分的影响。 
调度框架首先从 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 作为结果。
优选器插件如何工作?
Cloud Native
平衡 (Balance): 平衡每个集群上的调度决策 (PlacementDecision) 数量。拥有 PlacementDecision 数量最多的集群将得到最低分 -100 分,如果没有 PlacementDecision 则被赋予最高分 100 分。其他的分数介于 -100 到 100 之间。 
稳定 (Steady): 确保现有的 PlacementDecision 中已选集群的结果保持稳定。现有的 PlacementDecision 已经选中的集群将得到最高分 100 分,没有被选中的集群得到最低分 0 分。 
最大可分配 CPU 资源 (ResourceAllocatableCPU) 和最大可分配内存资源 (ResourceAllocatableMemory) 基于集群的可分配 CPU 或者内存做决策。拥有最多可分配资源(CPU 或者内存)的集群将得到最高分 100 分,拥有最少资源的集群将得到最低分 -100分。其他的分数介于 -100 到 100 之间。 
作为使用者,可以在 yaml 文件中 prioritizerPolicy 下配置 AddOn,来指定自定义分数以选择集群。 
作为分数的提供者,第三方的控制器 (controller) 可以在中心 (Hub Cluster) 或托管群集 (Managed Cluster) 上运行,controller 需要维护 AddOnPlacementScore 的生命周期并将分数更新到其中。 
通过给资源类型的优选器 ResourceAllocatableCPU 和 ResourceAllocatableMemory 设置权重,来基于可分配的资源做调度。 
通过给资源类型的优选器设置一个更高的权重,使得调度结果对于资源的变化更加敏感。 
通过给优选器 Steady 设置更高的权重,使得调度结果可以忽略资源的变化保持稳定。 
apiVersion: cluster.open-cluster-management.io/v1alpha1kind: Placementmetadata:name: demonamespace: ns1spec:numberOfClusters: 2prioritizerPolicy:configurations:- scoreCoordinate:builtIn: ResourceAllocatableMemory
# oc describe placement demo -n ns1Name: demoNamespace: ns1Labels: <none>Annotations: <none>API Version: cluster.open-cluster-management.io/v1alpha1Kind: Placement…Status:Conditions:Last Transition Time: 2021-11-09T07:02:14ZMessage: All cluster decisions scheduledReason: AllDecisionsScheduledStatus: TrueType: PlacementSatisfiedNumber Of Selected Clusters: 2Events: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
# oc describe placementdecision demo-decision-1 -n ns1Name: demo-decision-1Namespace: ns1Labels: cluster.open-cluster-management.io/placement=placement-jkd42Annotations: <none>API Version: cluster.open-cluster-management.io/v1alpha1Kind: PlacementDecision...Status:Decisions:Cluster Name: cluster2Reason:Cluster Name: cluster3Reason:Events: <none>
# 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
# 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
# oc describe placementdecision demo-decision-1 -n ns1...Status:Decisions:Cluster Name: cluster3Reason:Cluster Name: cluster4Reason:
如果希望调度结果对资源变化保持敏感,应该怎么做? 
如果希望调度结果保持稳定,忽略资源的变化,应该怎么做? 
示例 2:选择具有最大可分配内存的群集,并使 Placement 对资源变化保持敏感。
apiVersion: cluster.open-cluster-management.io/v1alpha1kind: Placementmetadata:name: placement7namespace: ns1spec:numberOfClusters: 2prioritizerPolicy:configurations:- scoreCoordinate:builtIn: ResourceAllocatableMemoryweight: 3
# 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: 2Events: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:
# 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
# oc describe placementdecision demo-decision-1 -n ns1...Status:Decisions:Cluster Name: cluster3Reason:Cluster Name: cluster4Reason:
示例 3:选择具有最大可分配内存的集群并稳定调度结果。
apiVersion: cluster.open-cluster-management.io/v1alpha1kind: Placementmetadata:name: demonamespace: ns1spec:numberOfClusters: 2prioritizerPolicy:configurations:- scoreCoordinate:builtIn: ResourceAllocatableMemory- scoreCoordinate:builtIn: Steadyweight: 3
# 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: 2Events: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:
# 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
# oc describe placementdecision demo-decision-1 -n ns1...Status:Decisions:Cluster Name: cluster2Reason:Cluster Name: cluster3Reason:
总结
Cloud Native
相关链接
Cloud Native
https://kubernetes.slack.com/archives/C01GE7YSUUF
参考:
评论
