本文分享自华为云社区《OpenKruise核心能力和工作原理》,作者:可以交个朋友。一、诞生背景Kubernetes 自身提供的应用部署管理功能,无法满足大规模应用场景的需求,例如应用发布时的原地升级策略,流式扩容,缩容顺序控制等等。所以OpenKruise的出现弥补了 Kubernetes 在应用部署、升级、防护、运维等领域的不足。二、OpenKruise介绍核心能力介绍,帮助快速入门openkruise。2.1 架构预览OpenKruise 的功能都是通过 Kubernetes API 来提供的。三、核心能力OpenKruise 是一个基于 Kubernetes 的扩展套件,主要聚焦于云原生应用的自动化,比如部署、发布、运维以及可用性防护。OpenKruise 提供的绝大部分能力都是基于 CRD 扩展来定义,它们不存在于任何外部依赖,可以运行在任意纯净的 Kubernetes 集群中。核心能力包括:以下将对常用场景功能进行介绍。3.1 丰富的调度策略WorkloadSpread能够将workload的Pod按一定规则分布到不同类型的Node节点上,赋予单一workload多区域部署和弹性部署的能力。常见的一些规则包括:每一个WorkloadSpread定义多个区域(定义为subset), 每个subset对应一个maxReplicas数量。WorkloadSpread利用Webhook注入subset定义的域信息,同时控制Pod的扩缩容顺序。3.2 缩容顺序控制pod 的删除场景可通过PodDeletionCost进行控制:较小 pod-deletion cost < 较大 pod-deletion costcontroller.kubernetes.io... 是从 Kubernetes 1.21 版本后加入的 annotation,Deployment/ReplicaSet 在缩容时会参考这个 cost 数值来排序。在openkruise中,我们可以配置WorkloadSpread,借助 APIServer PodDeletionCost 特性,WorkloadSpread 利用 webhook 向Pod注入域规则,从而控制缩容顺序。3.3 指定Pod缩容当一个 CloneSet 被缩容时,支持用户指定一些 Pod 来删除。这对于 StatefulSet 或者 Deployment 来说是无法实现的,因为 StatefulSet 要根据序号来删除 Pod,而 Deployment/ReplicaSet 目前只能根据控制器里定义的排序来删除。CloneSet 允许用户在缩小 replicas 数量的同时,指定想要删除的 Pod 名字。参考下面这个例子:当控制器收到上面这个 CloneSet 更新之后,会确保 replicas 数量为 4。如果 podsToDelete 列表里写了一些 Pod 名字,控制器会优先删除这些 Pod。 对于已经被删除的 Pod,控制器会自动从 podsToDelete 列表中清理掉。如果你只把 Pod 名字加到 podsToDelete,但没有修改 replicas 数量,那么控制器会先把指定的 Pod 删掉,然后再扩一个新的 Pod。3.4、原地升级原地升级是 OpenKruise 提供的核心功能之一。目前支持原地升级的 Workload:当我们要升级一个存量 Pod 中的镜像时,这是 重建升级 和 原地升级 的区别:重建升级时我们要删除旧 Pod、创建新 Pod:但是对于原地升级,我们仍然复用同一个 Pod 对象,只是修改它里面的字段。因此:3.5 镜像预热NodeImage 和 ImagePullJob 是从 Kruise v0.8.0 版本开始提供的 CRD。Kruise 会自动为每个 Node 创建一个 NodeImage,它包含了哪些镜像需要在这个 Node 上做预热。用户能创建 ImagePullJob 对象,来指定一个镜像要在哪些 Node 上做预热。注意,NodeImage 是一个偏底层的 API,一般只在你要明确在某一个节点上做一次预热的时候才使用,否则你都应该使用 ImagePullJob 来指定某个镜像在一批节点上做预热。四、安装部署&升级从 v1.0.0 (alpha/beta) 开始,OpenKruise 要求在 Kubernetes >= 1.16 以上版本的集群中安装和使用。安装: 推荐使用helm方式进行安装如果不想使用默认的参数进行安装,可以手动下载chart包进行定制化安装,例如修改 resources 限制或者配置 feature-gates,chart包下载地址参考:openkruise.github.io/ch...升级: 通过helm方式升级点击关注,第一时间了解华为云新鲜技术~