云服务器内容精选

  • 调度优先级介绍 节点池软亲和调度,是通过节点池上的标签(Label)进行软亲和,具体是通过给每一个节点进行打分的机制来排序筛选最优节点。 原则:尽可能把Pod调度到带有相关标签的节点上。 打分公式如下: score = weight * MaxNodeScore * haveLabel 参数说明: weight:节点池软亲和plugin的权重。 MaxNodeScore:节点最大得分,值为100。 haveLabel:节点上是否存在插件中配置的label,如果有,值为1,如果节点上没有,值为0。
  • 配置Volcano节点池软亲和调度策略 在节点池上配置用于亲和调度的标签。 登录CCE控制台。 单击集群名称进入集群,在左侧选择“节点管理”,在右侧选择“节点池”页签。 单击节点池名称后的“更新”,在弹出的“更新节点池”页面中配置参数,在“K8s标签”中配置对应的标签。 示例如下: 单击左侧导航栏的“插件中心”,在右侧找到Volcano调度器,单击“安装”或“编辑”,并在“参数配置”中设置Volcano调度器配置参数。 { "ca_cert": "", "default_scheduler_conf": { "actions": "allocate, backfill, preempt", "tiers": [ { "plugins": [ { "name": "priority" }, { "name": "gang" }, { "name": "conformance" } ] }, { "plugins": [ { "name": "drf" }, { "name": "predicates" }, { "name": "nodeorder" } ] }, { "plugins": [ { "name": "cce-gpu-topology-predicate" }, { "name": "cce-gpu-topology-priority" }, { "name": "cce-gpu" }, { // 开启节点池亲和性调度 "name": "nodepoolaffinity", // 节点池亲和性调度权重及标签设置 "arguments": { "nodepoolaffinity.weight": 10000, "nodepoolaffinity.label": "nodepool1=nodepool1" } } ] }, { "plugins": [ { "name": "nodelocalvolume" }, { "name": "nodeemptydirvolume" }, { "name": "nodeCSIscheduling" }, { "name": "networkresource" } ] } ] }, "server_cert": "", "server_key": "" } 完成以上配置后,单击“确定”。
  • 约束与限制 重调度之后的Pod,需要调度器进行调度,重调度器并未进行任何对于Pod和节点的标记行为,所以被驱逐的Pod调度到节点的行为完全被调度器控制,存在驱逐之后,被驱逐的Pod调度到原来节点的可能性。 重调度功能暂不支持Pod间存在反亲和性的场景。如果使用重调度功能驱逐某个Pod后,由于该Pod与其他已运行的Pod存在反亲和性,调度器仍可能将其调度回驱逐前的节点上。 配置负载感知重调度(LoadAware)时,Volcano调度器需要同时开启负载感知调度;配置CPU和内存资源碎片率整理策略(HighNodeUtilization)时,Volcano调度器需要同时开启binpack调度策略。
  • 配置负载感知重调度策略 配置负载感知重调度(LoadAware)时,Volcano调度器需要同时开启负载感知调度,示例步骤如下。 登录CCE控制台,单击集群名称进入集群,单击左侧导航栏的“配置中心”,通过“调度配置”页面启用负载感知调度。详情请参见负载感知调度。 单击左侧导航栏的“插件中心”,在右侧找到Volcano调度器,单击“安装”或“编辑”。 在“参数配置”中修改高级配置,配置负载感知重调度策略。使用Volcano 1.11.21及更新版本,配置示例如下: { "colocation_enable": "", "default_scheduler_conf": { "actions": "allocate, backfill, preempt", "tiers": [ { "plugins": [ { "name": "priority" }, { "enablePreemptable": false, "name": "gang" }, { "name": "conformance" } ] }, { "plugins": [ { "enablePreemptable": false, "name": "drf" }, { "name": "predicates" }, { "name": "nodeorder" }, { "name": "usage", "enablePredicate": true, "arguments": { "usage.weight": 5, "cpu.weight": 1, "memory.weight": 1, "thresholds": { "cpu": 80, "mem": 80 } } } ] }, { "plugins": [ { "name": "cce-gpu-topology-predicate" }, { "name": "cce-gpu-topology-priority" }, { "name": "cce-gpu" } ] }, { "plugins": [ { "name": "nodelocalvolume" }, { "name": "nodeemptydirvolume" }, { "name": "nodeCSIscheduling" }, { "name": "networkresource" } ] } ] }, "deschedulerPolicy": { "profiles": [ { "name": "ProfileName", "pluginConfig": [ { "args": { "ignorePvcPods": true, "nodeFit": true, "priorityThreshold": { "value": 100 } }, "name": "DefaultEvictor" }, { "args": { "evictableNamespaces": { "exclude": ["kube-system"] }, "metrics": { "type": "prometheus_adaptor" }, "targetThresholds": { "cpu": 80, "memory": 85 }, "thresholds": { "cpu": 30, "memory": 30 } }, "name": "LoadAware" } ], "plugins": { "balance": { "enabled": ["LoadAware"] } } } ] }, "descheduler_enable": "true", "deschedulingInterval": "10m" } 表1 集群重调度策略关键参数 参数 说明 descheduler_enable 集群重调度策略开关。 true:启用集群重调度策略。 false:不启用集群重调度策略。 deschedulingInterval 重调度的周期。 deschedulerPolicy 集群重调度策略,详情请参见表2。 表2 deschedulerPolicy配置参数 参数 说明 profiles.[].plugins.balance.enable.[] 指定集群重调度策略类型。 LoadAware:表示使用负载感知重调度策略。 profiles.[].pluginConfig.[].name 使用负载感知重调度策略时,会使用以下配置: DefaultEvictor:默认驱逐策略。 LoadAware:负载感知重调度策略。 profiles.[].pluginConfig.[].args 集群重调度策略的具体配置。 对于DefaultEvictor配置,配置参数如下: ignorePvcPods:是否忽略挂载PVC的Pod,true表示忽略,false表示不忽略。该忽略动作未根据PVC类型(LocalPV/SFS/EVS等)进行区分。 nodeFit:是否重调度时是否考虑节点上存在的调度配置,例如节点亲和性、污点等。true表示考虑,false表示不考虑。 priorityThreshold:优先级设置。当Pod的优先级大于或者等于该值时,不会被驱逐。示例如下: { "value": 100 } 对于LoadAware配置,配置参数如下: evictableNamespaces:驱逐策略的适用命名空间,默认范围设置为除kube-system命名空间。示例如下: { "exclude": ["kube-system"] } metrics:监控数据采集方式,当前支持通过Custom Metrics API(prometheus_adaptor聚合数据)和Prometheus 直接查询。 Volcano 1.11.17及之后的版本推荐使用Custom Metrics API的方式获取监控数据,示例如下: { "type": "prometheus_adaptor" } Volcano 1.11.5至1.11.16版本推荐使用Prometheus 直接查询的方式获取监控数据,需填写prometheus server的地址信息,示例如下: { "address": "http://10.247.119.103:9090", "type": "prometheus" } targetThresholds:节点驱逐Pod的阈值,当节点上高于此阈值时,上面的Pod会被驱逐。示例如下: { "cpu": 60, "memory": 65 } thresholds:节点承载Pod的阈值,当节点低于此阈值时,表示该节点可以承载被驱逐的Pod。示例如下: { "cpu": 30, "memory": 30 } 完成以上配置后,单击“确定”。
  • 配置资源碎片整理策略 配置CPU和内存资源碎片率整理策略(HighNodeUtilization)时,Volcano调度器需要同时开启binpack调度策略,示例步骤如下。 登录CCE控制台,单击集群名称进入集群,单击左侧导航栏的“配置中心”,通过“调度配置”页面启用装箱策略(binpack)。详情请参见装箱调度(Binpack)。 单击左侧导航栏的“插件中心”,在右侧找到Volcano调度器,单击“安装”或“编辑”。 在“参数配置”中修改高级配置,配置资源碎片整理策略。 { "colocation_enable": "", "default_scheduler_conf": { "actions": "allocate, backfill, preempt", "tiers": [ { "plugins": [ { "name": "priority" }, { "enablePreemptable": false, "name": "gang" }, { "name": "conformance" }, { "arguments": { "binpack.weight": 5 }, "name": "binpack" } ] }, { "plugins": [ { "enablePreemptable": false, "name": "drf" }, { "name": "predicates" }, { "name": "nodeorder" } ] }, { "plugins": [ { "name": "cce-gpu-topology-predicate" }, { "name": "cce-gpu-topology-priority" }, { "name": "cce-gpu" } ] }, { "plugins": [ { "name": "nodelocalvolume" }, { "name": "nodeemptydirvolume" }, { "name": "nodeCSIscheduling" }, { "name": "networkresource" } ] } ] }, "deschedulerPolicy": { "profiles": [ { "name": "ProfileName", "pluginConfig": [ { "args": { "ignorePvcPods": true, "nodeFit": true, "priorityThreshold": { "value": 100 } }, "name": "DefaultEvictor" }, { "args": { "evictableNamespaces": { "exclude": ["kube-system"] }, "thresholds": { "cpu": 25, "memory": 25 } }, "name": "HighNodeUtilization" } ], "plugins": { "balance": { "enabled": ["HighNodeUtilization"] } } } ] }, "descheduler_enable": "true", "deschedulingInterval": "10m" } 表3 集群重调度策略关键参数 参数 说明 descheduler_enable 集群重调度策略开关。 true:启用集群重调度策略。 false:不启用集群重调度策略。 deschedulingInterval 重调度的周期。 deschedulerPolicy 集群重调度策略,详情请参见表4。 表4 deschedulerPolicy配置参数 参数 说明 profiles.[].plugins.balance.enable.[] 指定集群重调度策略类型。 HighNodeUtilization:表示使用资源碎片整理策略。 profiles.[].pluginConfig.[].name 使用负载感知重调度策略时,会使用以下配置: DefaultEvictor:默认驱逐策略。 HighNodeUtilization:资源碎片整理策略。 profiles.[].pluginConfig.[].args 集群重调度策略的具体配置。 对于DefaultEvictor配置,配置参数如下: ignorePvcPods:是否忽略挂载PVC的Pod,true表示忽略,false表示不忽略。该忽略动作未根据PVC类型(LocalPV/SFS/EVS等)进行区分。 nodeFit:是否重调度时是否考虑节点上存在的调度配置,例如节点亲和性、污点等。true表示考虑,false表示不考虑。 priorityThreshold:优先级设置。当Pod的优先级大于或者等于该值时,不会被驱逐。示例如下: { "value": 100 } 对于HighNodeUtilization配置,配置参数如下: evictableNamespaces:驱逐策略的适用命名空间,默认范围设置为除kube-system命名空间。示例如下: { "exclude": ["kube-system"] } thresholds:节点驱逐Pod的阈值,当节点低于此阈值时,该节点上的Pod会被驱逐。示例如下: { "cpu": 25, "memory": 25 } 完成以上配置后,单击“确定”。
  • 重调度功能介绍 负载感知重调度(LoadAware) 在K8s集群治理过程中,常常会因CPU、内存等高使用率状况而形成热点,既影响了当前节点上Pod的稳定运行,也会导致节点发生故障的几率的激增。为了应对集群节负载不均衡等问题,动态平衡各个节点之间的资源使用率,需要基于节点的相关监控指标,构建集群资源视图,在集群治理阶段,通过实时监控,在观测到节点资源率较高、节点故障、Pod 数量较多等情况时,可以自动干预,迁移资源使用率高的节点上的一些Pod到利用率低的节点上。 图1 LoadAware策略示意图 使用该插件时,highThresholds需要大于lowThresholds,否则重调度器无法启用。 正常节点:资源利用率大于等于30%且小于等于80%的节点。此节点的负载水位区间是期望达到的合理区间范围。 热点节点:资源利用率高于80%的节点。热点节点将驱逐一部分Pod,降低负载水位,使其不超过80%。重调度器会将热点节点上面的Pod调度到空闲节点上面。 空闲节点:资源利用率低于30%的节点。 CPU和内存资源碎片率整理策略(HighNodeUtilization) 从分配率低的节点上驱逐Pod。这个策略必须与Volcano调度器的binpack策略或者kube-scheduler调度器的MostAllocated策略一起使用。阈值可以分为CPU和内存两种资源角度进行配置。
  • 如何使节点CPU、内存的真实负载趋于均衡 工作负载运行过程中,真实消耗的CPU和内存存在大的波动,通过工作负载request资源无法准确评估的场景中,希望调度器可以结合集群内节点CPU、内存的负载情况,将Pod优先调度到负载较低的节点,实现节点负载均衡,避免出现因单个节点负载过高而导致的应用程序或节点故障。 配置案例1 开启负载感知调度策略,使用默认权重值5。插件详情与配置方法请参见负载感知调度。 关闭装箱调度策略(binpack)。插件详情与配置方法请参见装箱调度(Binpack)。 配置建议如下: 优先确保各节点CPU资源负载趋于均衡:建议提高负载感知调度的CPU权重为5, 内存权重保持为1。 优先确保各节点的内存资源负载趋于均衡:建议提高负载感知调度的内存权重为5,CPU权重保持为1。 真实负载阈值生效方式与CPU真实负载阈值和内存真实负载阈值联合生效: 硬约束场景: 节点CPU真实利用率超过CPU真实负载阈值后,该节点不允许调度新的工作负载。 节点内存真实利用率超过内存真实负载阈值后,该节点不允许调度新的工作负载。 软约束场景: 节点CPU真实利用率超过CPU真实负载阈值后,尽可能不向该节点调度新的工作负载。 节点内存真实利用率超过内存真实负载阈值后,尽可能不向该节点调度新的工作负载。 希望集群内各节点的负载趋于均衡,同时希望尽可能提升集群资源利用率的场景:可以设置真实负载阈值生效方式为软约束,CPU真实负载阈值和内存真实负载阈值使用默认值80。 希望优先确保工作负载的稳定性,降低热点节点CPU、内存压力的场景:可以设置真实负载阈值生效方式为硬约束,CPU真实负载阈值和内存真实负载阈值在60~80之间设置。 配置案例2 随着集群状态,工作负载流量与请求的动态变化,节点的利用率也在实时变化,集群有可能会再次出现负载极端不均衡的情况,在业务Pod允许被驱逐重新调度的场景中,通过负载感知和热点打散重调度结合使用,可以获得集群最佳的负载均衡效果。关于热点打散重调度能力的使用请参见重调度(Descheduler)。 开启负载感知调度策略,使用默认权重值5。插件详情与配置方法请参见负载感知调度。 开启重调度能力,完成负载感知重调度策略配置。插件详情与配置方法请参见重调度(Descheduler)。 关闭装箱调度策略(binpack)。插件详情与配置方法请参见装箱调度(Binpack)。 配置建议如下: 负载感知重调度策略配置推荐 高负载节点驱逐pod的阈值信息targetThreshold:cpu为75、memory为70。 低负载节点承接pod的阈值信息thresholds:cpu为30、memory为30。 负载感知调度的真实负载阈值应介于重调度高负载节点与低负载节点阈值之间 CPU真实负载阈值 65 内存真实负载阈值 60
  • 节点优选调度策略介绍 Volcano插件支持的节点调度策略如下: 调度策略 参数 说明 使用指导 装箱调度(binpack) binpack.weight 装箱策略,开启后默认值是 10 装箱调度(Binpack) 兼容kube-scheduler节点排序策略(nodeorder) nodeaffinity.weight 节点亲和性优先调度,默认值是2。 默认开启 podaffinity.weight Pod亲和性优先调度,默认值是2。 leastrequested.weight 资源分配最少的节点优先,默认值是1。 balancedresource.weight 节点上面的不同资源分配平衡的优先,默认值是1。 mostrequested.weight 资源分配最多的节点优先,默认值是0。 tainttoleration.weight 污点容忍高的优先调度,默认值是3。 imagelocality.weight 节点上面有Pod需要镜像的优先调度,默认值是1。 selectorspread.weight 把Pod均匀调度到不同的节点上,默认值是0。 podtopologyspread.weight Pod拓扑调度,默认值是2。 numa亲和性调度(numa-aware) weight numa亲和性调度,开启后默认值是 1。 NUMA亲和性调度 负载感知调度(usage) weight 负载感知调度,开启后默认值是 5 负载感知调度 节点池亲和性调度(nodepoolaffinity) nodepoolaffinity.weight 节点池亲和调度,开启后默认是 10000 节点池亲和性调度
  • 如何减少节点资源碎片,提高集群资源利用率 集群中存在大作业(request资源量较大)和小作业(request资源量较少)混合提交并运行,希望小作业可以优先填满集群各节点的资源碎片,将空闲的节点资源优先预留给大作业运行,避免大作业由于节点资源不足长时间无法调度。 开启装箱策略(binpack),使用默认权重值10。插件详情与配置方法请参见装箱调度(Binpack)。 配置建议如下: 优先减少集群中的CPU资源碎片:建议提高binpack策略中的CPU权重为5,Memory权重保持为1。 优先减少集群中的Memory资源碎片:建议提高binpack策略中的Memory权重为5,CPU权重保持为1。 优先减少集群中的GPU资源碎片:建议自定义资源类型(GPU),并设置GPU资源权重为10,CPU权重保持为1,Memory权重保持为1。
  • Binpack算法原理 Binpack在对一个节点打分时,会根据Binpack插件自身权重和各资源设置的权重值综合打分。首先,对Pod请求资源中的每类资源依次打分,以CPU为例,CPU资源在待调度节点的得分信息如下: CPU.weight * (request + used) / allocatable 即CPU权重值越高,得分越高,节点资源使用量越满,得分越高。Memory、GPU等资源原理类似。其中: CPU.weight为用户设置的CPU权重 request为当前pod请求的CPU资源量 used为当前节点已经分配使用的CPU量 allocatable为当前节点CPU可用总量 通过Binpack策略的节点总得分如下: binpack.weight * (CPU.score + Memory.score + GPU.score) / (CPU.weight+ Memory.weight+ GPU.weight) * 100 即binpack插件的权重值越大,得分越高,某类资源的权重越大,该资源在打分时的占比越大。其中: binpack.weight为用户设置的装箱调度策略权重 CPU.score为CPU资源得分,CPU.weight为CPU权重 Memory.score为Memory资源得分,Memory.weight为Memory权重 GPU.score为GPU资源得分,GPU.weight为GPU权重 图1 Binpack策略示例
  • Binpack功能介绍 Binpack调度算法的目标是尽量把已有的节点填满(即尽量不往空白节点分配)。具体实现上,Binpack调度算法为满足调度条件的节点打分,节点的资源利用率越高得分越高。Binpack算法能够尽可能填满节点,将应用负载靠拢在部分节点,这非常有利于集群节点的自动扩缩容功能。 Binpack为调度器的多个调度插件之一,与其他插件共同为节点打分,用户可以自定义该插件整体权重和各资源维度打分权重,用以提高或降低Binpack在整体调度中的影响力。调度器在计算Binpack策略得分时,会考虑Pod请求的各种资源,如:CPU、Memory和GPU等扩展资源,并根据各种资源所配置的权重做平均。