更新时间:2025-08-19 GMT+08:00

OpenKruise

插件简介

OpenKruise是一个基于Kubernetes的扩展套件,使用CRD拓展来提供扩展工作负载和应用管理能力,实现云原生应用的自动化部署、发布、运维和可用性防护,使得应用的管理更加简单和高效。

OpenKruise的核心能力如下:

  • 高级工作负载:OpenKruise包含一系列增强版本的工作负载,例如CloneSet、Advanced StatefulSet等工作负载。
  • 应用sidecar管理:OpenKruise提供了多种SidecarSet,简化了sidecar的注入,并提供了sidecar原地升级的能力。
  • 应用安全防护:OpenKruise可以保护您的Kubernetes资源不受级联删除机制的干扰。
  • 高效应用运维能力:OpenKruise提供了很多高级的运维能力来帮助您更好地管理应用,例如使用ImagePullJob在任意范围的节点上预先拉取某些镜像,或者原地重启Pod中的容器等。

开源社区地址:https://github.com/openkruise/kruise

OpenKruise常用工作负载控制器介绍

OpenKruise中包含CloneSet、Advanced StatefulSet、Advanced DaemonSet等工作负载控制器。常用的工作负载如下:

控制器

说明

增强特性

CloneSet

无状态应用的增强型部署控制器,对标原生Deployment,提供了更灵活的升级和管理能力。

  • 支持原地升级,无需重建Pod。
  • 精细化升级策略,支持按比例/数量分批,控制最大不可用/最小就绪数。
  • 保留历史版本,支持快速回滚。
  • 可通过标签选择特定Pod操作。

更多功能特性详情请参见CloneSet

Advanced StatefulSet

有状态应用的增强型控制器,基于原生StatefulSet扩展。

  • 支持原地升级,无需重建Pod。
  • 支持指定Pod缩容。
  • 支持设置升级顺序,突破原生StatefulSet顺序更新的限制。

更多功能特性详情请参见Advanced StatefulSet

Advanced DaemonSet

节点级服务的增强型控制器,替代原生 DaemonSet。

  • 支持原地升级,无需重建Pod。
  • 可通过标签选择升级Pod。
  • 支持分批升级,且支持暂停。

更多功能特性详情请参见Advanced DaemonSet

SidecarSet

Sidecar容器的集中管理控制器,实现与业务容器解耦。

  • 支持自动注入,通过标签选择器为符合条件的Pod注入Sidecar容器。
  • 支持原地升级,单独升级Sidecar容器,不影响业务容器。
  • 支持优先级控制,定义Sidecar容器的启动/终止顺序。

更多功能特性详情请参见SidecarSet

UnitedDeployment

跨分区的分布式应用管理控制器,支持多区域/节点组的统一部署。

  • 支持分区定义,可按节点标签、地域等划分多个分区,并为每个分区创建不同的工作负载。
  • 支持弹性分配,可根据分区列表顺序进行扩缩容。
  • 支持自适应调度,自动将Pending副本调度到可用分区。

更多功能特性详情请参见UnitedDeployment

约束与限制

如果您已经在集群中部署了社区的OpenKruise,请您先将其卸载后再安装CCE提供的OpenKruise插件,否则可能会出现插件安装失败的情况。

注意事项

OpenKruise开源组件中,引入了Webhook的配置,社区将其默认配置的Pod相关失效策略为Fail,这意味着一旦kruise-controller-manager处于不可用状态,将会造成Pod的创建/删除等操作都将会被拦截。因此在使用该插件前,请慎重评估使用该插件所引入的风险,并且尽量将kruise-controller-manager组件配置为多实例的高可用状态,以确保kruise-controller-manager中的Webhook Server能够正常处理请求。

OpenKruise是CCE基于开源软件进行适配并集成的精选开源插件,CCE将提供全面的技术支持服务。然而,CCE不承担因开源软件缺陷导致的业务损失责任,也不承担赔偿或额外的服务,强烈建议用户定期升级软件以修复潜在问题。

