OpenKruise

OpenKruisearrow-up-right 是阿里云开源的大规模应用自动化管理引擎,在 Kubernetes 原生 Deployment/StatefulSet 等控制器基础上,提供了更多的增强功能如:

  • 优雅原地升级

  • 发布优先级/打散策略

  • 多可用区 workload 抽象管理

  • 统一 sidecar 容器注入管理等

这些控制器可以帮助开发者应对更加多样化的部署环境和需求、为集群维护者和应用开发者带来更加灵活的部署发布组合策略。

扩展控制器

Kruise 是 OpenKruise 中的核心项目之一,它提供一套在 Kubernetes 核心控制器arrow-up-right之外的扩展 workload 管理和实现。目前,Kruise 提供了以下 5 个 Kubernetes 扩展控制器:

  • CloneSetarrow-up-right: 提供了更加高效、确定可控的应用管理和部署能力,支持优雅原地升级、指定删除、发布顺序可配置、并行/灰度发布等丰富的策略,可以满足更多样化的应用场景。

  • AdvancedStatefulSetarrow-up-right:基于原生 StatefulSet 之上的增强版本,默认行为与原生完全一致,在此之外提供了原地升级、并行发布(最大不可用)、发布暂停等功能。

  • SidecarSetarrow-up-right:对 sidecar 容器做统一管理,在满足 selector 条件的 Pod 中注入指定的 sidecar 容器。

  • UnitedDeploymentarrow-up-right: 通过多个 subset workload 将应用部署到多个可用区。

  • BroadcastJobarrow-up-right: 配置一个 job,在集群中所有满足条件的 Node 上都跑一个 Pod 任务。

关于命名规范

Kruise 中的扩展控制器采用与 Kubernetes 社区一致的命名规范:

  • Set 后缀:这类 controller 会直接操作和管理 Pod,比如 CloneSetReplicaSetSidecarSet 等。它们提供了 Pod 维度的多种部署、发布策略。

  • Deployment 后缀:这类 controller 不会直接地操作 Pod,它们通过操作一个或多个 Set 类型的 workload 来间接管理 Pod,比如 Deployment 管理 ReplicaSet 来提供一些额外的滚动策略,以及 UnitedDeployment 支持管理多个 StatefulSet/AdvancedStatefulSet 来将应用部署到不同的可用区。

  • Job 后缀:这类 controller 主要管理短期执行的任务,比如 BroadcastJob 支持将任务类型的 Pod 分发到集群中所有 Node 上。

CloneSet

CloneSetarrow-up-right 是对 Deployment 的增强版,主要用于管理对实例顺序没有要求的无状态应用。

下面是一个 CloneSet 的配置示例。

CloneSet 是对 Deployment 的增强

对于 Kubernetes 原生支持的 Deployment 控制器, CloneSet 在以下方面做出了增强:

  • 支持原地升级(In Place Update),需要在 updateStrategy 中配置,默认的升级策略为 ReCreate

  • 支持为每个 Pod 设置 PVC;

  • 支持选择性的删除某个 Pod;

  • 更加高级的升级和发布策略;

关于 CloneSet 的详细描述请见 Kruise 仓库arrow-up-right

AdvancedStatefulSet

AdvancedStatefulSetarrow-up-right 是对 Kubernetes 原生的 StatefulSet 的增强。

下面是一个 AdvancedStatefulSet 的配置示例。

AdvancedStatefulSet 是对 StatefulSet 的增强

AdvancedStatefulSet 基本保留了 Kubernetes 原生的 StatefulSet 的使用用法。在声明 AdvancedStatefulSet 时保留了 CRD 的名字 StatefulSet,不过将原来的 apiVersion 的值从 apps/v1 修改为了 apps.kruise.io/v1alpha1 ,并做出的如下方面的增强:

  • 支持原地升级,同 CloneSet 一样,需要在 updateStrategy 中配置,默认的升级策略为 ReCreate

  • 支持更高级的更新策略,例如根据权重按照特定的顺序更新 pod,而不是按照 pod 的名称顺序;

关于 AdvancedStatefulSet 的详细描述请见 Kruise 仓库arrow-up-right

SidecarSet

SidecarSetarrow-up-right 利用了 Kubernetes 的 mutating webhook 准入控制器,在 pod 创建时向其中自动注入 sidecar 容器,这个与 Istioarrow-up-right 的做法一致。

下面是一个 SidecarSet 的配置示例。

SidecarSet 的主要功能

Sidecar 容器的生命周期独立于整个 Pod,实现如下功能:

  • SidecarSet 可以向指定的 Pod 中注入 Sidecar 容器;

  • Sidecar 容器可以可原地升级(仅当更新镜像时);

关于 SidecarSet 的详细描述请见 Kruise 仓库arrow-up-right

UnitedDeployment

UnitedDeploymentarrow-up-right 主要用于分组发布,通过定义 subset 将工作负载发布到不同的可用区中。Kubernetes 集群中的不同域由多组由标签识别的节点表示。UnitedDeployment 控制器为每组提供一种类型的工作负载,并提供相应匹配的 NodeSelector,这样各个工作负载创建的 pod 就会被调度到目标域。

UnitedDeployment 管理的每个工作负载称为子集。每个域至少要提供运行 n 个副本数量的 pod 的能力。目前仅支持 StatefulSet 工作负载。下面的示例 YAML 展示了一个 UnitedDeployment,它在三个域中管理三个 StatefulSet 实例。管理的 pod 总数为 6。

UnitedDeployment 的主要功能

UnitedDeployment 主要功能即分组发布,控制不同可用区中的 StatefulSet 工作负载发布。

关于 UnitedDeployment 的详细描述请见 Kruise 仓库arrow-up-right

BroadcastJob

BroadcastJobarrow-up-right 控制器在集群中的每个节点上分发一个 Pod。像 DaemonSet 一样,BroadcastJob 确保 Pod 被创建并在集群中的所有选定节点上运行一次。

BroadcastJob 在每个节点上的 Pod 运行完成后不会消耗任何资源。当升级一个软件,例如 Kubelet,或者在每个节点上进行验证检查时,BroadcastJob 特别有用,通常在很长一段时间内只需要一次,或者运行一个临时性的完整集群检查脚本。

BroadcastJob pod 也可以选择在所需节点上运行完成后保持存活,这样在每一个新节点被添加到集群后,就会自动启动一个 Pod。

下面是一个 BroadcastJob 的示例。

BroadcastJob 的支持多种 CompletionPolicyFailurePolicy 设置,关于 BroadcastJob 的详细描述请见 Kruise 仓库arrow-up-right。、

安装

使用 Helm v3 安装,并保证 Kubernetes 版本不低于 1.12。

默认启用所有支持的扩展控制器,若您想只启动指定的控制器,可以在执行上面的命令时设置环境变量,例如您想只启用 CloneSetStatefulSet,可以加上这样的:

卸载

要想卸载 Kruise,只需要执行下面的命令:

注意:卸载会导致所有 Kruise 下的资源都被删除,包括 webhook configurations、services、namespace、CRD、CR 实例和所有 Kruise workload 下的 Pod。 请务必谨慎操作!

总结

Kruise 在 Kubernetes 原生控制器基础上进行了扩展,主要增加了原地升级,更灵活的发布策略及多一些特殊场景的适配(如 SidecarSet、UnitedDeployment),CloneSet 可以完全替代 Deployment,AdvancedStatefulSet 可以完全替代 StatefulSet,且使用方式都类似,用户可以无负担的轻松接入。

参考

最后更新于