K8S Deployment 实现 蓝绿 发布

一、何为蓝绿发布

蓝绿发布(Blue - Green Deployment)是一种软件部署策略,旨在最大程度减少应用程序停机时间,确保新老版本系统平稳过渡。以下为详细介绍:

1.1、基本概念

  • 存在两个完全相同的生产环境,通常称为 “蓝” 环境和 “绿” 环境 。在任意时刻,只有一个环境对外提供服务,假设当前是蓝色环境服务用户请求,那么绿色环境则处于闲置或预发布状态。
  • 当有新的软件版本需要发布时,先将其部署到非当前运行的环境(如绿色环境)。在绿色环境中完成全面的测试和验证,确保新部署的应用程序功能正常、性能达标。当确认无误后,通过将流量从蓝色环境切换到绿色环境,完成新老版本的更替。
  • 如下图所示,某服务旧版本为v1,对新版本v2进行冗余部署。版本升级时,将现有流量全部切换为新版本v2。

  • 当新版本v2存在问题或者发生故障时,可以快速切回旧版本v1。

1.2、优势

  • 降低风险:通过在切换前对新环境进行充分测试,可在不影响用户体验的前提下,提前发现并解决新部署可能出现的问题,如代码缺陷、配置错误等,从而降低发布失败的风险。
  • 减少停机时间:切换过程只是简单地将流量从一个环境导向另一个环境,如通过修改负载均衡器配置,所以能实现快速切换,显著减少应用程序停机时间,提升用户体验。
  • 回滚便捷:若新环境出现问题,只需将流量重新切回原环境,即可快速恢复到之前稳定的版本,操作相对简单,能有效缩短故障恢复时间。

1.3、局限性

  • 成本较高:需同时维护两个完整的生产环境,包括硬件设施、软件许可等,这无疑增加了企业的基础设施成本和运维管理成本。
  • 配置复杂:两个环境需保持一致的配置,包括服务器设置、网络配置、数据库连接等,配置管理难度大,任何细微差异都可能导致发布问题。

二、镜像准备

 假设有如下三个节点的 K8S 集群:

k8s31master 是控制节点

k8s31node1、k8s31node2 是工作节点

容器运行时是 containerd

使用 springboot 打包两个镜像 hellok8s-1.0.jar.gz 和 hellok8s-2.0.jar.gz。

hellok8s:1.0

@RestController
public class HelloController {

    @GetMapping("/sayHello")
    @ResponseBody
    public String sayHello() {
        # 蓝
        return "Hello,I am Blue";
    }
}

hellok8s:2.0

@RestController
public class HelloController {

    @GetMapping("/sayHello")
    @ResponseBody
    public String sayHello() {
        # 绿
        return "Hello,I am Green";
    }
}

它们的区别仅在输出的问候信息不同,一个 Blue、一个 Green.

  •  导入镜像
# node1 执行
[root@k8s31node1 ~]# ctr -n=k8s.io images import hellok8s-1.0.jar.gz
[root@k8s31node1 ~]# ctr -n=k8s.io images import hellok8s-2.0.jar.gz
# node2 执行
[root@k8s31node2 ~]# ctr -n=k8s.io images import hellok8s-1.0.jar.gz
[root@k8s31node2 ~]# ctr -n=k8s.io images import hellok8s-2.0.jar.gz

三、Deployment 实现

我们用 Service 代替网关,来实现一个 绿 发布。

3.1、部署 1.0 “”环境

假设现在有 1.0 版本的 deploy-blue.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploy-blue
spec:
  replicas: 3
  selector:
    matchLabels:
      app: hellok8s
      version: "1.0"
  template:
    metadata:
      labels:
        app: hellok8s
        version: "1.0"
    spec:
      containers:
      - name: hellok8s
        image: hellok8s:1.0
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 8080
        startupProbe:
          httpGet:
            path: /
            port: 8080
          initialDelaySeconds: 5
          periodSeconds: 10
        readinessProbe:
          httpGet:
            path: /
            port: 8080
          initialDelaySeconds: 5
          periodSeconds: 10
        livenessProbe:
          httpGet:
            path: /
            port: 8080
          initialDelaySeconds: 5
          periodSeconds: 10

  • selector.matchLabels 要与 template.metadata.labels 相匹配。
  • 镜像版本是 1.0
  • 运行并查看
kubectl apply -f deploy-blue.yaml
kubectl get deploy
kubectl get rs
kubectl get pod -owide

 3.2、部署 2.0 “绿”环境

deploy-green.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploy-green
spec:
  replicas: 3
  selector:
    matchLabels:
      app: hellok8s
      version: "2.0"
  template:
    metadata:
      labels:
        app: hellok8s
        version: "2.0"
    spec:
      containers:
      - name: hellok8s
        image: hellok8s:2.0
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 8080
        startupProbe:
          httpGet:
            path: /
            port: 8080
          initialDelaySeconds: 5
          periodSeconds: 10
        readinessProbe:
          httpGet:
            path: /
            port: 8080
          initialDelaySeconds: 5
          periodSeconds: 10
        livenessProbe:
          httpGet:
            path: /
            port: 8080
          initialDelaySeconds: 5
          periodSeconds: 10
  •  运行并查看
