0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Kubernetes是如何解决资源拓扑感知调度的呢

程序人生 ? 来源:CSDN云原生 ? 作者:方睿 ? 2022-08-25 12:03 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

资源竞争与资源感知问题

CPU的体系结构上来看,现代CPU多采用NUMA架构和方式。

NUMA架构是非对称的,每个NUMA node上会有自己的物理CPU内核,以及每个NUMA node之间也共享L3 Cache。同时,内存也分布在每个NUMA node上的。某些开启了超线程的CPU,一个物理CPU内核在操作系统上会呈现两个逻辑的核。

实际上,CPU内核是分布在NUMA node上,NUMA node内本身就有一些亲和性的元素。

2df9aa10-2429-11ed-ba43-dac502259ad0.png

右图中,CPU开始的访问速度是不一样的。

如果程序都跑在同一个NUMA node上,可以更好地去共享一些L3 Cache,L3 Cache的访问速度会很快。如果L3 Cache没有命中,可以到内存中读取数据,访存速度会大大降低。

因此,从CPU体系结构中可以看到,如果采用一些错误的CPU分配方式,可能会导致进程访存速度急剧下降,严重影响应用程序的性能。

在这样的体系结构下,存在云计算中常见的吵闹的邻居问题。当多个容器在节点上共同运行时,由于资源分配的不合理,会对CPU本身的性能造成影响。

2e07ab1a-2429-11ed-ba43-dac502259ad0.png

从理想的使用方式来看,如果每个进程都使用各自的CPU内核,并且不会跨NUMA node访问,相互之间不会有太多争抢。

从糟糕的使用方式来看,如果两个进程的CPU内核在分配时,可能会没有遵循NUMA的亲和性,会带来很大的性能问题,体现在三个方面:

CPU争抢带来频繁的上下文切换时间;

频繁的进程切换导致CPU高速缓存失败;

跨NUMA访存会带来更严重的性能瓶颈。

2e13b7c0-2429-11ed-ba43-dac502259ad0.png

Kubernetes中有CPU Manager的功能,CPU Manager可以做一些CPU核心的分配工作。上图是Kubernetes的一些数据呈现。

在Guaranteed和Burstable两种Pod混部测试下,将CPU Manager执行时间做基准,如果是原生Kubernetes的方式在不同测试下,性能有较大波动,最差可能会达到1.8倍左右。

在Stand-Alone Workloads的情况下,做CPU的绑定和完全不做CPU绑定,执行时间差别很大。因为剧烈的CPU争抢以及频繁的上下文切换,会导致约1倍的性能差距。

2e2397e4-2429-11ed-ba43-dac502259ad0.png

在吵闹的邻居问题下,Kubernetes是如何解决的呢?

CPU Manager是其中的一个解决方法,它被放在Kubelet中,CPUSet将会被CPU Manager分在Default和Exclusive两个池子中。

Default主要在两种情况下使用。一种是系统守护进程:kube-reserved、system-reserved,另一种是特殊类型的Pod:Burstable、BestEffort、请求非整数CPU的Guaranteed。

Exclusive是完全排他的CPU池,主要在两种情况下使用。一种是Pod:请求整数CPU的Guaranteed,另一种是Topology Manager:满足拓扑管理器定义的要求。

但原生Kubernetes也存在局限性。

调度器不感知节点资源拓扑。

Kubernetes中调度器只负责为Pod选择节点,并不感知节点NUMA拓扑结构,Pod的CPU分配交给Kubelet完成。当节点单NUMA node上没有足够的CPU时,Pod启动失败,控制器重建Pod后会陷入死循环。

CPUSet分配策略过于单一。

Kubernetes中CPU Manager默认为请求整数CPU的Guaranteed Pod分配独占的CPUSet,但实际上Pod想定制自己的CPU分配策略,可能只是想分配到一个NUMA node内,或是固定CPU甚至是不做绑核。

