k8s上尝试滚动更新和回滚

滚动更新和回滚

实验目标:

学习如何进行应用的滚动更新和回滚操作。

实验步骤:

  • 创建一个 Deployment。
  • 更新 Deployment 的镜像版本,观察滚动更新过程。
  • 回滚到之前的版本,验证回滚操作。

今天呢,我们继续来进行我们k8s上的实验:滚动更新和回滚

之前我们在第一篇的实验中创建了3个nginx容器,目前是还在运行状态,今天我们就来模拟更新滚动更新Nginx服务,如果是刚来的朋友请看第一篇文章,如何运行一个简单的应用。

1、查看原始的yaml文件

因为我们之前起nginx服务的时候并未使用yaml文件,而是直接在容器中运行,虽说kubectl describe 命令也能看到容器的大部分信息,但毕竟不够全面。所以我们先导出一份默认的配置来参考下

bash 复制代码
kubectl get deployment nginx -n nginx -o yaml > /kubeapi/data/project3/nginx-deployment.yaml

这里也是发现了镜像版本是:nginx:alpine 是一个小巧轻便的镜像。

为了观察滚动更新的效果,我准们准备了一个小脚本,来对nginx服务进行持续性访问,看是否会影响用户的链接,这里我是新开了一台机器,相当于从外部进行访问

bash 复制代码
#!/bin/bash

# 设置 Nginx 服务器的 URL
url="http://localhost"

while true; do
  # 使用 curl 命令访问 Nginx 服务器
  curl -s "$url"

  # 添加延迟以避免过载服务器
  sleep 1
done

2、滚动更新

可以使用 kubectl set image 命令在更新镜像:

bash 复制代码
kubectl set image deployment nginx -n nginx nginx=nginx:1.21-alpine

# 这里也可以直接使用deployment的yaml文件
# kubectl set image deployment/<deployment-name> nginx=nginx:1.21-alpine

查看更新状态:

bash 复制代码
kubectl rollout status deployment nginx -n nginx

观察在更新中的容器状态:

发现有新的容器正在被创建

bash 复制代码
kubectl get pods -n nginx

观察持续访问情况:

用户侧的持续访问并未受影响,在新容器创建过程中一直在接受新的请求

在请求脚本的返回结果中不难看出

在有新的容器更新完毕后,将会自动加入服务队列,之前更新的容器已被剔除

同时用户侧的访问信息也发生了变化,说明新的服务已经处于工作状态

效果非常明显

验证:

更新全部完毕后,我们查看下服务的版本是否为我们计划更新的版本

bash 复制代码
kubectl describe pod nginx-758dd7897f-bw6sb -n nginx

更新成功,滚动更新完毕。

回滚操作

可以使用这个命令,修改下目前nginx服务对外的页面,这样能比较清楚的看到回滚的效果

请在不同的工作节点修改pod name后执行一次即可

bash 复制代码
kubectl exec -it nginx-758dd7897f-bw6sb -n nginx -- sh -c "echo $(hostname) > /usr/share/nginx/html/index.html"

我现在执行访问脚本验证正常:

接下来进行回滚操作
查看 Deployment 的历史版本

bash 复制代码
kubectl rollout history deployment/nginx -n nginx

但是我并没有看到历史版本的修订号,这个问题可能是因为在创建 Deployment 时未指定或记录变更原因,或者可能是历史记录中没有详细的变更原因信息。

不过,不用担心,你仍然可以使用 kubectl rollout undo 命令来回滚 Deployment 到之前的版本,无论是否有变更原因记录。

执行回滚操作

如果有历史版本的修订号,可以通过 --to-revision 参数指定要回滚的版本:

bash 复制代码
kubectl rollout undo deployment/nginx --to-revision=<revision-number> -n nginx

<revision-number> 替换为你想要回滚到的具体修订号。

如果没有指定 --to-revision 参数,默认会回滚到上一个版本:

bash 复制代码
kubectl rollout undo deployment/nginx -n nginx

回滚的过程非常之迅速啊

基本上在执行完命令后,不到10秒钟的时间就已经全部回滚完成了

观察用户侧的访问情况:

验证:

通过详细信息我们不难看出,镜像使用的版本已经回到我们更新前的


总结

  • 滚动更新:使用kubectl edit deployment编辑镜像版本,或者使用kubectl set image命令更新镜像。
  • 回滚:使用kubectl rollout history查看历史版本,然后使用kubectl rollout undo命令回滚到指定的版本。
相关推荐
川石课堂软件测试8 小时前
Oracle 数据库:视图与索引
数据库·网络协议·nginx·http·oracle·grafana·prometheus
小妖6669 小时前
mac 安装 nginx
运维·nginx·macos
Whitess0079 小时前
Websocket链接如何配置nginx转发规则?
websocket·网络协议·nginx
if时光重来18 小时前
springboot项目使用websocket功能,使用了nginx反向代理后连接失败问题解决
spring boot·websocket·nginx
xiaozhenghahaha19 小时前
Web相关知识(草稿)
运维·nginx
柯南二号21 小时前
【后端】Docker 常用命令详解
服务器·nginx·docker·容器
工会代表1 天前
nginx配置,将前端项目配置到子路径下踩过的坑。
前端·nginx
云霄IT1 天前
CentOS7安装Nginx服务——为你的网站配置https协议和自定义服务端口
服务器·nginx·https
XMYX-01 天前
Tengine/Nginx 安装以及模块查看与扩展
运维·nginx
zzz100661 天前
Web 与 Nginx 网站服务:从基础到实践
运维·前端·nginx