麒麟云 K8s 调度优化之错误重调度
Kubernetes 默认的异常 Pod 重启恢复机制存在局限。本文将介绍一种优化的调度策略,通过增加错误 Pod 的重调度机制,来提高 Kubernetes 的自动容错能力和服务的高可用性。
Kubernetes 作为麒麟云中的核心容器编排平台,其默认的异常 Pod 重启恢复机制存在局限,例如,在资源不足或节点硬件故障导致 Pod 异常退出的情况下,原地重启策略将无法修复问题,需要人工介入重调度将 Pod 迁移到其他节点。这将限制系统的自动容错能力,从而降低服务的可靠性和高可用性。为了解决上述问题,我们提出了一种优化调度策略,通过实现错误 Pod 的自动重调度机制,来提升 Kubernetes 的自动容错能力。
1 设计思路
重调度机制的设计思路如下所示:
用户可以在工作负载资源(如 Deployment、StatefulSet)的描述中配置最大调度次数,该配置将记录在资源的元数据中。
引入一个调度控制器,用于监听集群中状态异常的 Pod。对于每个异常的 Pod,控制器将检查其所属工作负载资源元数据中记录的当前调度次数。如果当前调度次数不超过用户配置的最大调度次数,则将当前调度次数加 1,并将 Pod 当前所在节点记录到已调度节点列表中。
接着,调度控制器将删除该异常 Pod。工作负载资源的控制器会自动重新创建 Pod 并进行调度,但会过滤掉已调度节点列表中的节点,从而实现错误 Pod 的重调度。
2 设计考虑
在设计过程中,我们考虑了以下几个因素:
对于 DaemonSet 资源,由于 Pod 总是会调度到集群所有节点,可以根据 Pod 重启策略进行原地重启,因此我们不需要额外处理。
对于 StatefulSet 资源,控制的 Pod 之间角色不对等,无法简单地采用一个列表来记录已调度节点。我们使用一个 Map 来分别记录每个 Pod 的已调度节点。
如果异常 Pod 的调度状态为失败,表明重调过程中可能因过滤掉之前的调度节点导致调度不成功。此时,调度控制器将清空已调度节点列表,确保新的 Pod 在重新调度时不受之前调度节点的影响。
如果异常 Pod 的创建时间超过一定阈值,表明该 Pod 可能是在运行一段时间后发生异常退出,原因可能是节点负载或环境动态变化。这些变化会反映到 Kubernetes 的调度器中,并作为调度选择的因素。因此,在这种情况下,调度控制器也会清空已调度节点列表,让 Kubernetes 默认调度器进行重新调度。
3 实现方案
根据以上设计思路,我们实现了如下三个组件来优化麒麟云 Kubernetes 的调度:
一个调度控制器,用于监听集群中状态异常的 Pod,维护当前调度次数和已调度节点列表的元数据,并执行删除 Pod 的操作。
一个调度插件,工作在调度器的 Prefilter 阶段,用于过滤已调度的节点。
一个 MutateWebhook 插件,用于拦截集群中提交的 Pod 创建请求,并将 Pod 对应的工作负载资源元数据拷贝到 Pod 的元数据中。调度插件在过滤时直接访问 Pod 元数据中记录的已调度节点列表。
图 1 重调度架构设计图
在实现过程中,需要注意以下几个细节:
当前调度次数和已调度节点列表是由调度控制器进行动态维护的元数据,而不是用户配置的元数据。在工作负载资源创建后,其对应的 Pod 在首次重新调度之前并不存在。当调度控制器发现满足重新调度条件的 Pod 且上述元数据不存在时,会直接在工作负载资源的元数据中添加这些信息,并将当前调度次数设置为 1,已调度节点列表设置为当前节点。
Kubernetes 支持直接提交 Pod 创建请求而不经过工作负载资源的方式,尽管在生产环境中很少使用。在这种情况下,用户可以直接在 Pod 描述文件的注释字段中配置重新调度次数。调度控制器将元数据记录在 Pod 的元数据中,并在删除 Pod 之前,将元数据复制到新的 Pod 中。
对于通过工作负载资源创建 Pod 的主要场景,调度控制器将元数据记录在工作负载资源的元数据中,而不是记录在 Pod 中。删除 Pod 后,工作负载资源的控制器会自动创建新的 Pod,并继承相应的元数据。
4 总结
错误 Pod 的重调度机制能够在调度周期 PreFilter 阶段过滤排除掉已调度节点列表,并将该 pod 调度到新的计算节点,成功提升了系统的自动容错能力和服务的高可用性。这一优化方案将为麒麟云用户提供更可靠更稳定的容器服务。
相关代码链接:
http://gitee.com/openkylin/kse-rescheduler
https://github.com/kylincloudnative/kse-rescheduler
银河麒麟云原生操作系统是麒麟软件面向云原生场景,为支撑云原生应用而全新打造的一款操作系统产品。云原生应用对操作系统有更多的功能需求和特殊的性能需求,如容器编排,集群调度,服务发现,负载均衡,弹性伸缩,资源隔离,快速容器创建,低延迟容器网络等。同时,在云原生应用编排领域,kubernetes 已成为业界的事实标准。银河麒麟云原生操作系统采用"内核+操作系统+kubernetes"的联合设计思想,在传统操作系统接口外,为云原生应用提供 kubernetes 扩展 API,支持操作系统集群粒度统一纳管,支持一致性发布和原子回滚。在容器调度,容器网络,容器运行时等关键组件进行深入优化,致力打造国产平台容器性能标杆。银河麒麟云原生操作系统已运用于银行和证券领域。
评论