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阶段,用于过滤已调度的节点。
-
一个Mutate Webhook插件,用于拦截集群中提交的Pod创建请求,并将Pod对应的工作负载资源元数据拷贝到Pod的元数据中。调度插件在过滤时直接访问Pod元数据中记录的已调度节点列表。
图1 重调度架构设计图
在实现过程中,需要注意以下几个细节:
-
当前调度次数和已调度节点列表是由调度控制器进行动态维护的元数据,而不是用户配置的元数据。在工作负载资源创建后,其对应的Pod在首次重新调度之前并不存在。当调度控制器发现满足重新调度条件的Pod且上述元数据不存在时,会直接在工作负载资源的元数据中添加这些信息,并将当前调度次数设置为1,已调度节点列表设置为当前节点。
-
Kubernetes支持直接提交Pod创建请求而不经过工作负载资源的方式,尽管在生产环境中很少使用。在这种情况下,用户可以直接在Pod描述文件的注释字段中配置重新调度次数。调度控制器将元数据记录在Pod的元数据中,并在删除Pod之前,将元数据复制到新的Pod中。
-
对于通过工作负载资源创建Pod的主要场景,调度控制器将元数据记录在工作负载资源的元数据中,而不是记录在Pod中。删除Pod后,工作负载资源的控制器会自动创建新的Pod,并继承相应的元数据。
4 总结
错误Pod的重调度机制能够在调度周期PreFilter阶段过滤排除掉已调度节点列表,并将该pod调度到新的计算节点,成功提升了系统的自动容错能力和服务的高可用性。这一优化方案将为麒麟云用户提供更可靠更稳定的容器服务。
相关代码链接:
银河麒麟云原生操作系统是麒麟软件面向云原生场景,为支撑云原生应用而全新打造的一款操作系统产品。云原生应用对操作系统有更多的功能需求和特殊的性能需求,如容器编排,集群调度,服务发现,负载均衡,弹性伸缩,资源隔离,快速容器创建,低延迟容器网络等。同时,在云原生应用编排领域,kubernetes已成为业界的事实标准。银河麒麟云原生操作系统采用"内核+操作系统+kubernetes"的联合设计思想,在传统操作系统接口外,为云原生应用提供kubernetes 扩展API,支持操作系统集群粒度统一纳管,支持一致性发布和原子回滚。在容器调度,容器网络,容器运行时等关键组件进行深入优化,致力打造国产平台容器性能标杆。银河麒麟云原生操作系统已运用于银行和证券领域。