简介
OpenKruise 是一个基于 Kubernetes 的扩展套件,主要聚焦于云原生应用的自动化,比如部署、发布、运维以及可用性防护。
OpenKruise 提供的绝大部分能力都是基于 CRD 扩展来定义,它们不存在于任何外部依赖,可以运行在任意纯净的 Kubernetes 集群中。
核心能力
- 增强版本的 Workloads
OpenKruise 包含了一系列增强版本的 Workloads(工作负载),比如 CloneSet、Advanced StatefulSet、Advanced DaemonSet、BroadcastJob 等。
它们不仅支持类似于 Kubernetes 原生 Workloads 的基础功能,还提供了如原地升级、可配置的扩缩容/发布策略、并发操作等。
其中,原地升级是一种升级应用容器镜像甚至环境变量的全新方式。它只会用新的镜像重建 Pod 中的特定容器,整个 Pod 以及其中的其他容器都不会被影响。因此它带来了更快的发布速度,以及避免了对其他 Scheduler、CNI、CSI 等组件的负面影响。
- 应用的旁路管理
OpenKruise 提供了多种通过旁路管理应用 sidecar 容器、多区域部署的方式,“旁路” 意味着你可以不需要修改应用的 Workloads 来实现它们。
比如,SidecarSet 能帮助你在所有匹配的 Pod 创建的时候都注入特定的 sidecar 容器,甚至可以原地升级已经注入的 sidecar 容器镜像、并且对 Pod 中其他容器不造成影响。
而 WorkloadSpread 可以约束无状态 Workload 扩容出来 Pod 的区域分布,赋予单一 workload 的多区域和弹性部署的能力。
- 高可用性防护
OpenKruise 在为应用的高可用性防护方面也做出了很多努力。
目前它可以保护你的 Kubernetes 资源不受级联删除机制的干扰,包括 CRD、Namespace、以及几乎全部的 Workloads 类型资源。
相比于 Kubernetes 原生的 PDB 只提供针对 Pod Eviction 的防护,PodUnavailableBudget 能够防护 Pod Deletion、Eviction、Update 等许多种 voluntary disruption 场景。
- 高级的应用运维能力
OpenKruise 也提供了很多高级的运维能力来帮助你更好地管理应用。
你可以通过 ImagePullJob 来在任意范围的节点上预先拉取某些镜像,或者指定某个 Pod 中的一个或多个容器被原地重启。
系统架构
安装
从 v1.0.0 (alpha/beta) 开始,OpenKruise 要求在 Kubernetes >= 1.16 以上版本的集群中安装和使用。
通过 helm 安装
建议采用 helm v3.5+ 来安装 Kruise
# Firstly add openkruise charts repository if you haven't do this. $ helm repo add openkruise https://openkruise.github.io/charts/ # [Optional] $ helm repo update # Install the latest version. $ helm install kruise openkruise/kruise --version 1.3.0
通过 helm 升级
# Firstly add openkruise charts repository if you haven't do this. $ helm repo add openkruise https://openkruise.github.io/charts/ # [Optional] $ helm repo update # Upgrade to the latest version. $ helm upgrade kruise openkruise/kruise --version 1.3.0 [--force]
注意:
- 在升级之前,必须 先阅读 Change Log ,确保你已经了解新版本的不兼容变化。
- 如果你要重置之前旧版本上用的参数或者配置一些新参数,建议在
helm upgrade
命令里加上--reset-values
。
- 如果你在将 Kruise 从 0.x 升级到 1.x 版本,你需要为 upgrade 命令添加
--force
参数,其他情况下这个参数是可选的。
卸载
注意:卸载会导致所有 Kruise 下的资源都会删除掉,包括 webhook configurations, services, namespace, CRDs, CR instances 以及所有 Kruise workload 下的 Pod。 请务必谨慎操作!
卸载使用 helm chart 安装的 Kruise:
$ helm uninstall kruise release "kruise" uninstalled
CloneSet
CloneSet 控制器提供了高效管理无状态应用的能力,它可以对标原生的 Deployment
,但 CloneSet
提供了很多增强功能。
升级类型
CloneSet 提供了 3 种升级方式,默认为 ReCreate
:
ReCreate
: 控制器会删除旧 Pod 和它的 PVC,然后用新版本重新创建出来。
InPlaceIfPossible
: 控制器会优先尝试原地升级 Pod,如果不行再采用重建升级。具体参考原地升级 | OpenKruise。
InPlaceOnly
: 控制器只允许采用原地升级。因此,用户只能修改上一条中的限制字段,如果尝试修改其他字段会被 Kruise 拒绝。
apiVersion: apps.kruise.io/v1alpha1 kind: CloneSet spec: # ... updateStrategy: type: InPlaceIfPossible inPlaceUpdateStrategy: gracePeriodSeconds: 10
Template 和 revision
spec.template
中定义了当前 CloneSet 中最新的 Pod 模板。 控制器会为每次更新过的 spec.template
计算一个 revision hash 值,控制器会为 template 计算出 revision hash 为 sample-d4d4fb5bd
并上报到 CloneSet status 中。
apiVersion: apps.kruise.io/v1alpha1 kind: CloneSet metadata: generation: 1 # ... spec: replicas: 5 # ... status: observedGeneration: 1 readyReplicas: 5 replicas: 5 currentRevision: sample-d4d4fb5bd updateRevision: sample-d4d4fb5bd updatedReadyReplicas: 5 updatedReplicas: 5 # ...
CloneSet status 中的字段说明:
status.replicas
: Pod 总数
status.readyReplicas
: ready Pod 数量
status.availableReplicas
: ready and available Pod 数量 (满足minReadySeconds
, 且 lifecycle state 为Normal
)
status.currentRevision
: 最近一次全量 Pod 推平版本的 revision hash 值
status.updateRevision
: 最新版本的 revision hash 值
status.updatedReplicas
: 最新版本的 Pod 数量
status.updatedReadyReplicas
: 最新版本的 ready Pod 数量 FEATURE STATE: Kruise v1.2.0
status.expectedUpdatedReplicas
: 需要升级到最新版本 Pod 的数量(包含已经升级的数量),该字段根据用户当前设置的.spec.updateStrategy.partition
字段计算得到。
Partition 分批灰度
Partition 的语义是 保留旧版本 Pod 的数量或百分比,默认为 0
。这里的 partition
不表示任何 order
序号。
如果在发布过程中设置了 partition
:
- 如果是数字,控制器会将
(replicas - partition)
数量的 Pod 更新到最新版本。
- 如果是百分比,控制器会将
(replicas * (100% - partition))
数量的 Pod 更新到最新版本。
FEATURE STATE: Kruise v1.2.0
- 如果
partition
是百分比, 并且满足partition < 100% && replicas > 1
, CloneSet 会保证 至少有一个 Pod 会被升级到最新版本。
- 用户可以使用
.status.updatedReplicas >= .status.ExpectedUpdatedReplicas
条件,来判断在当前partition
字段的限制下,CloneSet 是否已经完成了预期数量 Pod 的版本升级。
例子:
partition 回滚
默认情况下,partition
只控制 Pod 更新到 status.updateRevision
新版本。 也就是说以上面这个 CloneSet 来看,当 partition 5 -> 3
时,CloneSet 会升级 2 个 Pod 到 status.updateRevision
版本。 而当把 partition 3 -> 5
修改回去时,CloneSet 不会做任何事情。
但是如果你启用了 CloneSetPartitionRollback
这个 feature-gate, 上面这个场景下 CloneSet 会把 2 个 status.updateRevision
版本的 Pod 重新回滚为 status.currentRevision
版本。
helm upgrade kruise openkruise/kruise --version 1.3.0 --set featureGates="CloneSetPartitionRollback=true"
上线操作步骤
1、模块、配置版本更新
- 修改value文件配置
- 修改cloneset.yaml文件配置,配置初始灰度数量
- 修改nacos配置中心配置
- 提前整理好发布命令,进入ctccmini/,执行即可
#部署安装模块 helm install ctbizweb ./ctbizweb --values ./ctbizweb/values.yaml -n ctccmini --set image.tag=2.0.61 #更新模块,按照灰度数量更新模块 helm upgrade ctbizweb ./ctbizweb --values ./ctbizweb/values.yaml -n ctccmini --set image.tag=2.0.61 #调整灰度比例 kubectl edit clonesets.apps.kruise.io -n ctccmini ctbizweb-cloneset # ... updateStrategy: maxSurge: 5% maxUnavailable: 1% partition: 1 type: ReCreate # ...