Jenkins 高可用,到底怎么搞?

devopscube 2024年7月24日

本文探讨如何使用开源版本构建高可用的 Jenkins。

在开始讨论高可用性之前,您首先需要了解 Jenkins 如何管理其数据和高层架构。如果您不了解该架构,我强烈建议您阅读 Jenkins 架构帖子。

Jenkins HA 方案

由于 Jenkins 管理数据的方式,没有直接的方法将 Jenkins 设置为高可用模式。

Jenkins 在平面文件 (xml) 中管理其数据,并且您只能拥有一个可以读取 Jenkins 数据的主节点实例。

因此,官方不支持以主-主的方式运行 Jenkins,即有多个 master 节点,都可以处理任务的方式。例如,如果您尝试使用共享卷配置多个主节点,则会出现读写不一致的情况,从而导致 Jenkins 不稳定。

有两种方法可以让 Jenkins 处于 HA 模式。

  • Jenkins active-active/active-passive 模式 只有企业 Jenkins 附带受支持的插件才能进行此设置。但大多数组织都使用开源版本,他的选择超出了范围。另外,还有一个使用 HAproxy 的选项,但是,我认为这会产生一些管理开销。
  • 基于自动扩缩组的 Jenkins HA 架构:让 Jenkins 加入自动扩缩组是获得高可用 Jenkins 的一种解决方法。它不是 100% HA 解决方案;但是,无论出于何种原因,如果您的 Jenkins 服务器崩溃,短时间内就会出现另一个实例。这适用于基于 VM 和 Kubernetes 的 Jenkins 设置

基于自动扩缩组的 Jenkins HA 架构

您可以将此方法称为 Jenkins HA 的穷人解决方案。因为,当一个实例宕机时,另一个实例需要几分钟的宕机时间才能启动(vm + java服务启动时间)。但它有效。

此方法适用于任何具有自动缩放选项的私有/公共云平台。

这种方法类似于在 Kubernetes 上部署 Jenkins,如果 Jenkins pod 出现故障,另一个 pod 将提供相同的数据。

这里不是 pod,而是虚拟机,因此启动时间比启动新 pod 需要更多时间。

让我们看看使用自动缩放组的 Jenkins HA 设置的高级架构。

Jenkins HA - autoscaling

这里的理念非常简单:

  • Jenkins 部署在一个自动缩放组中,最小和最大数量都设置为 1。它确保我们始终只有一个 Jenkins 实例在运行。
  • 然后,我们有一个专用的外部磁盘来保存Jenkins数据。它可以是单独的卷或 NFS 共享。自动缩放映像启动脚本(AMI 用户数据)会在该磁盘启动时正常附加该磁盘。
  • 如果活动的 Jenkins 实例出现故障,自动扩展策略将启动另一个实例,同时终止不活动的实例。在此过程中,数据磁盘从终止实例中优雅地分离(在 AWS 中使用生命周期挂钩)并附加到新实例,保留之前的 Jenkins 状态和数据。
  • 所有现有作业都将在停机期间失败,或者在新实例出现时继续。

此设置还使升级和修补过程变得如此简单。

基于 Kubernetes 的 Jenkins HA 架构

当部署在 Kubernetes 时,它应该通过 StatefulSet 部署。此外,我们需要将 StatefulSet 副本保持为一个,并且 Jenkins 数据目录应该挂载到持久卷以存储 Jenkins 数据(例如,作业历史、插件、配置)。

即使 Jenkins master pod 被重新调度或重新启动,这也可以确保数据仍然存在。

有多种方法可以扩展 Jenkins 代理。在此方法中,一旦构建完成,代理就会动态配置和终止。

Agent 水平扩展

好消息是,您可以水平扩展 Jenkins agent。有多种方法可以水平扩展 Jenkins agent。以下方法,agent 都是动态提供,用完了就自动终止:

  • 使用 Kubernetes Pod 扩展 Jenkins agent
  • 使用 Docker 扩展 Jenkins agent
  • 使用 EC2 扩展 Jenkins agent

部署 Jenkins HA

如果您想在 AWS 云上尝试此部署,可以使用我的文档。我在这里记录了 AWS 的整个部署方法:《使用 AWS Autoscaling group 部署 Jenkins HA》,相关 IaC 代码在:

https://github.com/techiescamp/devops-projects 请尝试此这套配置,看看它是否适合您。

另外,您应该使用插件和磁盘快照定期备份 jenkins 数据。如果您有所有数据备份,您可以轻松恢复可以正常工作的版本。


本博客出自快猫星云的小伙伴们,快猫星云是一家专注在监控/可观测性领域的初创公司,其团队是开源项目 Open-Falcon、Nightingale 的创始团队。如果您想要采购监控/可观测性相关的产品方案,欢迎 联系我们做产品技术交流

标签: Jenkins
开源版
Flashcat
Flashduty