创建部署详见 Kubernetes(K8S) Deployment 部署 Pod

传统应用升级,一般是V1.0的jar包,有一个应对 1.0 的 shell 启动脚本。升级时,传 2.0 的 jar包,配置 2.0 的 shell 脚本。

执行顺序为,停1.0的服务,启2.0的服务,有问题时,把2.0停掉再执行 1.0的shell脚本,手动恢复到1.0 版本,服务多的情况下,就很崩溃,而且服务会中断不可用。

高并发、高可用系统普及的今天,服务的升级更新至少要做到“业务不中断”。而滚动更新(Rolling-update)恰是满足这一需求的一种系统更新升级方案。对于Kubernetes集群部署的Service来说,Rolling update就是指一次仅更新一个Pod,然后逐个进行更新,而不是在同一时刻将该Service下面的所有Pod shutdown,然后去更新,逐个更新可以避免将业务中断;

RollingUpdate命令:通过自动扩缩容实现自动滚动升级

指令格式:kubectl rolling-update 旧控制器 新控制器 --image=新镜像

1. 发布新版到阿里云镜像仓库

Last login: Tue Oct 18 16:39:53 2022 from 172.16.0.66
[root@localhost ~]# cd /opt/demo/
[root@localhost demo]# ll
总用量 17160
-rw-r--r--. 1 root root 17566582 10月 19 11:50 demojenkins.jar
-rw-r--r--. 1 root root 126 10月 18 17:56 Dockerfile
[root@localhost demo]# docker login --username=hiXXXXXX@aliyun.com registry.cn-shanghai.aliyuncs.com
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store Login Succeeded
[root@localhost demo]# docker build -t demo:2.0 .
Sending build context to Docker daemon 17.57MB
Step 1/4 : FROM openjdk:8-jdk-alpine
---> a3562aa0b991
Step 2/4 : VOLUME /tmp
---> Using cache
---> a98cf1fbeb9d
Step 3/4 : ADD ./demojenkins.jar demojenkins.jar
---> 12bfc15e5295
Step 4/4 : ENTRYPOINT ["java","-jar","/demojenkins.jar", "&"]
---> Running in 2908dd94dfa7
Removing intermediate container 2908dd94dfa7
---> 3041db93b6df
Successfully built 3041db93b6df
Successfully tagged demo:2.0
[root@localhost demo]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
demo 2.0 3041db93b6df About a minute ago 122MB
demo 1.0 1952e02daef9 19 hours ago 122MB
openjdk 8-jdk-alpine a3562aa0b991 3 years ago 105MB
java 8 d23bdf5b1b1b 5 years ago 643MB
[root@localhost demo]# docker tag 3041db93b6df registry.cn-shanghai.aliyuncs.com/vipsoft/vipsoft:2.0
[root@localhost demo]# docker push registry.cn-shanghai.aliyuncs.com/vipsoft/vipsoft:2.0
The push refers to repository [registry.cn-shanghai.aliyuncs.com/vipsoft/vipsoft]
c38fa2e9a247: Pushed
ceaf9e1ebef5: Layer already exists
9b9b7f3d56a0: Layer already exists
f1b5933fe4b5: Layer already exists
2.0: digest: sha256:785c4707e7e629d22b5609310d8f945c107b277b94925cc0dbebdb3621b size: 1159
[root@localhost demo]#

2. 查看现有Pod信息(升级后对比用)