kubectl apply -f deploy-green.yaml
kubectl get deploy
kubectl get rs
kubectl get pod -owide

 3.3、暴露服务

假设当前是“”环境服务用户请求。

  • 编写 service

service-blue-green.yaml

apiVersion: v1
kind: Service
metadata: 
  name: svc-blue-green
spec:
  type: NodePort
  ports:
  - port: 80
    nodePort: 32181
    targetPort: 8080
  selector:
    app: hellok8s
    version: "1.0"
  • NodePort:以节点端口的方式暴露服务。
  • port:service 暴露的服务端口。
  • targetPort:容器端口(1 to 65535)。
  • nodePort:节点端口(default: 30000-32767)。
  • selector:标签选择器。选择想要暴露服务的 pod 的 labels。
  • 运行并查看
kubectl apply -f service-blue-green.yaml
kubectl get svc

  •  以 节点IP:端口 访问接口

可以看到,service 返回的是 Blue 1.0 版本的接口。

部署结构图如下:​

  • 当用户访问 master、node1、node2 的 32181 端口时,流量会被导到 service 的 80 端口。
  • service 的 80 端口,代理的就是 app: hellok8s,version: "1.0" 的三个 pod:deploy-blue-d96bd64f7-btrzv、deploy-blue-d96bd64f7-vc7d2、deploy-blue-d96bd64f7-w64ml

 3.4、切换流量

假设现在运营测试人员已在 “绿”环境验证完 2.0 的应用功能,需要将 2.0 切换给用户使用。

  • 修改 service-blue-green.yaml,将 1.0 修改为 2.0

version: "2.0"

  •  更新 service
kubectl apply -f service-blue-green.yaml
  •  以 节点IP:端口 访问接口

 可以看到,服务版本,已经切换为 Green。

从这边我们也可以看出,这种部署方式,对于用户是无感知的,

用户一直只需要用 nodeIp:nodePort/path 的方式访问,而应用的版本,已经从 1.0 被切换为 2.0。

3.5、版本回退

版本回退的过程跟切换流量是一样的,只不过把 version: "2.0" 改为 version: "1.0",并重新更新 service。这里就不再演示了。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CVPR | CNN融合注意力机制,芜湖起飞!

**标题:**On the Integration of Self-Attention and Convolution **论文链接:**https://arxiv.org/pdf/2111.14556 **代码链接:**https://github.com/LeapLabTHU/ACmix 创新点 1. 揭示卷积和自注意力的内在联系 文章通过重新分解卷积和自…

ollama部署deepseek实操记录

1. 安装 ollama 1.1 下载并安装 官网 https://ollama.com/ Linux安装命令 https://ollama.com/download/linux curl -fsSL https://ollama.com/install.sh | sh安装成功截图 3. 开放外网访问 1、首先停止ollama服务:systemctl stop ollama 2、修改ollama的servic…

鸟哥Linux私房菜笔记(三)

鸟哥Linux私房菜笔记(三) 该第三部分和第四部分主要为原书的第十一章(正则表达式与文件格式化处理),第十二章学习shell脚本,第十六章(进程管理与SElinux初探部分),第十七…

WordPressAI自动生成发布文章免费插件,SEO,定时任务,生成长尾关键词、根据网站主题内容全自动化后台生成发布文章

一款可以自动发布文章的WordPress插件 wordpress 自动生成文章发布插件下载地址: 点击下载 插件基础功能免费无限制 1、插件后台可输入想要的文章主题或文章构成思路 2、ai自动生成并发布 3、可自定义发布后的文章状态和分类 4、可根据已有的长尾关键词生成文章 5、可对a…

R语言 | 使用 ComplexHeatmap 绘制热图,分区并给对角线分区加黑边框

目的:画热图,分区,给对角线分区添加黑色边框 建议直接看0和4。 0. 准备数据 # 安装并加载必要的包 #install.packages("ComplexHeatmap") # 如果尚未安装 library(ComplexHeatmap)# 使用 iris 数据集 #data(iris)# 选择数值列&a…

机器学习基本概念(附代码)

一、算法与模型的关系 在机器学习领域,算法和模型是两个核心概念。算法是一种偏抽象的概念,它定义了计算机解决问题的步骤和流程。而模型则是更加具体的概念,通过代码实现特定算法来完成任务。数学上,一个简单的模型可以表示为 y…

OpenCV:特征检测总结

目录 一、什么是特征检测? 二、OpenCV 中的常见特征检测方法 1. Harris 角点检测 2. Shi-Tomasi 角点检测 3. Canny 边缘检测 4. SIFT(尺度不变特征变换) 5. ORB 三、特征检测的应用场景 1. 图像匹配 2. 运动检测 3. 自动驾驶 4.…

深度学习系列--01.入门

