14.k8s滚动发布方案

k8s滚动发布方案

Kubernetes支持名为Rolling Update的功能,允许不间断地,

接近几乎无缝地平滑升级部署应用程序 ,即在不停止对外服务的前提下完成应用的更新。

此功能允许按顺序更新pod,一次更新一个(按照配置比例),而不是一次停止/更新整个pod。使发布版本更新和回滚而不会中断服务。

kubectl rolling-update仅在使用Replication Controllers 部署应用程序时才使用该命令。最新版本的Kubernetes 建议使用Deployment部署应用程序。

1、准备测试镜像

这里用springboot测试,编译三个版本镜像分别为:

springboot-demo:01 、springboot-demo:02 、springboot-demo:03

2、创建deployment
shell 复制代码
 apiVersion: apps/v1 
kind: Deployment
metadata:
  name: demo
  labels:
    app: demo
spec:
  # --- 滚动发布的关键配置 ---
  # 表示Pod的副本数量。设置初始配置来复制5个Pod以进行滚动更新测试
  replicas: 5 
  # 这是从pod变为Ready阶段到变为Available阶段的时间。滚动升级时10s后认为该pod就绪可用,建议设置适当的时间minReadySeconds以考虑pod容器初始化的时间
  minReadySeconds: 10
  # 为RollingUpdate进行详细设置 定义升级的策略
  strategy:
    # 可以是"Recreate"或者是 "RollingUpdate"。"RollingUpdate"是默认值。
      # Recreate时,在创建出新的Pod之前会先杀掉所有已存在的Pod。
      # RollingUpdate时,Deployment使用rolling update 的方式更新Pod 。
    # 你可以指定maxUnavailable 和maxSurge 来控制 rolling update 进程。
    type: RollingUpdate
    # 如果在spec.strategy.type中设置"RollingUpdate",请对RollingUpdate进行详细设置。
    rollingUpdate:
      # 滚动更新期间可以创建的pod的最大数量超过指定数量的pod。1表示当一个新的pod被创建才会删除一个pod,以此类推。可以是具体的整数,也可以是百分百 默认值为25%
      # maxSurge和maxUnavailable值不能同时为零。
      maxSurge: 1
      maxUnavailable: 0
  # --- 滚动发布的关键配置 ---
  selector:
    matchLabels:
      app: demo
  template:
    metadata:
      labels:
        app: demo
    spec:
      containers:
      - name: demo
        image: springboot-demo:01
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: demo-service
spec:
  ports:
    - name: http
      port: 8088
      targetPort: 8088
  selector:
    app: demo
  type: NodePort
3、滚动更新验证
3.1 进行部署
shell 复制代码
kubectl  apply -f deployment.yaml
3.2 将镜像升级到 springboot-demo:02

这里可以通过修改deployment.yaml,也可以直接使用命令

shell 复制代码
kubectl set image deployment/demo demo=springboot-demo:02

可以看到pods在按顺序更新:

更新过程中服务正常访问,更新完成后,服务访问结果为:

3.3 将镜像升级到 springboot-demo:03
shell 复制代码
kubectl set image deployment/demo demo=springboot-demo:03

更新过程中服务正常访问,更新完成后,服务访问结果为:

3.4 将镜像回滚至 springboot-demo:01
shell 复制代码
kubectl set image deployment/demo demo=springboot-demo:01

更新过程中服务正常访问,更新完成后,服务访问结果为:

4、滚动发布常用命令
shell 复制代码
# 查看发布历史
kubectl rollout history deployment/demo 
# 回滚上一版本
kubectl rollout undo deployment/demo
# 修改镜像并打记录,便于回滚指定版本
kubectl set image deployment/demo demo=springboot-demo:02 --record=true
# 回滚指定版本
kubectl rollout undo deployment demo --to-revision=9
# 将资源标记为暂停
kubectl rollout pause deployment/demo
# 查看资源的状态
kubectl rollout status deployment/demo
# 恢复已暂停的资源
kubectl rollout resume deployment/demo
相关推荐
openFuyao20 分钟前
openFuyao x 复旦大学软件工程实验室 Panel 回顾:Agentic时代,集群调度技术体系将如何演进?
kubernetes·openfuyao
螺蛳粉 螺蛳粉1 小时前
第 05 篇:etcd 深入:Raft 共识、watch 机制与快照备份恢复实战(底座认知 05)
docker·云原生·容器·kubernetes·etcd·分布式存储·kube-apiserver
知已难寻2 小时前
03 · OpenStack的计算管理 Nova
运维·服务器·开发语言·云原生·云计算·openstack·开源软件
相思难忘成疾4 小时前
从零搭建 Kubernetes 1.30 集群:kubeadm 部署一主多从实战(RHEL 9.3 + Docker + flannel)
linux·运维·kubernetes
PellyKoo4 小时前
【docker】cifs卷改smb密码后容器起不来的解决方法
运维·docker·容器
n112125 小时前
Ollama 接 Open WebUI 中文界面:我踩的 4 个坑
云原生·eureka·ollama·本地大模型·open webui·私有部署·中文界面
阿里云云原生5 小时前
用户说 App“下不了单”:用 Session Replay 看清流程卡在哪一步
云原生
weirong5 小时前
给 K8s 加一个自动值班员:分级故障自愈引擎
kubernetes
云和数据.ChenGuang5 小时前
Python 闭包详解:从原理到实战
linux·开发语言·人工智能·python·kubernetes
阿里云云原生5 小时前
运维走出控制台:阿里云 AgentCore AI Native 运维实践
云原生