当前位置: 首页 > news >正文

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 

在这里插入图片描述

相关文章:

Kubernetes 应用滚动更新

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

五分钟”手撕“图书管理系统

前言: 图书馆管理系统需要结合JavaSE的绝大部分知识,是一个很好的训练项目。 为了让大家更加方便的查阅与学习,我把代码放开头,供大家查询。 还有对代码的分析,我将以类为单位分开讲解。 目录 全部代码 Main类 Us…...

8个实用网站和软件,收藏起来一定不后悔~

整理了8个日常生活中经常能用得到的网站和软件,收藏起来一定不会后悔~ 1.ZLibrary zh.zlibrary-be.se/这个网站收录了超千万的书籍和文章资源,国内外的各种电子书资源都可以在这里搜索,98%以上都可以在网站内找到,并且支持免费下…...

电商内卷时代,视频号小店凭借一己之力“脱颖而出”

大家好,我是电商笨笨熊 今年618各大电商平台花样百出; 某宝更是直接取消了“预售”,从5月就开始进入618预热期; 不少玩家既开心又难过,市场如此内卷,618确实是个爆发期,但更多的需要不断压低…...

【论文笔记】| 定制化生成PuLID

PuLID: Pure and Lightning ID Customization via Contrastive Alignment ByteDance, arXiv:2404.16022v1 Theme: Customized generation 原文链接:https://arxiv.org/pdf/2404.16022 Main Work 提出了 Pure 和 Lightning ID 定制 (PuLID),这是一种用于…...

P1638 逛画展