# 查看创建的 Deployment 对象
[root@k8smaster ~]# kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
javademo1 3/3 3 3 19h
nginx 1/1 1 1 5d21h # 查看 Deployment 上线状态
[root@k8smaster ~]# kubectl rollout status deployment/javademo1
deployment "javademo1" successfully rolled out # 查看 Deployment 对象创建的 ReplicaSet:
[root@k8smaster ~]# kubectl get rs
NAME DESIRED CURRENT READY AGE
javademo1-84dd5c9485 3 3 3 4h25m
nginx-f89759699 1 1 1 5d21h # 查看 Deployment 对象操作 ReplicaSet 创建的 Pod,并显示生成的标签:
[root@k8smaster ~]# kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
javademo1-84dd5c9485-7vgkr 1/1 Running 0 4h20m app=javademo1,pod-template-hash=84dd5c9485
javademo1-84dd5c9485-8ckk6 1/1 Running 0 4h26m app=javademo1,pod-template-hash=84dd5c9485
javademo1-84dd5c9485-8hfmd 1/1 Running 0 4h20m app=javademo1,pod-template-hash=84dd5c9485
nginx-f89759699-5hkdw 1/1 Running 0 5d21h app=nginx,pod-template-hash=f89759699 #查看当前运行的 Pod
[root@k8smaster ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
javademo1-84dd5c9485-7vgkr 1/1 Running 0 4h31m
javademo1-84dd5c9485-8ckk6 1/1 Running 0 4h37m
javademo1-84dd5c9485-8hfmd 1/1 Running 0 4h31m
nginx-f89759699-5hkdw 1/1 Running 0 5d21h # 查看 Deployeement 详情
[root@k8smaster ~]# kubectl describe deployment/javademo1
Name: javademo1
Namespace: default
CreationTimestamp: Tue, 18 Oct 2022 18:51:25 +0800
Labels: app=javademo1
Annotations: deployment.kubernetes.io/revision: 2
Selector: app=javademo1
Replicas: 3 desired | 3 updated | 3 total | 3 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: app=javademo1
Containers:
vipsoft:
Image: registry.cn-shanghai.aliyuncs.com/vipsoft/vipsoft:1.0
Port: <none>
Host Port: <none>
Environment: <none>
Mounts: <none>
Volumes: <none>
Conditions:
Type Status Reason
---- ------ ------
Progressing True NewReplicaSetAvailable
Available True MinimumReplicasAvailable
OldReplicaSets: <none>
NewReplicaSet: javademo1-84dd5c9485 (3/3 replicas created)
Events: <none>

Deployment, kubectl get deployments 所显示的字段有:

  • NAME:列出了名字空间中 Deployment 的名称。
  • READY:显示应用程序的可用的“副本”数。显示的模式是“就绪个数/期望个数”。
  • UP-TO-DATE:显示为了达到期望状态已经更新的副本数。
  • AVAILABLE:显示应用可供用户使用的副本数。
  • AGE:显示应用程序运行的时间。

ReplicaSet, kubectl get rs 输出中包含以下字段:

  • NAME:列出名字空间中 ReplicaSet 的名称;[Deployment名称]-[随机字符串]
  • DESIRED:显示应用的期望副本个数,即在创建 Deployment 时所定义的值。 此为期望状态;
  • CURRENT:显示当前运行状态中的副本个数;
  • READY:显示应用中有多少副本可以为用户提供服务;
  • AGE:显示应用已经运行的时间长度。

3. Deployment 升级

方法1

# 查看 Deployeement 详情 里可以看到 Containers 内容
# Containers:
# vipsoft:
# Image: registry.cn-shanghai.aliyuncs.com/vipsoft/vipsoft:1.0
# 设置vipsoft容器中的镜像,镜像版本变了,就会触发重新拉取动作
[root@k8smaster ~]# kubectl set image deployment/javademo1 vipsoft=registry.cn-shanghai.aliyuncs.com/vipsoft/vipsoft:2.0
deployment.apps/javademo1 image updated
[root@k8smaster ~]# kubectl rollout status deployment/javademo1
deployment "javademo1" successfully rolled out
[root@k8smaster ~]#

方法2:Jenkins 的时候比较常用,早期使用 Kubernetes Continuous Deploy 插件,现已重淘汰,可使用 Config File Provider 代替

# Containers:
# vipsoft:
# Image: registry.cn-shanghai.aliyuncs.com/vipsoft/vipsoft:1.0 #将 :1.0 改成 2.0
# 一旦镜像名(或 Pod 定义)发生了修改,则触发 k8s 系统完成 Deployment 所有运行 Pod 的滚动升级操作
[root@k8smaster ~]# kubectl edit deployment/javademo1
deployment "javademo1" edited

查看已更新的 Deployment 的信息

[root@k8smaster ~]# kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
javademo1 3/3 3 3 20h
nginx 1/1 1 1 5d22h # 扩容了3个副本,将旧的 ReplicaSet 缩容到了 0 个副本,完成了Pod的升级
[root@k8smaster ~]# kubectl get rs
NAME DESIRED CURRENT READY AGE
javademo1-5476dc8d7d 3 3 3 11m
javademo1-84dd5c9485 0 0 0 5h17m
nginx-f89759699 1 1 1 5d22h #只有最新的 5476dc8d7d 信息
[root@k8smaster ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
javademo1-5476dc8d7d-bf6m5 1/1 Running 0 11m
javademo1-5476dc8d7d-ttt5b 1/1 Running 0 11m
javademo1-5476dc8d7d-zd4c7 1/1 Running 0 11m
nginx-f89759699-5hkdw 1/1 Running 0 5d22h
[root@k8smaster ~]# kubectl describe deployment/javademo1
Name: javademo1
Namespace: default
CreationTimestamp: Tue, 18 Oct 2022 18:51:25 +0800
Labels: app=javademo1
Annotations: deployment.kubernetes.io/revision: 3
Selector: app=javademo1
Replicas: 3 desired | 3 updated | 3 total | 3 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: app=javademo1
Containers:
vipsoft:
Image: registry.cn-shanghai.aliyuncs.com/vipsoft/vipsoft:2.0
Port: <none>
Host Port: <none>
Environment: <none>
Mounts: <none>
Volumes: <none>
Conditions:
Type Status Reason
---- ------ ------
Available True MinimumReplicasAvailable
Progressing True NewReplicaSetAvailable
OldReplicaSets: <none>
NewReplicaSet: javademo1-5476dc8d7d (3/3 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 12m deployment-controller Scaled up replica set javademo1-5476dc8d7d to 1
Normal ScalingReplicaSet 11m deployment-controller Scaled down replica set javademo1-84dd5c9485 to 2
Normal ScalingReplicaSet 11m deployment-controller Scaled up replica set javademo1-5476dc8d7d to 2
Normal ScalingReplicaSet 11m deployment-controller Scaled down replica set javademo1-84dd5c9485 to 1
Normal ScalingReplicaSet 11m deployment-controller Scaled up replica set javademo1-5476dc8d7d to 3
Normal ScalingReplicaSet 11m deployment-controller Scaled down replica set javademo1-84dd5c9485 to 0
[root@k8smaster ~]#

上面 Events: 可以看出,先 up javademo1-5476dc8d7d to 1,再停 javademo1-84dd5c9485 to 2,Pod 逐个 滚动式更新,如下图:



Deployment 更新策略

在 Deployment 的定义中,可以通过 spec.strategy 指定 Pod 的更新策略,目前支持两种更新策略:

Recreate(重建):设置 spec.strategy.type=Recreate,表示 Deployment 在更新 Pod 时,会先杀掉所有正在运行的 Pod,然后创建新的 Pod。

RollingUpdate(滚动更新):设置 spec.strategy.type=RollingUpdate,表示 Deployment 会以滚动更新的方式来逐个更新 Pod。同时,可以通过设置 spec.strategy.rollingUpdate 下的两个参数(maxUnavailable 和 maxSurge)来控制滚动更新的过程。

4. Deployment 回滚

# 查看 Deployment 部署历史, CHANGE-CAUSE 里没有值,需要在创建 Deployment 时,使用 --record 参数,就可以在 CHANGE-CAUSE 列看到每个版本使用的命令了
[root@k8smaster ~]# kubectl rollout history deployment/javademo1
deployment.apps/javademo1
REVISION CHANGE-CAUSE
1 <none>
2 <none>
# 查看版本 2 的信息:
[root@k8smaster ~]# kubectl rollout history deployment/javademo1 --revision=2
deployment.apps/javademo1 with revision #2
Pod Template:
Labels: app=javademo1
pod-template-hash=84dd5c9485
Containers:
vipsoft:
Image: registry.cn-shanghai.aliyuncs.com/vipsoft/vipsoft:1.0
Port: <none>
Host Port: <none>
Environment: <none>
Mounts: <none>
Volumes: <none> # kubeetl rollout undo deployment/javademo1 --to-revision=2 加上参数,回滚到指定版本
# 这边没加参加,回滚到上一个版本
[root@k8smaster ~]# kubectl rollout undo deployment/javademo1
deployment.apps/javademo1 rolled back
[root@k8smaster ~]# kubectl describe deployment/javademo1
Name: javademo1
Namespace: default
CreationTimestamp: Tue, 18 Oct 2022 18:51:25 +0800
Labels: app=javademo1
Annotations: deployment.kubernetes.io/revision: 4
Selector: app=javademo1
Replicas: 3 desired | 3 updated | 3 total | 3 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: app=javademo1
Containers:
vipsoft:
Image: registry.cn-shanghai.aliyuncs.com/vipsoft/vipsoft:1.0
Port: <none>
Host Port: <none>
Environment: <none>
Mounts: <none>
Volumes: <none>
Conditions:
Type Status Reason
---- ------ ------
Available True MinimumReplicasAvailable
Progressing True NewReplicaSetAvailable
OldReplicaSets: <none>
NewReplicaSet: javademo1-84dd5c9485 (3/3 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 51m deployment-controller Scaled up replica set javademo1-5476dc8d7d to 1
Normal ScalingReplicaSet 50m deployment-controller Scaled down replica set javademo1-84dd5c9485 to 2
Normal ScalingReplicaSet 50m deployment-controller Scaled up replica set javademo1-5476dc8d7d to 2
Normal ScalingReplicaSet 50m deployment-controller Scaled up replica set javademo1-5476dc8d7d to 3
Normal ScalingReplicaSet 50m deployment-controller Scaled down replica set javademo1-84dd5c9485 to 1
Normal ScalingReplicaSet 50m deployment-controller Scaled down replica set javademo1-84dd5c9485 to 0
Normal ScalingReplicaSet 20s (x2 over 5h57m) deployment-controller Scaled up replica set javademo1-84dd5c9485 to 1
Normal ScalingReplicaSet 17s deployment-controller Scaled down replica set javademo1-5476dc8d7d to 2
Normal ScalingReplicaSet 17s deployment-controller Scaled up replica set javademo1-84dd5c9485 to 2
Normal ScalingReplicaSet 15s deployment-controller Scaled down replica set javademo1-5476dc8d7d to 1
Normal ScalingReplicaSet 14s (x2 over 5h51m) deployment-controller Scaled up replica set javademo1-84dd5c9485 to 3
Normal ScalingReplicaSet 9s deployment-controller Scaled down replica set javademo1-5476dc8d7d to 0
[root@k8smaster ~]#

history 中 CHANGE-CAUSE 里没有值,需要在创建 Deployment 时,使用 --record 参数,就可以在 CHANGE-CAUSE 列看到每个版本使用的命令了



看了很多贴子,这篇不错:Pod 的升级和回滚

Kubernetes(K8S) Deployment 升级和回滚的更多相关文章

  1. kubernetes deployment升级和回滚

    a.创建deployment pod kubectl run mynginx --image=docker.io/nginx: --record 准备svc文件 apiVersion: v1 kind ...

  2. Kubernetes:Pod 升级、回滚

    本篇主要讨论如何实现滚动更新和回滚,任意更换版本并且回滚以前的版本(版本更新),而下一章会讨论到 Pod 缩放,根据机器资源自动拓展和收缩应用(自动扩容实例). 本文为作者的 Kubernetes 系 ...

  3. kubernetes Pod的升级与回滚

    一:Deployment的升级 1.通过kubectl set image命令为Deployment设置新的镜像名称kubectl set image deployment/nginx-deploym ...

  4. 022.掌握Pod-Pod升级和回滚

    一 deploymentPod升级和回滚 1.1 deployment升级 若Pod是通过Deployment创建的,可以在运行时修改Deployment的Pod定义(spec.template)或镜 ...

  5. Hadoop HDFS概念学习系列之HDFS升级和回滚机制(十二)

    不多说,直接上干货! HDFS升级和回滚机制 作为一个大型的分布式系统,Hadoop内部实现了一套升级机制,当在一个集群上升级Hadoop时,像其他的软件升级一样,可能会有新的bug或一些会影响现有应 ...

  6. 浅入Kubernetes(12):Deployment 的升级、回滚

    目录 更新 上线 会滚 缩放 Deployment 直接设置 Pod 水平自动缩放 比例缩放 暂停 Deployment 上线 本篇内容讨论 Pod 的更新和回滚,内容不多. 更新 打开 https: ...

  7. k8s学习笔记(3)- kubectl高可用部署,扩容,升级,回滚springboot应用

    前言:上一篇通过rancher管理k8s,部署服务应用扩容,高可用,本篇介绍kubectl命令行部署高可用集群节点,测试升级.扩容等 1.测试环境:3节点k3s,使用其中2节点(ubuntunode1 ...

  8. 9.1 k8s pod版本更新流程及命令行实现升级与回滚

    1.创建 Deployment root@k8-deploy:~/k8s-yaml/controllers/deployments# vim nginx-deployment.yaml apiVers ...

  9. 9.2 k8s结合Jenkins与gitlab实现代码升级与回滚

    1.部署Jenkins 1.1 安装jdk # apt 安装jdk11 apt install openjdk-11-jdk # 查看 root@jenkins:~# java -version op ...

  10. (K8s学习笔记七)Pod的升级和回滚

    1.Deployment的升级 示例:滚动升级busybox-deployment容器 apiVersion: apps/v1 kind: Deployment metadata: name: bus ...

随机推荐

  1. JAVA类的加载(4) ——类之间能够隔离&类占用的资源能回收

    一.类加载体系

  2. 树莓派4b部署samba服务实现文件共享

    注意 samba 生命力很旺盛,软件是在不断更新的, 网上很多针对 samba 网速优化设置截止当前 实测发现有很多已经过期, 甚至有些设置会适得其反,使传输速度更低. 例如, 全网都在配置的参数,& ...

  3. 01Java学习_概述

    概述 目录 概述 三个阶段 概述 历史(了解) Java 重要特点 开发工具 Java 运行机制及运行过程 下载和安装 JDK 配置环境变量 java 快速入门 博客中的图片内容全部采用 github ...

  4. ST 表

    ST 表 定义 ST 表是用于解决 可重复贡献问题 的数据结构,通俗来说,一般可以解决区间查询问题. 区间最值和 \(gcd\) 我们以最大值为例,然后可以再推广到最小值和区间 \(gcd\) 首先你 ...

  5. 微信小程序直播接入指南

    微信小程序直播接入指南 小程序直播组件接入指引 一.简介 小程序直播,是微信提供给小程序开发者的直播组件.通过调用该组件,商家可以在小程序中实现直播功能. 按下面的使用说明接入,在你的小程序中引入直播 ...

  6. ruoyi vue 前后端分离版本 打包分离jar包至lib

    环境:若依前后端分离版本,原打包时将所有的依赖jar包放至ruoyi-admin.jar 包中,该包130MB,过大. 需求:为了减少打包更新上传的时间,减少至1.1mb 1.将不常更新的模块jar包 ...

  7. MVC控制器传值到JS

    1.传递整形数字 1 <script> 2 var data=@ViewBag.ID; 3 </script> 2.传递字符串 1 <script> 2 var d ...

  8. 【已解决】【Tensorflow2.12.0版本以后合并CPU和GPU版】Tensorflow-gpu==2.12.0 安装失败解决办法

    直接上解决方式,需要知道原因的看后文. 直接安装 tensroflow,从 2022 年 12 月起 tensorflow-gpu 已经合并到 tensorflow 包中了 pip install t ...

  9. [NOI online22提高A] 丹钓战

    题目描述 有 \(n\) 个二元组 \((a_i, b_i)\),编号为 1 到 n. 有一个初始为空的栈 SS,向其中加入元素 \((a_i, b_i)\) 时,先不断弹出栈顶元素直至栈空或栈顶元素 ...

  10. springboot——yaml格式