OpenKruise调研
OpenKruise是阿里云开源的一系列基于k8s的扩展组件的集合,其中包含了像增强版的workload、sidecar容器管理、高可用性防护等特性,包含了很多的“黑科技”。
如果k8s的kube-controller-manager组件可以提供非常强的扩展能力,可以实现自定义的Deployment、StatefulSet的controller,而不是使用原生的kube-controller-manager的功能,类似于实现自定义的调度器扩展功能。那么很有可能OpenKruise的实现方案就不再会采用CRD扩展的方式,而是直接在原生的Deployment、StatefulSet等对象上通过annotation的方式来实现。
安装
可以直接使用helm的方式安装
1 | helm repo add openkruise https://openkruise.github.io/charts/ |
安装完成后,可以看到在kruise-system下创建了一个DeamonSet和一个Deployment。并且安装了很多的CRD和webhook组件。
1 | $ kubectl get pod -n kruise-system |
功能
大类 | 子类 | 描述 |
---|---|---|
通用工作负载 | CloneSet | 定位是用来代替k8s的Deployment,但做了很多能力的增强。增强的功能点: 1. 支持声明pvc,给pod来申请pv。当pod销毁后,pvc会同步销毁。 2. 指定pod来进行缩容。 3. 流式扩容,可以指定扩容的步长等更高级的库容特性。 4. 分批灰度。 5. 通过partition回滚。 6. 控制pod的升级顺序。 7. 发布暂停。 8. 原地升级自动镜像预热。 9. 生命周期钩子。pod的多个声明周期之间可以读取finalizer,如果finalizer中有指定的值,则controller会停止。该行为作为k8s的一种hook方式,用户可以自定义controller来控制finalizer的行为。 |
通用工作负载 | Advanced StatefulSet | 用来取代k8s原生的StatefulSet,很多增强特性跟CloneSet比较类似。 1. 原地升级。 2. 升级顺序增强。 3. 发布暂停。 4. 原地升级自动预热。 5. 序号跳过。StatefulSet创建的pod的后缀会从0开始依次累加,可以指定某个特定的序号跳过。 6. 流式扩容。 |
通用工作负载 | Advanced DaemonSet | 用来取代k8s原生的DaemonSet。1. 热升级 2. 暂停升级 |
任务工作负载 | BroadcastJob | agent类型的job,每个节点上都会执行 |
任务工作负载 | AdvancedCronJob | 原生的CronJob的扩展版本,可以周期性创建BroadcastJob。 |
Sidecar容器管理 | SidecarSet | 用来管理Sidecar容器,其最核心的功能是支持在pod不重启的情况下Sidecar容器的热升级 |
多区域管理 | WorkloadSpread | 将workload按照不同的策略来打散,随着k8s功能不断完善,部分功能k8s已经具备。支持Deployment、ReplicaSet、CloneSet。 |
多区域管理 | UnitedDeployment | k8s集群内可能存在不同种类型的node,该特性通过UnitedDeployment对象来管理将一个workload的不同pod分发到不同类型的节点上,并且可以指定不同类型节点的pod副本数。 |
增强运维 | 重启一个pod中的某个容器 | 该特性依赖于kurise-daemon组件实现,通过将容器进程停掉,kubelet检测到容器停掉后会自动将容器拉起。停掉容器的方式跟kubelet实现一致。 |
增强运维 | 镜像预热 | 通过ImagePullJob CR提供操作入口,底层的实现通过调用CRI的pod image接口实现 |
增强运维 | 控制pod中容器的启动顺序 | kruise创建一个ConfigMap,并在pod中注入来挂载该ConfigMap,每个容器使用ConfigMap中的不同key。kruise依次往CM中增加key来实现控制容器启动顺序的目的。 |
增强运维 | 资源分发ResourceDestribution | 可以跨namespace来分发CM、Secret,保证每个namespace下均有 |
应用安全防护 | 资源删除防护 | 通过webhook技术实现 |
应用安全防护 | PodUnavailableBudget | 通过webhook实现的k8s原生的pdb能力的增强,覆盖pdb不具备的场景 |