2e41e24e-2429-11ed-ba43-dac502259ad0.png

在混部场景下,也存在离线算力感知问题。

当在线与离线任务混部在同一台主机上,在线闲时,离线任务可以充分使用资源,提升主机利用率;在线忙时,离线任务会被在线抢占,等待资源释放。

当离线可用算力受在线干扰动态变化时,调度器仅感知节点静态资源(Kubelet采集)。

如果忙时调度过多的离线任务,会导致剧烈的资源争抢,并且每个离线Pod的性能都会下降。 因此,调度器在调度时,需要动态感知离线实时算力。驱逐器也应当在线严重干扰离线时,驱逐离线Pod,保证节点的算力稳定。

Kuberbnetes精细化调度

在原生Kubernetes不能很好地解决资源竞争与资源感知问题时,亟需对资源进行更加精细化的调度。

2e6189f0-2429-11ed-ba43-dac502259ad0.png

如上图,是精细化调度系统的结构。

Cassini-Worker能从节点采集资源拓扑信息并创建NRT对象。

Cassini-Master能从外部系统采集节点扩展信息(可选)。

Scheduler-Plugins能扩展调度器,为Pod进行资源拓扑分配。

2e70e5da-2429-11ed-ba43-dac502259ad0.png

扩展调度器是通过Scheduler-Plugins来实现的,可以在几个插入点做一些插件,保证实现标库资源头部感知调度的功能。

在Fitter的插件内,可以过滤节点拓扑资源和选择Zone并分配资源。

在Score的插件内,可以根据Zone个数降序打分。

在Reserver的插件内,可以为待绑定节点预留拓扑资源避免数据不一致。

在PreBind的插件内,可以将拓扑调度结果附加到Pod Annotations中。

在调度算法上,可以从性能和负载均衡两个方面做出考虑,以便更好地选择节点和拓扑。

在性能方面,优先选择Pod能绑定在单NUMA node内的节点。如果找不到该节点,可以优先选择在同一个NUMA Socket内的NUMA node

在负载均衡方面,优先选择空闲资源更多的NUMA node。

容器CPUSet管理

Kubernetes的精细化调度做出一些拓扑感知,而实际落到节点上,为了更好地实现资源分配,我们设计了一个资源分配系统。

2e972db2-2429-11ed-ba43-dac502259ad0.png

首先,节点Kubelet会监听到Pod并准备启动Pod。

随后,节点Kubelet调用容器运行时接口启动容器。

与此同时,节点Cassini-Worker通过List Kubelet的10250端口获得节点上的所有Pod,再从Pod Annotations中获取调度器的拓扑调度结果。

节点Cassini-Worker调用容器运行时接口来更改容器的绑核结果。

2ea85420-2429-11ed-ba43-dac502259ad0.png

关于容器多级资源QoS分配策略,在CPUSet的策略上,可以划分为四种:

Exclusive:它可以独占CPU内核心,其他Pod不可使用,一般是高利用率的容器会采取该策略;

None:不做CPU绑核的策略,可以使用节点的Default CPU共享池;

NUMA:让CPUSet固定到NUMA node上的共享池内;

Immovable:将CPU内核心固定,让其他Pod也可共享。

在CPU内核心选择策略上:

首先,按照调度结果获取NUMA node上需分配的核心数;

随后,从共享池中选择可分配的CPU内核心;

同时,还希望一个Pod尽量不使用在同一个物理核上的逻辑核。

在离线混部场景下的实践

由于离线混部场景中,离线会受到在线的影响,算力是波动的。因此,在离线混部场景下,还会做一些差异化重调度:

当在线负载上升时,离线的算力会被压制。因此,离线的Pod需要及时驱逐,以便刚好满足节点离线算力的要求;

通过改造Descheduler组件,建立通用的可配置的平台通用驱逐框架,支持Metrics驱逐,以及支持动态调整/配置驱逐策略;

建立算力平台通用Metrics;

支持业务自定义Metrics驱逐。

