OpenKruise :Kubernetes背后的托底
内容提要
OpenKruise是基于Kubernetes的扩展套件,提供应用部署、升级、防护、运维等功能。它包括增强版本的Workloads、应用的旁路管理、高可用性防护和高级的应用运维能力。常用功能包括调度策略、缩容顺序控制、指定Pod缩容和原地升级。OpenKruise可通过Helm进行安装和升级。
延伸解读
OpenKruise 与原生 Kubernetes 的互补关系
OpenKruise 并非要替代 Kubernetes 原生工作负载,而是针对大规模场景下的不足进行扩展。例如,原生 Deployment 和 StatefulSet 在缩容时无法指定删除特定 Pod,而 CloneSet 通过 podsToDelete 字段实现了这一能力。此外,原地升级避免了重建 Pod 带来的调度和 IP 分配开销,这些增强功能通过 CRD 提供,可运行在任意纯净集群中,无需外部依赖。
原地升级的实际收益与适用场景
原地升级通过复用同一个 Pod 对象,仅修改镜像等字段,避免了重建升级中的调度、IP 分配和挂载盘操作。同时,由于复用旧镜像的 layer 层,镜像拉取更快,且升级某个容器时其他容器不受影响。目前支持原地升级的工作负载包括 CloneSet、Advanced StatefulSet、Advanced DaemonSet 和 SidecarSet,适合对 Pod 身份和网络稳定性有要求的场景。
缩容顺序控制的实现机制
OpenKruise 利用 Kubernetes 1.21 引入的 PodDeletionCost 注解来控制缩容顺序。用户可为 Pod 设置删除代价,值越小越优先删除,未设置则默认为 0。CloneSet 已原生支持该特性,其他原生工作负载需 Kubernetes 1.21 及以上并开启 feature-gate(1.22 起默认开启)。WorkloadSpread 则通过 webhook 注入域规则,结合该特性实现更精细的缩容顺序管理。
安装与升级的注意事项
OpenKruise 要求 Kubernetes 版本不低于 1.16,推荐使用 Helm 进行安装和升级。安装时可通过指定版本号(如 1.5.0)获取稳定版,也可下载 chart 包定制 resources 或 feature-gates。升级时需注意版本兼容性,从 0.x 升级到 1.x 必须添加 --force 参数,若需重置旧参数建议使用 --reset-values。升级前应了解新版本的不兼容变化。
Q&A
OpenKruise 是什么?它主要解决 Kubernetes 的哪些不足?
OpenKruise 是一个基于 Kubernetes 的扩展套件,主要聚焦于云原生应用的自动化,如部署、发布、运维以及可用性防护。它弥补了 Kubernetes 在大规模应用场景中的不足,例如应用发布时的原地升级策略、流式扩容、缩容顺序控制等。
OpenKruise 的核心组件有哪些?它们的作用是什么?
OpenKruise 的核心组件包括 Kruise-manager 和 kruise-daemon。Kruise-manager 是运行 controller 和 webhook 的中心组件,通过 Deployment 部署在 kruise-system 命名空间,采用 leader-election 选主实现高可用,并包含 admission webhook。kruise-daemon 从 v0.8.0 版本开始提供,通过 DaemonSet 部署到每个 Node 节点上,提供镜像预热、容器重启等功能。
OpenKruise 的 WorkloadSpread 功能有什么作用?支持哪些调度规则?
WorkloadSpread 能够将 workload 的 Pod 按一定规则分布到不同类型的 Node 节点上,赋予单一 workload 多区域部署和弹性部署的能力。常见规则包括:水平打散(如按 host、az 等维度平均打散)、按指定比例打散、带优先级的分区管理(如优先部署到 ecs,资源不足时部署到 eci)、定制化分区管理(如控制不同 CPU 架构上的 Pod 数量和资源配额)。
OpenKruise 如何控制 Pod 的缩容顺序?
OpenKruise 通过 PodDeletionCost 控制 Pod 的删除顺序。用户可以在 Pod 上配置 annotation controller.kubernetes.io/pod-deletion-cost,值范围在 [-2147483647, 2147483647],表示 Pod 的“删除代价”,代价越小的 Pod 删除优先级越高。没有设置该 annotation 的 Pod 默认 deletion cost 为 0。CloneSet 已支持该特性,其他 native workload 需 Kubernetes 版本 >= 1.21。在 OpenKruise 中,可以配置 WorkloadSpread,借助 APIServer 的 PodDeletionCost 特性,利用 webhook 向 Pod 注入域规则,从而控制缩容顺序。
OpenKruise 的原地升级功能相比重建升级有哪些优势?
原地升级允许在不删除 Pod 的情况下升级镜像,复用同一个 Pod 对象,只修改其中的字段。相比重建升级,原地升级可以避免调度、分配 IP、挂载盘等额外操作和代价,更快的镜像拉取(复用旧镜像的大部分 layer 层,只需拉取新镜像变化的 layer),并且当一个容器在原地升级时,Pod 中的其他容器不会受到影响,仍然维持运行。
如何安装和升级 OpenKruise?
OpenKruise 要求 Kubernetes 版本 >= 1.16,推荐使用 Helm 进行安装和升级。安装步骤:添加 Helm 仓库 helm repo add openkruise https://openkruise.github.io/charts/,更新仓库 helm repo update,然后安装指定版本 helm install kruise openkruise/kruise --version 1.5.0。升级步骤:添加仓库后,使用 helm upgrade kruise openkruise/kruise --version 1.5.0 [--force] 进行升级。升级前需了解新版本的不兼容变化,重置参数可加 --reset-values,从 0.x 升级到 1.x 需加 --force。