题目描述 博览馆正在展出由世上最佳的 𝑚 位画家所画的图画。 游客在购买门票时必须说明两个数字,𝑎 和 𝑏,代表他要看展览中的第 𝑎 幅至第 𝑏 幅画(包含 𝑎,&#x1…...

Linux(centos)常用命令

Linux(Centos)常用命令使用说明文档 切换到/home目录下 使用cd命令切换目录,例如: cd /home列出/home目录下的所有文件 使用ls命令列出目录下的文件和子目录,例如: ls /home新建目录dir1 使用mkdir命…...

从入门到精通:掌握Scrapy框架的关键技巧

在当今信息爆炸的时代,获取并利用网络数据成为了许多行业的核心竞争力之一。而作为一名数据分析师、网络研究者或者是信息工作者,要想获取网络上的大量数据,离不开网络爬虫工具的帮助。而Scrapy框架作为Python语言中最为强大的网络爬虫框架之…...

Vue3按顺序调用新增和查询接口

Vue3按顺序调用新增和查询接口 一、前言1、代码 一、前言 如果你想将两个调用接口的操作封装在不同的方法中&#xff0c;你可以考虑将这两个方法分别定义为异步函数&#xff0c;并在需要时依次调用它们。以下是一个示例代码&#xff1a; 1、代码 <template><div>…...

sizeof的了解

32位编译器 qDebug() << "int:" << sizeof(int);qDebug() << "char:" << sizeof(char);qDebug() << "char*:" << sizeof(char*); 字节数&#xff1a; int: 4 char: 1 char*: 4 64位编译器 字节数&#…...

PostgreSQL 教程

## PostgreSQL 教程 ### 1. PostgreSQL 概述 PostgreSQL 是一个开源的对象关系型数据库管理系统&#xff08;ORDBMS&#xff09;&#xff0c;以其高扩展性和合规性闻名&#xff0c;支持 SQL 和 JSON 查询。 ### 2. 安装与配置 - **下载与安装**&#xff1a;从 PostgreSQL 官方…...

《基于Jmeter的性能测试框架搭建》改进一

《基于Jmeter的性能测试框架搭建》文末笔者提到了不少待改进之处&#xff0c;如下所示。 Grafana性能图表实时展现&#xff0c;测试过程中需实时截图形成测试报告&#xff0c;不够人性化。解决方案&#xff1a;自动生成测试报告并邮件通知。 Grafana性能图表需测试人员实时监控…...

计算机二进制表示和存储各种数据

目录 计算机二进制是什么 计算机中二进制数作用 不同数据的表示和存储 数字 文字 图片 音频 视频 计算机的中数据的显示和存储 计算机二进制是什么 计算机二进制数&#xff1a;计算机里存储的一切都是以二进制的0和1来表示。二进制是计算机使用的数字编码系统&#x…...

玩机社区 - 2024年最美社区源码开源

玩机社区 - 2024年最美社区源码开源 教程源码文档都内置到压缩包了 https://pan.baidu.com/s/1xwcscTne-JMbmKEntiuAuA?pwd78oi...

Linux系统——面试题分享

目录 1.现在给你三百台服务器&#xff0c;你怎么对他们进行管理&#xff1f; 2.简述 raid0 raid1 raid5 三种工作模式的工作原理及特点 2.1RAID 0 ——可以是一块盘和 N 个盘组合 2.2RAID 1 ——只能2块盘&#xff0c;盘的大小可以不一样&#xff0c;以小的为准 2.3RAID 5 …...

谈恋爱没经验?那就来刷谈恋爱经验宝宝吧

❤️作者主页&#xff1a;小虚竹 ❤️作者简介&#xff1a;大家好,我是小虚竹。2022年度博客之星评选TOP 10&#x1f3c6;&#xff0c;Java领域优质创作者&#x1f3c6;&#xff0c;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;掘金年度人气作…...

element-ui输入框和多行文字输入框字体不一样解决

element-ui的type"textarea"的字体样式与其他样式不同 <el-input type"textarea"></el-input> <el-input ></el-input>设置&#xff1a; .el-textarea__inner::placeholder {font-family: "Helvetica Neue", Helvetic…...

(Java企业 / 公司项目)配置Linux网络-导入虚拟机

公司给了我一个IP地址 &#xff0c;提供了一个虚拟机或者自己搭建虚拟机&#xff0c;还有提供登录的账号密码 可以查看我之前的文章 VMware Workstation Pro 17虚拟机超级详细搭建&#xff08;含redis&#xff0c;nacos&#xff0c;docker, rabbitmq&#xff0c;sentinel&…...

java的unsafe

在Java中&#xff0c;sun.misc.Unsafe 是一个强大且危险的类&#xff0c;它提供了一些直接操作内存、对象和线程的底层功能。这个类通常不鼓励普通开发者使用&#xff0c;因为它绕过了Java语言的一些安全性和内存管理机制&#xff0c;可能会导致难以追踪的错误和安全漏洞。 Un…...

起底震网病毒的来龙去脉

2010年&#xff0c;震网病毒被发现&#xff0c;引起世界哗然&#xff0c;在后续的10年间&#xff0c;陆陆续续有更多关于该病毒的背景和细节曝光。今年&#xff0c;《以色列时报》和《荷兰日报》又披露了关于此事件的更多信息&#xff0c;基于这些信息&#xff0c;我们重新梳理…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

基于大模型的 UI 自动化系统

基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

React hook之useRef

React useRef 详解 useRef 是 React 提供的一个 Hook&#xff0c;用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途&#xff0c;下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

shell脚本--常见案例

1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件&#xff1a; 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

Day131 | 灵神 | 回溯算法 | 子集型 子集

Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 笔者写过很多次这道题了&#xff0c;不想写题解了&#xff0c;大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

基于服务器使用 apt 安装、配置 Nginx

&#x1f9fe; 一、查看可安装的 Nginx 版本 首先&#xff0c;你可以运行以下命令查看可用版本&#xff1a; apt-cache madison nginx-core输出示例&#xff1a; nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略

本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装&#xff1b;只需暴露 19530&#xff08;gRPC&#xff09;与 9091&#xff08;HTTP/WebUI&#xff09;两个端口&#xff0c;即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件&#xff08;System Property Definition File&#xff09;&#xff0c;用于声明和管理 Bluetooth 模块相…...