一.深度学习概念 深度学习(Deep Learning)是机器学习的分支,是指使用多层的神经网络进行机器学习的一种手法抖音百科。它学习样本数据的内在规律和表示层次,最终目标是让机器能够像人一样具有分析学习能力,能够识别文字…

Vue3.5常用特性整理

Vue3.5 发布已近半年&#xff0c;抽空整理下常用的新增/改动特性 响应式 Props 解构 Vue3.5 中 Props 正式支持解构了&#xff0c;并添加了响应式跟踪 设置默认值 使用 JavaScript 原生的默认值语法声明 props 默认值 以前 const props withDefaults(defineProps<{ co…

Windows程序设计10:文件指针及目录的创建与删除

文章目录 前言一、文件指针是什么&#xff1f;二、设置文件指针的位置&#xff1a;随机读写&#xff0c;SetFilePointer函数1.函数说明2.函数实例 三、 目录的创建CreateDirectory四、目录的删除RemoveDirectory总结 前言 Windows程序设计10&#xff1a;文件指针及目录的创建与…

【Linux系统编程】进程间通信(管道:匿名管道、命名管道、实战练习)

知其然&#xff0c;知其所以然 什么是进程间通信&#xff1a; 进程间通信是不同进程间交换信息的一种机制。进程可能在同一台计算机上&#xff0c;也可能在网络中的不同计算机上。那我们为什么要有这种机制&#xff1a; 为什么进程间要通信&#xff1a; ①数据共享&#xff…

K8S ReplicaSet 控制器

一、理论介绍 今天我们来实验 ReplicaSet 控制器&#xff08;也叫工作负载&#xff09;。官网描述如下&#xff1a; 1、是什么&#xff1f; ReplicaSet 副本集&#xff0c; 维护一组稳定的副本 Pod 集合。 2、为什么需要&#xff1f; 解决 pod 被删除了&#xff0c;不能自我恢…

【C语言】自定义类型讲解

文章目录 一、前言二、结构体2.1 概念2.2 定义2.2.1 通常情况下的定义2.2.2 匿名结构体 2.3 结构体的自引用和嵌套2.4 结构体变量的定义与初始化2.5 结构体的内存对齐2.6 结构体传参2.7 结构体实现位段 三、枚举3.1 概念3.2 定义3.3 枚举的优点3.3.1 提高代码的可读性3.3.2 防止…

VUE2双向绑定的原理

文章目录 VUE2双向绑定的原理1. 什么是双向绑定2. 双向绑定的原理2.1 ViewModel的重要作用2.2 双向绑定的流程 3. 双向绑定的实现3.1 data响应化处理3.2 Compile编译3.3 依赖收集 VUE2双向绑定的原理 1. 什么是双向绑定 讲双向绑定先讲单项绑定&#xff0c;啥叫单项绑定&…

入行FPGA设计工程师需要提前学习哪些内容?

FPGA作为一种灵活可编程的硬件平台&#xff0c;广泛应用于嵌入式系统、通信、数据处理等领域。很多人选择转行FPGA设计工程师&#xff0c;但对于新手来说&#xff0c;可能在学习过程中会遇到一些迷茫和困惑。为了帮助大家更好地准备&#xff0c;本文将详细介绍入行FPGA设计工程…

Mac M1 ComfyUI 中 AnyText插件安装问题汇总?

Q1&#xff1a;NameError: name ‘PreTrainedTokenizer’ is not defined ? 该项目最近更新日期为2024年12月&#xff0c;该时间段的transformers 版本由PyPI 上的 transformers 页面 可知为4.47.1. A1: transformers 版本不满足要求&#xff0c;必须降级transformors &#…

深度学习 Pytorch 神经网络的学习

本节将从梯度下降法向外拓展&#xff0c;介绍更常用的优化算法&#xff0c;实现神经网络的学习和迭代。在本节课结束将完整实现一个神经网络训练的全流程。 对于像神经网络这样的复杂模型&#xff0c;可能会有数百个 w w w的存在&#xff0c;同时如果我们使用的是像交叉熵这样…

Java 大视界 -- 深度洞察 Java 大数据安全多方计算的前沿趋势与应用革新(52)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

Docker使用指南(二)——容器相关操作详解(实战案例教学,创建/使用/停止/删除)

目录 1.容器操作相关命令​编辑 案例一&#xff1a; 案例二&#xff1a; 容器常用命令总结&#xff1a; 1.查看容器状态&#xff1a; 2.删除容器&#xff1a; 3.进入容器&#xff1a; 二、Docker基本操作——容器篇 1.容器操作相关命令 下面我们用两个案例来具体实操一…

【C++】STL——list的使用

目录 &#x1f495;1.带头双向链表List &#x1f495;2.list用法介绍 &#x1f495;3.list的初始化 &#x1f495;4.size函数与resize函数 &#x1f495;5.empty函数 &#x1f495;6.front函数与back函数 &#x1f495;7.push_front,push_back,pop_front,pop_back函数…