在不同混部场景下,容器CPUSet策略也是不同的。

2ec76f86-2429-11ed-ba43-dac502259ad0.png

离线CVM混部的场景中,一台物理机的各个NUMA node上都生产了许多在线的CVM,当在线利用率很低时,需要更好地利用资源。

此时需要采取Exclusive策略:

离线CVM通过内核VMF调度器获取低优的CPU时间片;

离线Pod通过独占CPU内核心的方式,保证互不干扰;

内核VMF调度器保证离线Pod在忙时,可实现核心漂移,充分利用CPU资源。

在容器混部的场景中,在线Pod和离线Pod同时部署在同一台物理机上。

此时需要采取NUMA策略:

离线Pod通过限制Cgroups,获取低优的CPU时间片;

离线Pod绑定整个NUMA node,防止某几个CPU内核心被压制;

离线Pod共享整个NUMA node,充分利用CPU资源。

总结

本文围绕Kubernetes的资源拓扑感知调度的主题展开。从CPU体系结构和吵闹的邻居问题切人,随后阐述了原生Kubernetes的不足和混部场景下的算力感知的局限,最后从采集节点拓扑资源、扩展Kubernetes调度器、多级资源QoS分配策略几个方面给出了相应的解决方案。在策略的优化后,资源得到更合理地利用。

未来,Kubernetes精细化调度将会覆盖更多的场景,例如碎片GPU、网络拓扑架构、电力调度。



审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • cpu
    cpu
    +关注

    关注

    68

    文章

    11099

    浏览量

    217760
  • 操作系统
    +关注

    关注

    37

    文章

    7176

    浏览量

    125916
  • 调度算法
    +关注

    关注

    1

    文章

    68

    浏览量

    12122

原文标题:腾讯方睿:详解Kubernetes资源拓扑感知调度

