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命令回滚到指定的版本。
相关推荐
Benny的老巢9 小时前
Mac上用XAMPP搭建局域网可访问的开发环境,让局域网内其他设备通过域名访问
nginx·macos·apache·xampp·php开发环境
岚天start14 小时前
Docker部署NGINX实现服务四层转发方案
服务器·nginx·docker
微凉的衣柜17 小时前
Windows Server 使用 Nginx 反向代理实现域名访问内网 Gradio 应用
运维·windows·nginx
上去我就QWER17 小时前
什么是反向代理?
后端·nginx
小白冲鸭19 小时前
苍穹外卖-前端环境搭建-nginx双击后网页打不开
运维·前端·nginx
oMcLin19 小时前
如何在 Debian 11 上配置并优化 Nginx 与 Lua 脚本,提升高并发网站的动态请求处理能力?
nginx·debian·lua
笑笑�21 小时前
OpenResty + nginx_upstream_check_module 构建主动健康检查模块
运维·nginx·负载均衡·openresty
工具罗某人2 天前
docker快速部署minio
java·nginx·docker
oMcLin2 天前
如何在Ubuntu 24.04上通过配置Nginx与Keepalived实现高可用负载均衡集群
nginx·ubuntu·负载均衡
小Ti客栈2 天前
前后台Nginx部署同域名路径区分配置
java·前端·nginx