Kubernetes 应用滚动更新

Kubernetes 应用版本号

在 Kubernetes 里,版本更新使用的不是 API 对象,而是两个命令:kubectl applykubectl rollout,当然它们也要搭配部署应用所需要的 Deployment、DaemonSet 等 YAML 文件。

在 Kubernetes 里应用都是以 Pod 的形式运行的,而 Pod 通常又会被 Deployment 等对象来管理,所以应用的“版本更新”实际上更新的是整个 Pod。

Pod 是由 YAML 描述文件来确定的,更准确地说,是 Deployment 等对象里的字段 template。

所以 Kubernetes 就使用了“摘要”功能,用摘要算法计算 template 的 Hash 值作为“版本号”。

#获取ngx的pod
kubectl get pod
#删除其中一个
kubectl delete pod ngx-dep-6796688696-9zwxh
#再获取ngx的pod,查看变化
kubectl get pod

在这里插入图片描述
可以看到,Pod 名字里的那串随机数“6796……”是没有变化的,变化的是数字后面的pod编号的随机字符。中间的随机数字就是 Pod 模板的 Hash 值,也就是 Pod 的“版本号”。

如果变动了 Pod YAML 描述,比如把镜像改成 nginx:stable-alpine会生成一个新的应用版本,kubectl apply 后就会重新创建 Pod。

命令操作

#删除pod
kubectl delete -f nginx-deploy.yml
#查看删除结果
kubectl get pod
# 不改yaml,再次生成pod
kubectl apply -f nginx-deploy.yml
#查看生成pod的版本号是否改变
kubectl get pod
#删除pod
kubectl delete -f nginx-deploy.yml
#查看删除结果
kubectl get pod
#编辑pod yaml,修改版本号
vim nginx-deploy.yml
# 重新生成pod
kubectl apply -f nginx-deploy.yml
#查看生成pod的版本号是否改变
kubectl get pod

更改后的yaml

apiVersion: apps/v1
kind: Deployment
metadata:name: ngx-depspec:replicas: 2selector:matchLabels:app: ngx-deptemplate:metadata:labels:app: ngx-depspec:volumes:- name: ngx-conf-volconfigMap:name: ngx-confcontainers:- image: nginx:stable-alpinename: nginxports:- containerPort: 80volumeMounts:- mountPath: /etc/nginx/conf.dname: ngx-conf-vol
~                              

在这里插入图片描述
在这里插入图片描述

不改变yaml,重新生成的pod的版本号还是6796688696
更改了yaml后,生成的pod的版本号就变成了574d5f9d4d

Kubernetes 实现应用更新

修改 ConfigMap,让它输出 Nginx 的版本号,方便 curl 查看版本:
nginx-config-cm.yml

apiVersion: v1
kind: ConfigMap
metadata:name: ngx-confdata:default.conf: |server {listen 80;location / {default_type text/plain;return 200'ver : $nginx_version\nsrv : $server_addr:$server_port\nhost: $hostname\n';}}

执行命令

# 编辑configMap内容
vim nginx-config-cm.yml 
# 更新 ConfigMap
kubectl apply -f nginx-config-cm.yml 

在这里插入图片描述
创建 Pod 镜像,明确地指定版本号是 1.21-alpine,实例数设置为 4 个

nginx-deploy-v1.yml

apiVersion: apps/v1
kind: Deployment
metadata:name: ngx-depspec:replicas: 4 selector:matchLabels:app: ngx-deptemplate:metadata:labels:app: ngx-depspec:volumes:- name: ngx-conf-volconfigMap:name: ngx-confcontainers:- image: nginx:1.21-alpinename: nginxports:- containerPort: 80volumeMounts:- mountPath: /etc/nginx/conf.dname: ngx-conf-vol

执行命令

# 删除现有的nginx pod
kubectl delete -f nginx-deploy.yml 
# 创建新版本的nginx yml
vim nginx-deploy-v1.yml
# 生成4个pod
kubectl apply -f nginx-deploy-v1.yml 
# 查看生成pod
kubectl get pod

在这里插入图片描述

本地端口转发到 Kubernetes 集群中的服务