文章出处:【微信号:coder_life,微信公众号:程序人生】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    生产环境中Kubernetes容器安全的最佳实践

    随着容器化技术的快速发展,Kubernetes已成为企业级容器编排的首选平台。然而,在享受Kubernetes带来的便利性和可扩展性的同时,安全问题也日益凸显。本文将从运维工程师的角度,深入探讨生产环境中Kubernetes容器
    的头像 发表于 07-14 11:09 ?169次阅读

    智能路径调度:AI驱动负载均衡的异常路径治理实践

    在AI驱动的数据中心网络环境中,传统的“尽力而为”和“无差别均分”负载均衡策略已力不从心。基于路径综合质量的动态WCMP机制,通过实时感知路径状态、果断剔除异常、智能调度“健康”资源,有效解决了AI流量对网络高可靠、高性能的核心
    的头像 发表于 07-03 16:26 ?789次阅读
    智能路径<b class='flag-5'>调度</b>:AI驱动负载均衡的异常路径治理实践

    树莓派部署 Kubernetes:通过 UDM Pro 实现 BGP 负载均衡!

    最近,我将家庭实验室的架构核心切换为一组树莓派。尽管在树莓派上运行的Kubernetes发行版众多,但在资源受限的设备上运行Kubernetes时,控制平面的开销是一个常见挑战
    的头像 发表于 06-25 18:00 ?321次阅读
    树莓派部署 <b class='flag-5'>Kubernetes</b>:通过 UDM Pro 实现 BGP 负载均衡!

    【启扬方案】基于RK3588的救护车智能调度系统应用解决方案

    在紧急医疗救援领域,救护车调度效率直接关乎患者生命与医疗资源的有效利用。然而,传统的救护车调度面临事件突发性、交通复杂、资源有限及人工决策局限等挑战,常导致响应延迟、
    的头像 发表于 06-12 17:26 ?301次阅读
    【启扬方案】基于RK3588的救护车智能<b class='flag-5'>调度</b>系统应用解决方案

    详解Kubernetes中的Pod调度亲和性

    Kubernetes(K8s)中,Pod 调度亲和性(Affinity) 是一种高级调度策略,用于控制 Pod 与节点(Node)或其他 Pod 之间的关联(亲和)或反关联(反亲和)关系。通过亲和性规则,管理员可以更精细地控
    的头像 发表于 06-07 13:56 ?274次阅读

    安全生产调度管理系统的核心功能模块

    安全生产调度管理系统是运用现代信息技术构建的智能化管理平台,旨在实现生产安全风险的全面管控和应急资源的优化调度。该系统通过整合物联网、大数据、人工智能等前沿技术,建立起覆盖风险监测、预警预测、指挥
    的头像 发表于 05-16 15:25 ?210次阅读

    Kubernetes Helm入门指南

    Helm 是 Kubernetes 的包管理工具,它允许开发者和系统管理员通过定义、打包和部署应用程序来简化 Kubernetes 应用的管理工作。Helm 的出现是为了解决在 Kubernetes
    的头像 发表于 04-30 13:42 ?2355次阅读
    <b class='flag-5'>Kubernetes</b> Helm入门指南

    Kubernetes负载均衡器MetalLB介绍

    Kubernetes中一个应用服务会有一个或多个实例,每个实例(Pod)的IP地址由网络插件动态随机分配(Pod重启后IP地址会改变)。为屏蔽这些后端实例的动态变化和对多实例的负载均衡,引入了 Service这个资源对象。
    的头像 发表于 03-18 16:24 ?427次阅读
    <b class='flag-5'>Kubernetes</b>负载均衡器MetalLB介绍

    Kubernetes中部署MySQL集群

    一般情况下 Kubernetes 可以通过 ReplicaSet 以一个 Pod 模板创建多个 pod 副本,但是它们都是无状态的,任何时候它们都可以被一个全新的 pod 替换。
    的头像 发表于 03-18 16:22 ?311次阅读
    <b class='flag-5'>Kubernetes</b>中部署MySQL集群

    Kubernetes包管理工具Helm的安装和使用

    Helm 可以帮助我们管理 Kubernetes 应用程序 - Helm Charts 可以定义、安装和升级复杂的 Kubernetes 应用程序,Charts 包很容易创建、版本管理、分享和分布。
    的头像 发表于 03-13 16:06 ?1057次阅读

    Kubernetes Pod常用管理命令详解

    Kubernetes Pod常用管理命令详解
    的头像 发表于 02-17 14:06 ?572次阅读
    <b class='flag-5'>Kubernetes</b> Pod常用管理命令详解

    Kubernetes:构建高效的容器化应用平台

    Kubernetes 作为容器编排的事实标准,在容器化应用部署中发挥着关键作用。 搭建 Kubernetes 集群是应用的基础。可以使用kubeadm工具快速搭建。在主节点执行kubeadm
    的头像 发表于 01-23 15:22 ?363次阅读

    使用 Flexus 云服务器 X 实例部署 Kubernetes 图形化管理平台

    Kubernetes 作为当今最流行的容器编排平台,随着云计算、微服务架构和 DevOps 文化的普及,Kubernetes 在自动化部署、扩展和管理容器化应用程序方面扮演着越来越重要的角色。未来
    的头像 发表于 01-21 16:14 ?368次阅读
    使用 Flexus 云服务器 X 实例部署 <b class='flag-5'>Kubernetes</b> 图形化管理平台

    Kubernetes的CNI网络插件之flannel

    Kubernetes设计了网络模型,但却将它的实现讲给了网络插件,CNI网络插件最重要的功能就是实现Pod资源能够跨主机通信。
    的头像 发表于 01-02 09:43 ?850次阅读

    使用Velero备份Kubernetes集群

    Velero 是 heptio 团队(被 VMWare 收购)开源的 Kubernetes 集群备份、迁移工具。
    的头像 发表于 08-05 15:43 ?677次阅读
    使用Velero备份<b class='flag-5'>Kubernetes</b>集群