安装步骤

  1. 登录CCE控制台,单击集群名称进入集群。
  2. 单击左侧导航栏的“插件中心”,在右侧找到OpenKruise插件,单击“安装”
  3. 在安装插件页面,根据需求选择“规格配置”

    • 选择“系统预置规格”时,您可根据集群规模选择“小规格”或“大规格”,系统会根据不同的预置规格配置插件的实例数及资源配额,具体配置值请以控制台显示为准。

      “小规格”为单实例部署,适用50节点以下集群规模;“大规格”为高可用部署,适用50节点以上集群规模。

    • 选择“自定义规格”时,您可根据需求调整插件实例数和资源配额。实例数为1时插件不具备高可用能力,当插件实例所在节点异常时可能导致插件功能无法正常使用,请谨慎选择。

  4. 选择是否开启“kruise-daemon配置”

    kruise-daemon是OpenKruise新增的DaemonSet组件,可为您提供镜像预热、容器重启功能。

    在v1.25及以上版本的集群中安装1.0.23及之前版本的OpenKruise插件时,kruise-daemon无法在使用docker容器引擎的节点上运行,请使用containerd容器引擎。详细原因请参见组件说明

  5. 设置插件实例的部署策略。

    • 调度策略对于DaemonSet类型的插件实例不会生效。
    • 设置多可用区部署或节点亲和策略时,需保证集群中存在满足调度策略的节点且拥有足够的资源,否则插件实例将无法运行。
    表1 插件调度配置

    参数

    参数说明

    多可用区部署

    • 优先模式:优先将插件的Deployment实例调度到不同可用区的节点上,如集群下节点不满足多可用区,插件实例将调度到单可用区下的不同节点。
    • 均分模式:插件Deployment实例均匀调度到当前集群下各可用区,增加新的可用区后建议扩容插件实例以实现跨可用区高可用部署;均分模式限制不同可用区间插件实例数相差不超过1,单个可用区资源不足会导致后续其他实例无法调度。
    • 强制模式:插件Deployment实例强制调度到不同可用区的节点上,每个可用区下最多运行一个实例。如集群下节点不满足多可用区,插件实例将无法全部运行。节点故障后,插件实例存在无法迁移风险。

    节点亲和

    • 不配置:插件实例不指定节点亲和调度。
    • 指定节点调度:指定插件实例部署的节点。若不指定,将根据集群默认调度策略进行随机调度。
    • 指定节点池调度:指定插件实例部署的节点池。若不指定,将根据集群默认调度策略进行随机调度。
    • 自定义亲和策略:填写期望插件部署的节点标签实现更灵活的调度策略,若不填写将根据集群默认调度策略进行随机调度。

      同时设置多条自定义亲和策略时,需要保证集群中存在同时满足所有亲和策略的节点,否则插件实例将无法运行。

    容忍策略

    容忍策略与节点的污点能力配合使用,允许(不强制)插件的 Deployment 实例调度到带有与之匹配的污点的节点上,也可用于控制插件的 Deployment 实例所在的节点被标记污点后插件的 Deployment 实例的驱逐策略。

    插件会对实例添加针对node.kubernetes.io/not-readynode.kubernetes.io/unreachable污点的默认容忍策略,容忍时间窗为60s。

    详情请参见设置容忍策略

  6. 单击“安装”

组件说明

表2 OpenKruise组件

容器组件

说明

资源类型

kruise-controller-manager

OpenKruise的controller中心组件,同时包含了针对Kruise CRD以及Pod资源的admission webhook。kruise-controller-manager会创建webhook configurations来配置哪些资源需要感知处理,并为kube-apiserver提供可调用的Service。

Deployment

kruise-daemon

通过DaemonSet部署到每个节点上,提供镜像预热、容器重启等功能。

DaemonSet

Kubernetes社区在1.24版本移除了对dockershim的支持。CCE为兼顾用户使用docker运行时的习惯,在CCE的v1.25及以上的集群版本引入了cri-dockerd用于替换原来的dockershim,但是OpenKruise社区当前并未实现对cri-dockerd的支持(参见issue)。该问题将在后续版本中解决。

因此,在v1.25及以上版本的集群中安装1.0.3版本的OpenKruise插件时,kruise-daemon无法在使用docker容器引擎的节点上运行,请使用containerd容器引擎。

使用示例

插件安装完成后,支持在集群中使用OpenKruise提供的工作负载控制器,本文以使用CloneSet部署无状态应用为例,更多功能使用示例请参见OpenKruise官网

  1. 创建cloneset.yaml文件。

    内容如下:
    apiVersion: apps.kruise.io/v1alpha1
    kind: CloneSet
    metadata:
      labels:
        app: sample
      name: sample
    spec:
      replicas: 5
      selector:
        matchLabels:
          app: sample
      template:  # CloneSet template的结构Deployment一致
        metadata:
          labels:
            app: sample
        spec:
          containers:
          - name: nginx
            image: nginx:alpine
          imagePullSecrets: 
          - name: default-secret

  2. 创建CloneSet。

    kubectl create -f cloneset.yaml

    预期回显如下:

    cloneset.apps.kruise.io/sample created

  3. 查看CloneSet。

    kubectl get clone

    预期回显如下:

    NAME       DESIRED   UPDATED   UPDATED_READY   READY   TOTAL   AGE
    sample     5         5         5               5       5       23s
    • DESIRED:期望Pod数量。
    • UPDATED:最新版本的Pod数量。
    • UPDATED_READY:最新版本的可用Pod数量。
    • READY:可用Pod总量。
    • TOTAL:实际Pod总量。

常见问题

创建工作负载时,事件中出现以下报错:

Error creating: Internal error occurred: failed calling webhook "mpod.kb.io": failed to call webhook: Post "https://kruise-webhook-service.kube-system.svc:443/mutate-pod?timeout=10s": dial tcp 10.247.10.181:443: connect: connection refused

出现以上问题的原因是kruise-controller-manager组件不可用,导致部分命名空间下(非kube-system命名空间或不带control-plane: openkruise标签的命名空间)的Pod进行创建/更新/删除操作均会被拦截。

解决方案:

将kruise-controller-manager组件恢复正常即可正常调度。造成kruise-controller-manager异常的原因及解决建议如下:

  • kruise-controller-manager所需的资源不够无法正常调度:建议为插件配置合理的资源。
  • kruise-controller-manager配置了调度或亲和策略导致该Pod无法被正常调度:建议检查调度策略并配置合适的调度策略,以确保kruise-controller-manager被正常调度。

版本记录

表3 OpenKruise插件版本记录

插件版本

支持的集群版本

更新特性

社区版本

1.0.35

v1.25

v1.27

v1.28

v1.29

v1.30

v1.31

v1.32

支持CCE v1.32集群

1.5.4

1.0.23

v1.25

v1.27

v1.28

v1.29

v1.30

v1.31

支持CCE v1.31集群

1.5.4

1.0.12

v1.23

v1.25

v1.27

v1.28

v1.29

v1.30

支持CCE v1.30集群

1.5.4

1.0.3

v1.23

v1.25

v1.27

v1.28

v1.29

首次提供OpenKruise插件。

1.5.4