# 查看service服务
kubectl get svc
# 绑定到svc service 转发请求来查看状态
kubectl port-forward svc/ngx-svc 8080:80 &
# 测试转发
curl 127.1:8080
  • kubectl port-forward: 这个命令将本地端口转发到 Kubernetes 集群中的某个资源(如 Pod 或 Service)。(只会将流量发送到一个特定的端点,而不是通过服务的负载均衡机制
  • svc/ngx-svc: 指定要转发的目标资源,这里是名为 ngx-svc 的 Service。
  • 8080:80: 将本地的 8080 端口转发到 ngx-svc 服务的 80 端口。
  • &: 将该命令放入后台运行,这样可以继续在终端中执行其他命令。
    在这里插入图片描述
    镜像升级到 nginx:1.22-alpine

为了能够观察到应用更新的过程,我们还需要添加一个字段 minReadySeconds,让 Kubernetes 在更新过程中等待一点时间,确认 Pod 没问题才继续其余 Pod 的创建工作。

minReadySeconds 这个字段不属于 Pod 模板,所以它不会影响 Pod 版本

nginx-deploy-v2.yml

apiVersion: apps/v1
kind: Deployment
metadata:name: ngx-depspec:minReadySeconds: 15      # 确认Pod就绪的等待时间replicas: 4selector:matchLabels:app: ngx-deptemplate:metadata:labels:app: ngx-depspec:volumes:- name: ngx-conf-volconfigMap:name: ngx-confcontainers:- image: nginx:1.22-alpinename: nginxports:- containerPort: 80volumeMounts:- mountPath: /etc/nginx/conf.dname: ngx-conf-vol
~                               

执行命令

# 创建文件内容,把上面内容copy进来
vim nginx-deploy-v2.yml
# 更新成的新的pod
kubectl apply -f nginx-deploy-v2.yml
# 查看滚动更新过程
kubectl rollout status deployment ngx-dep
# 绑定到svc service 转发请求来查看状态
kubectl port-forward svc/ngx-svc 8080:80 &
# 测试转发
curl 127.1:8080
# 查看滚动详情信息
kubectl describe deploy ngx-dep

在这里插入图片描述
在这里插入图片描述
滚动更新图

  • 一开始的时候 V1 Pod(即 ngx-dep-54b865d75)的数量是 4;
  • 当“滚动更新”开始的时候,Kubernetes 创建 1 个 V2 Pod(即 ngx-dep-d575d5776),并且把 V1 Pod 数量减少到 3;
  • 接着再增加 V2 Pod 的数量到 2,同时 V1 Pod 的数量变成了 1;
  • 最后 V2 Pod 的数量达到预期值 4,V1 Pod 的数量变成了 0,整个更新过程就结束了。

滚动更新”就是由 Deployment 控制的两个同步进行的“应用伸缩”操作,老版本缩容到 0,同时新版本扩容到指定值,是一个“此消彼长”的过程。

在这里插入图片描述

Kubernetes管理应用更新

如果更新过程中发生了错误或者更新后发现有 Bug,可以随时使用 kubectl rollout pause 来暂停更新,检查、修改 Pod,或者测试验证,如果确认没问题,再用 kubectl rollout resume 来继续更新。

注意:它们只支持 Deployment,不能用在 DaemonSet、StatefulSet 上( 1.24 之后支持了 StatefulSet 的滚动更新)

Kubernetes应用版本回退

查看更新历史使用的命令是 kubectl rollout history

#查看有哪些版本
kubectl rollout history deployment ngx-dep
#查看每个版本的详细信息
kubectl rollout history deployment ngx-dep --revision=2
# 回退到上一个版本
kubectl rollout undo  deploy ngx-dep
# 回退到指定版本(--to-revision=1不能有空格)
kubectl rollout undo  deploy ngx-dep --to-revision=1

在这里插入图片描述

kubectl rollout undo 的操作过程其实和 kubectl apply 是一样的,执行的仍然是“滚动更新”,只不过使用的是旧版本 Pod 模板,把新版本 Pod 数量收缩到 0,同时把老版本 Pod 扩展到指定值。

在这里插入图片描述

Kubernetes 添加更新描述

在Deployment 的 metadata 里加上一个新的字段 annotations。annotations 字段的含义是“注解”“注释”,形式上和 labels 一样,都是 Key-Value,也都是给 API 对象附加一些额外的信息,但是用途上区别很大。

  • annotations 添加的信息一般是给 Kubernetes 内部的各种对象使用的,有点像是“扩展属性”;
  • labels 主要面对的是 Kubernetes 外部的用户,用来筛选、过滤对象的。

annotations 里的值可以任意写,Kubernetes 会自动忽略不理解的 Key-Value,但要编写更新说明就需要使用特定的字段 kubernetes.io/change-cause。

创建 2 个版本的 Nginx 应用,同时添加更新说明:

nginx-deploy-v1.yml

apiVersion: apps/v1
kind: Deployment
metadata:name: ngx-depannotations:   kubernetes.io/change-cause: v1, ngx=1.21spec:replicas: 4 selector:matchLabels:app: ngx-deptemplate:metadata:labels:app: ngx-depspec:volumes:- name: ngx-conf-volconfigMap:name: ngx-confcontainers:- image: nginx:1.21-alpinename: nginxports:- containerPort: 80volumeMounts:- mountPath: /etc/nginx/conf.dname: ngx-conf-vol

nginx-deploy-v2.yml

deployment.apps/ngx-dep 
REVISION  CHANGE-CAUSE
3         v1, ngx=1.21
4         update to v2, ngx=1.22[root@iZbp12ghzy6koox6fqt0svZ ~]# cat nginx-deploy-v2.yml 
apiVersion: apps/v1
kind: Deployment
metadata:name: ngx-depannotations:    kubernetes.io/change-cause: update to v2, ngx=1.22spec:minReadySeconds: 15      # 确认Pod就绪的等待时间replicas: 4 selector:matchLabels:app: ngx-deptemplate:metadata:labels:app: ngx-depspec:volumes:- name: ngx-conf-volconfigMap:name: ngx-confcontainers:- image: nginx:1.22-alpinename: nginxports:- containerPort: 80volumeMounts:- mountPath: /etc/nginx/conf.dname: ngx-conf-vol

执行命令

vim nginx-deploy-v1.yml 
kubectl apply -f nginx-deploy-v1.yml
vim nginx-deploy-v2.yml 
kubectl apply -f nginx-deploy-v2.yml
#查看滚动更新
kubectl rollout status deployment ngx-dep
#查看一下更新历史:
kubectl rollout history deployment ngx-dep 

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/14475.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nssctf——web

[SWPUCTF 2021 新生赛]gift_F12 1.打开环境后,这里说要900多天会有flag,这是不可能的 2.f12查看源码,然后在html中查找flag (在最上方的栏目中,或者按ctrlf) [SWPUCTF 2021 新生赛]jicao 1.打开环境是一段…

Fragment问题:java.lang.IllegalStateException

错误提示: Process: com.example.accountapp, PID: 3987 java.lang.IllegalStateException: Could not execute method for android:onClick …

Vue速成学习笔记

这两天速成了一下Vue,在这里记录一下相关的笔记,之后有时间详细学Vue的时候再来回顾一下! 一、Vue理解 1、Vue的核心特征:双向绑定。 在网页中,存在视图和数据。在Vue之前,需要使用JavaScript编写复杂的逻…

web前端面试题

web前端面试题 1、前端如何实现优化性能 (1)减少网络时间 ①使用DNS缓存技术 ​ ②减少需要传输的文件尺寸 ​ ③加快文件传输速度 (2)减少发送的请求数量 ①利用浏览器缓存 ​ ②使用合并的图片文件 (3)提高浏览器下载的并发度 ①JS文件放在HTML文档最后 ​ ②使用多个域名 (…

音视频及H264/H256编码相关原理

一、音视频封装格式原理: 我们播放的视频文件一般都是用一种封装格式封装起来的,封装格式的作用是什么呢?一般视频文件里不光有视频,还有音频,封装格式的作用就是把视频和音频打包起来。 所以我们先要解封装格式&#…

谷歌上架,个人号比企业号好上?“14+20”封测如何解决,你知道了吗

在Google Play上架应用,对开发者而言,既是挑战也是机遇。随着谷歌政策的不断更新,特别是要求2023年11月13日后注册的个人开发者账号在发布正式版应用前,必须经过20人连续14天的封闭测试。 这一政策的改变使得许多开发者开始考虑使…

什么是物联网通信网关?-天拓四方

在信息化、智能化的时代,物联网技术的广泛应用正在逐渐改变我们的生活方式。物联网通过各种传感器和设备,将现实世界与数字世界紧密相连,从而实现智能化、自动化的生活和工作方式。作为物联网生态系统中的重要组成部分,物联网通信…

【数据结构】堆(Heep)

✨✨✨专栏:数据结构 🧑‍🎓个人主页:SWsunlight 目录 一、堆: 定义: 性质: 大、小根堆: 二、实现堆(完全二叉树): 前言: …

四、Filter

Filter简介 Filter 的基本功能是对Servlet容器调用Servlet的过程进行拦截,从而在Servlet进行响应处理的前后实现一些特殊的功能.在Servlet API 中定义了三个接口类来供开发人员编写Filter 程序:Filter,FilterChain,FilterConfigFilter 程序是一个实现了…

Spring:Spring事务失效的各种场景以及解决方法

一、前言 Spring事务是指Spring框架中提供的事务管理功能,它可以帮助开发者简化事务管理的复杂性,提高代码的可维护性和可扩展性。本文将总结并分析Spring事务失效的各种场景,帮助你全面了解事务失效的原因和解决方案。 二、Spring事务失效的…

51汇编--数码管显示

;将内部RAM30H~32H单元中存储的6位十进制数显示在6个数码管上。 ;要求编写将一个内存单元中的压缩BCD码转换为两个七段显示码的子程序和 ;延时子程序。不允许在程序中给30H、31H和32H单元赋值,要通过存 ;储器窗口赋值。尝试改变点亮数码管的时间&#xf…

Linux软硬链接及动静态库

软硬链接与动静态库 软连接 创建链接的方法: ln -s test1.txt test2.txt 其中ln 是link(链接),-s 是soft(软),后者链接前者。 此时打开test2.txt,发现其中内容与test.txt一致。那么软连接到底建立了什么联系?…

轻松购物,尽在购物网

在忙碌的生活中,想要找到心仪的商品,却总是苦于没有时间和精力去实体店挑选?别担心,购物网为您提供一站式的购物体验。无论是时尚服饰、家居用品,还是美食特产,这里都能满足您的需求。只需轻轻一点&#xf…

监听element-ui表格滚动事件

当element-ui表格高度写死之后,表格内容超出高度就会在右侧显示滚动条,监听滚动事件 首先给表格加ref,ref"refTable" 然后在mounted生命周期里写监听事件 mounted() {this.$refs.refTable.$el.onwheel (e) > {console.log(滚…

深入解析线程上下文切换的原理与优化策略

深入解析线程上下文切换的原理与优化策略 定义触发条件线程上下文切换的过程线程上下文切换的开销减少上下文切换的方法示例代码总结 线程上下文切换(Thread Context Switch)是操作系统调度机制的重要组成部分。它涉及保存当前线程的状态并恢复新线程的状…

vue中使用ant的rangePicker设置禁选时间和时间格式

<a-range-pickerstyle"width: 100%":disabled-date"disabledDate"v-model:value"time"valueFormat"YYYY-MM-DD" />valueFormat设置时间格式YYYY-MM-DD 通过dayjs获取时间&#xff0c;return过滤后的时间 const disabledDate (…

安装apex时遇到的问题

Apex是混合精度库&#xff0c;安装过程中常常出现各种问题&#xff0c;在此记录一下 首先&#xff0c;不能使用pip install apex,这是两个完全不同的库&#xff0c;需要去官网下载 其次&#xff0c;参考官网安装时可能会报错&#xff1a;could not build wheels for apex, whic…

C/C++运行时库和UCRT系统通用运行时库总结及问题实例分享

目录 1、概述 2、不同版本的Visual Studio对应的运行时库说明 3、在Windbg10.0安装目录中获取UCRT通用运行时库 4、微软官网对UCRT通用运行时库的相关说明 5、使用Visual Studio 2017开发软件初期遇到的UCRT通用运行时库问题 6、如何查看软件依赖了哪些C/C运行时库&#…

后端雪花算法主键ID传到前端变了

Mybatis Plus 的主键策略&#xff1a; /*** id*/TableId(type IdType.ASSIGN_ID)private Long id; 这个主键策略会用雪花算法生成一个 19位的ID&#xff0c;比如 1791006670084734978 现象 后端生成的 id 是正常的&#xff0c;通过 swagger 文档此时获取到的 id 也和数据库中…

leetcode-盛水最多的容器-109

题目要求 思路 1.正常用双循环外循环i从0开始&#xff0c;内循环从height.size()-1开始去计算每一个值是可以的&#xff0c;但是因为数据量太大&#xff0c;会超时。 2.考虑到超时&#xff0c;需要优化一些&#xff0c;比如第一个选下标1&#xff0c;第二个选下标3和第一个选下…