# 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](https://openkruise.io/zh/docs/user-manuals/cloneset)。 |
| Advanced StatefulSet | 有状态应用的增强型控制器，基于原生StatefulSet扩展。                | - 支持原地升级，无需重建Pod。  - 支持指定Pod缩容。  - 支持设置升级顺序，突破原生StatefulSet顺序更新的限制。   更多功能特性详情请参见[Advanced StatefulSet](https://openkruise.io/zh/docs/user-manuals/advancedstatefulset)。                                                                        |
| Advanced DaemonSet      | 节点级服务的增强型控制器，替代原生 DaemonSet。                      | - 支持原地升级，无需重建Pod。  - 可通过标签选择升级Pod。  - 支持分批升级，且支持暂停。   更多功能特性详情请参见[Advanced DaemonSet](https://openkruise.io/zh/docs/user-manuals/advanceddaemonset)。                                                                           |
| SidecarSet            | Sidecar容器的集中管理控制器，实现与业务容器解耦。                    | - 支持自动注入，通过标签选择器为符合条件的Pod注入Sidecar容器。  - 支持原地升级，单独升级Sidecar容器，不影响业务容器。  - 支持优先级控制，定义Sidecar容器的启动/终止顺序。   更多功能特性详情请参见[SidecarSet](https://openkruise.io/zh/docs/user-manuals/sidecarset)。                                          |
| UnitedDeployment        | 跨分区的分布式应用管理控制器，支持多区域/节点组的统一部署。                 | - 支持分区定义，可按节点标签、地域等划分多个分区，并为每个分区创建不同的工作负载。  - 支持弹性分配，可根据分区列表顺序进行扩缩容。  - 支持自适应调度，自动将Pending副本调度到可用分区。   更多功能特性详情请参见[UnitedDeployment](https://openkruise.io/zh/docs/user-manuals/uniteddeployment)。                                         |
   
#### 约束与限制
如果您已经在集群中部署了社区的OpenKruise，请您先将其卸载后再安装CCE提供的OpenKruise插件，否则可能会出现插件安装失败的情况。
#### 注意事项
OpenKruise开源组件中，引入了Webhook的配置，社区将其默认配置的Pod相关失效策略为Fail，这意味着一旦kruise-controller-manager处于不可用状态，将会造成Pod的创建/删除等操作都将会被拦截。因此在使用该插件前，请慎重评估使用该插件所引入的风险，并且尽量将kruise-controller-manager组件配置为多实例的高可用状态，以确保kruise-controller-manager中的Webhook Server能够正常处理请求。
OpenKruise从社区版本v1.7.3开始，通过Helm安装的Kruise会在卸载时使用pre-delete hook自动检测是否存在Kruise CR，如果存在则会阻塞卸载过程，导致删除失败，以防止预期外误删除CR。因此在卸载该插件前，请检查是否已经清理Kruise相关CR，以确保插件能够正常删除。
![](https://support.huaweicloud.com/usermanual-cce/public_sys-resources/notice_3.0-zh-cn.png)
OpenKruise是CCE基于开源软件进行适配并集成的精选开源插件，CCE将提供全面的技术支持服务。然而，CCE不承担因开源软件缺陷导致的业务损失责任，也不承担赔偿或额外的服务，强烈建议用户定期升级软件以修复潜在问题。
#### 安装步骤
1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)，单击集群名称进入集群。
2. 单击左侧导航栏的"插件中心"，在右侧找到**OpenKruise**插件，单击"安装"。
3. 在安装插件页面，根据需求选择"规格配置"。 
   - 选择"系统预置规格"时，您可根据集群规模选择"小规格"或"大规格"，系统会根据不同的预置规格配置插件的实例数及资源配额，具体配置值请以控制台显示为准。 "小规格"为单实例部署，适用50节点以下集群规模；"大规格"为高可用部署，适用50节点以上集群规模。
     
   
   - 选择"自定义规格"时，您可根据需求调整插件实例数和资源配额。实例数为1时插件不具备高可用能力，当插件实例所在节点异常时可能导致插件功能无法正常使用，请谨慎选择。
   
   
   
   
4. 选择是否开启"kruise-daemon配置"。 
   kruise-daemon是OpenKruise新增的DaemonSet组件，可为您提供镜像预热、容器重启功能，详情请参见[组件说明]。
   
   
5. 设置插件实例的部署策略。 
   ![](https://support.huaweicloud.com/usermanual-cce/public_sys-resources/note_3.0-zh-cn.png)
   - 调度策略对于DaemonSet类型的插件实例不会生效。
   
   - 设置多可用区部署或节点亲和策略时，需保证集群中存在满足调度策略的节点且拥有足够的资源，否则插件实例将无法运行。
    
   表1插件调度配置 
   | 参数   | 参数说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
   |:---|:---|
   | 多可用区部署 | - 优先模式：优先将插件的Deployment实例调度到不同可用区的节点上，如集群下节点不满足多可用区，插件实例将调度到单可用区下的不同节点。  - 均分模式：插件Deployment实例均匀调度到当前集群下各可用区，增加新的可用区后建议扩容插件实例以实现跨可用区高可用部署；均分模式限制不同可用区间插件实例数相差不超过1，单个可用区资源不足会导致后续其他实例无法调度。  - 强制模式：插件Deployment实例强制调度到不同可用区的节点上，每个可用区下最多运行一个实例。如集群下节点不满足多可用区，插件实例将无法全部运行。节点故障后，插件实例存在无法迁移风险。                                                                                                    |
   | 节点亲和 | - 不配置：插件实例不指定节点亲和调度。  - 指定节点调度：指定插件实例部署的节点。若不指定，将根据集群默认调度策略进行随机调度。  - 指定节点池调度：指定插件实例部署的节点池。若不指定，将根据集群默认调度策略进行随机调度。  - 自定义亲和策略：填写期望插件部署的节点标签实现更灵活的调度策略，若不填写将根据集群默认调度策略进行随机调度。 同时设置多条自定义亲和策略时，需要保证集群中存在同时满足所有亲和策略的节点，否则插件实例将无法运行。    |
   | 容忍策略  | 容忍策略与节点的污点能力配合使用，允许（不强制）插件的 Deployment 实例调度到带有与之匹配的污点的节点上，也可用于控制插件的 Deployment 实例所在的节点被标记污点后插件的 Deployment 实例的驱逐策略。 插件会对实例添加针对**node.kubernetes.io/not-ready** 和**node.kubernetes.io/unreachable**污点的默认容忍策略，容忍时间窗为60s。 详情请参见[设置容忍策略](https://support.huaweicloud.com/usermanual-cce/cce_10_0728.html)。                                                                                                                                                                                                                                                                |
      
   
   
6. 单击"安装"。
 
 #### 组件说明
表2OpenKruise组件 
| 容器组件                    | 说明                                                                                                                                                                   | 资源类型      |
|:---|:---|:---|
| kruise-controller-manager | OpenKruise的controller中心组件，同时包含了针对Kruise CRD以及Pod资源的admission webhook。kruise-controller-manager会创建webhook configurations来配置哪些资源需要感知处理，并为kube-apiserver提供可调用的Service。 | Deployment |
| kruise-daemon            | 通过DaemonSet部署到每个节点上，提供镜像预热、容器重启等功能。                                                                                                                                   | DaemonSet  |
   
![](https://support.huaweicloud.com/usermanual-cce/public_sys-resources/notice_3.0-zh-cn.png)
Kubernetes社区在1.24版本移除了对dockershim的支持。CCE为兼顾用户使用docker运行时的习惯，在CCE的v1.25及以上的集群版本引入了cri-dockerd用于替换原来的dockershim，OpenKruise社区在v1.7.x版本后实现了对cri-dockerd的支持（参见[issue](https://github.com/openkruise/kruise/issues/1631)），CCE在1.1.x版本的插件中同步修复该问题。
因此，在v1.25及以上版本的集群中安装1.0.40及以前版本的OpenKruise插件时，kruise-daemon无法在使用docker容器运行时的节点上运行，请使用containerd容器运行时。对于1.1.10及以上版本的OpenKruise插件，kruise-daemon可以在docker或containerd容器运行时的节点上运行。
#### 使用示例
插件安装完成后，支持在集群中使用OpenKruise提供的工作负载控制器，本文以使用CloneSet部署无状态应用为例，更多功能使用示例请参见[OpenKruise官网](https://openkruise.io/zh/docs)。
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被正常调度。
 
#### 版本记录
表3OpenKruise插件版本记录 
| 插件版本     | 支持的集群版本                                                                                                                                                                                                                                                                                                                                                                                                                                                                      | 更新特性                                                                                                                                                                                                                                                                                                                                                                                                                                             | 社区版本                                                                                                                                                                      |
|:---|:---|:---|:---|
| 1.1.42    | v1.29 v1.30 v1.31 v1.32 v1.33 v1.34 v1.35 v1.36 | 修复部分问题                                                                                                                                                                                                                                                                                                                                                                                                                                             | [1.8.2rc1](https://github.com/openkruise/kruise/releases/tag/v1.8.2)                                                                                                      |
| 1.1.36 | v1.29 v1.30 v1.31 v1.32 v1.33 v1.34 v1.35 v1.36  | 支持CCE v1.36集群                                                                                                                                                                                                                                                                                                                                                                                                                                     | [1.8.2rc1](https://github.com/openkruise/kruise/releases/tag/v1.8.2)                                                                                                      |
| 1.1.35 | v1.29 v1.30 v1.31 v1.32 v1.33 v1.34 v1.35                                                                    | 修复部分问题                                                                                                                                                                                                                                                                                                                                                                                                                                            | [1.8.2rc1](https://github.com/openkruise/kruise/releases/tag/v1.8.2)                                                                                                     |
| 1.1.26  | v1.29 v1.30 v1.31 v1.32 v1.33 v1.34 v1.35                                                                 | 支持CCE v1.35集群                                                                                                                                                                                                                                                                                                                                                                                                                                     | [1.8.2rc1](https://github.com/openkruise/kruise/releases/tag/v1.8.2)                                                                                                      |
| 1.1.21 | v1.28 v1.29 v1.30 v1.31 v1.32 v1.33 v1.34                                                                 | 修复部分问题                                                                                                                                                                                                                                                                                                                                                                                                                                              | [1.8.2rc1](https://github.com/openkruise/kruise/releases/tag/v1.8.2)                                                                                                     |
| 1.1.20  | v1.28 v1.29 v1.30 v1.31 v1.32 v1.33 v1.34                                                                 | 优化插件系统预置规格                                                                                                                                                                                                                                                                                                                                                                                                                                        | [1.8.2rc1](https://github.com/openkruise/kruise/releases/tag/v1.8.2)                                                                                                     |
| 1.1.18    | v1.28 v1.29 v1.30 v1.31 v1.32 v1.33 v1.34                                                                          | 修复部分问题                                                                                                                                                                                                                                                                                                                                                                                                                                               | [1.8.2rc1](https://github.com/openkruise/kruise/releases/tag/v1.8.2)                                                                                                     |
| 1.1.12    | v1.28 v1.29 v1.30 v1.31 v1.32 v1.33 v1.34                                                                      | - 支持CCE v1.34集群  - 支持定时镜像预热功能  - 增加kruise-controller-manager 存活探针配置   | [1.8.2rc1](https://github.com/openkruise/kruise/releases/tag/v1.8.2) 说明： 该版本在1.8.2基础上增加了定时镜像预热功能，命名为1.8.2rc1。 |
| 1.0.40  | v1.27 v1.28 v1.29 v1.30 v1.31 v1.32 v1.33                                                                | - 支持CCE v1.33集群  - 支持镜像预热                                                                                                                                                                           | [1.5.4](https://github.com/openkruise/kruise/releases/tag/v1.5.4)                                                                                                       |
| 1.0.35  | v1.25 v1.27 v1.28 v1.29 v1.30 v1.31 v1.32                                                               | 支持CCE v1.32集群                                                                                                                                                                                                                                                                                                                                                                                                                                       | [1.5.4](https://github.com/openkruise/kruise/releases/tag/v1.5.4)                                                                                                        |
| 1.0.23   | v1.25 v1.27 v1.28 v1.29 v1.30 v1.31                                                                                                                                            | 支持CCE v1.31集群                                                                                                                                                                                                                                                                                                                                                                                                                                     | [1.5.4](https://github.com/openkruise/kruise/releases/tag/v1.5.4)                                                                                                      |
| 1.0.12  | v1.23 v1.25 v1.27 v1.28 v1.29 v1.30                                                                                                                                       | 支持CCE v1.30集群                                                                                                                                                                                                                                                                                                                                                                                                                                      | [1.5.4](https://github.com/openkruise/kruise/releases/tag/v1.5.4)                                                                                                          |
| 1.0.3  | v1.23 v1.25 v1.27 v1.28 v1.29                                                                                                                                                                                                   | 首次提供OpenKruise插件。                                                                                                                                                                                                                                                                                                                                                                                                                                | [1.5.4](https://github.com/openkruise/kruise/releases/tag/v1.5.4)                                                                                                        |
   
