【OpenKruise】原地升级

举报
可以交个朋友 发表于 2025/12/22 20:03:00 2025/12/22
【摘要】 1. 背景OpenKruise 是一个基于 Kubernetes 的扩展项目,旨在增强和扩展 Kubernetes 的原生能力,以更好地支持大规模应用的管理和运维。它通过提供一系列自定义 控制器 和自定义资源(CRD),帮助用户在 Kubernetes 集群中更加灵活、高效地管理容器化应用。 2. 简介OpenKruise 的原地升级(In-Place Update)是一种更新策略,允许在...

1. 背景

OpenKruise 是一个基于 Kubernetes 的扩展项目,旨在增强和扩展 Kubernetes 的原生能力,以更好地支持大规模应用的管理和运维。它通过提供一系列自定义 控制器 和自定义资源(CRD),帮助用户在 Kubernetes 集群中更加灵活、高效地管理容器化应用。

2. 简介

OpenKruise 的原地升级(In-Place Update)是一种更新策略,允许在不销毁和重建 Pod 的情况下直接更新 Pod 内的容器镜像或资源配置。这种方法与传统的替换策略不同,可以显著减少更新过程中应用的中断时间和资源开销。
image.png
原地升级技术原理解析
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集群

image.png

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

image.png
image.png

创建成功之后通过 kubectl get all命令查看对应的信息,可以发现cloneset- controller 是直接创建的 Pod,而原生的Deployment 是通过 ReplicaSet 去创建的 Pod

4.3 原地升级

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

先查看一下pod内nginx的版本
image.png

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

image.png

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

image.png

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

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。