【OpenKruise】原地升级
【摘要】 1. 背景OpenKruise 是一个基于 Kubernetes 的扩展项目,旨在增强和扩展 Kubernetes 的原生能力,以更好地支持大规模应用的管理和运维。它通过提供一系列自定义 控制器 和自定义资源(CRD),帮助用户在 Kubernetes 集群中更加灵活、高效地管理容器化应用。 2. 简介OpenKruise 的原地升级(In-Place Update)是一种更新策略,允许在...
1. 背景
OpenKruise 是一个基于 Kubernetes 的扩展项目,旨在增强和扩展 Kubernetes 的原生能力,以更好地支持大规模应用的管理和运维。它通过提供一系列自定义 控制器 和自定义资源(CRD),帮助用户在 Kubernetes 集群中更加灵活、高效地管理容器化应用。
2. 简介
OpenKruise 的原地升级(In-Place Update)是一种更新策略,允许在不销毁和重建 Pod 的情况下直接更新 Pod 内的容器镜像或资源配置。这种方法与传统的替换策略不同,可以显著减少更新过程中应用的中断时间和资源开销。

原地升级技术原理解析
CloneSet 提供了 3 种升级方式,默认为 ReCreate:
- ReCreate: 控制器会删除旧 Pod 和它的 PVC,然后用新版本重新创建出来。
- InPlaceIfPossible: 控制器会优先尝试原地升级 Pod,如果不行再采用重建升级。
- InPlaceOnly: 控制器只允许采用原地升级。因此,用户只能修改上一条中的限制字段,如果尝试修改其他字段会被 Kruise 拒绝。
在原地升级中还提供了 graceful period 选项,作为优雅原地升级的策略。用户如果配置了 gracePeriodSeconds 这个字段,控制器在原地升级的过程中会先把 Pod status 改为 not-ready,然后等一段时间(gracePeriodSeconds),最后再去修改 Pod spec 中的镜像版本。 这样,就为 endpoints-controller 这些控制器留出了充足的时间来将 Pod 从 endpoints 端点列表中去除。
3. 前提条件
1.已创建cce集群
2.集群已安装openkruise
4.实操
4.1创建cce集群

4.2部署应用
apiVersion: apps.kruise.io/v1alpha1
kind: CloneSet
metadata:
name: nginxweb1
namespace: default
spec:
replicas: 5
selector:
matchLabels:
app: nginxweb1
template:
metadata:
labels:
app: nginxweb1
spec:
containers:
- name: nginx
image: nginx:perl
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
kubectl apply -f nginx01.yaml
kubectl get clonesets
kubectl get all


创建成功之后通过 kubectl get all命令查看对应的信息,可以发现cloneset- controller 是直接创建的 Pod,而原生的Deployment 是通过 ReplicaSet 去创建的 Pod
4.3 原地升级
kubectl exec -it nginxweb1-krbm7 -- nginx -v
先查看一下pod内nginx的版本

apiVersion: apps.kruise.io/v1alpha1
kind: CloneSet
metadata:
name: nginxweb1
namespace: default
spec:
minReadySeconds: 30
updateStrategy: #添加更新策略
type: InPlaceIfPossible
scaleStrategy:
maxUnavailable: 1
replicas: 4
selector:
matchLabels:
app: nginxweb1
template:
metadata:
labels:
app: nginxweb1
spec:
containers:
- name: nginx
image: nginx:latest #更换镜像版本
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
kubectl apply -f nginx02.yaml
查看更新过程
可以看到nginx版本已更新成功,且pod并未重建
watch kubectl get pods

kubectl exec -it nginxweb1-krbm7 -- nginx -v

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)