k8s通过service标签实现蓝绿发布

k8s通过service标签实现蓝绿发布

    • 通过`k8s service label`标签实现`蓝绿发布`
    • 方法1:使用kubelet完成蓝绿切换
      • 1. 创建绿色版本
        • 1.1 创建绿色版本 Deployment
        • 1.2 创建绿色版本 Service
      • 2. 创建蓝色版本
        • 2.1 创建蓝色版本 Deployment
        • 2.2 创建蓝色版本 Service
      • 3. 创建`蓝绿切换SVC` (用于外部访问)
      • 4. 创建 Ingress
      • 5. 切换蓝绿版本
        • 5.1 将 `app-svc` 指向绿色版本:
        • 5.2 将 `app-svc` 切换到蓝色版本:
      • 总结
    • 方法2:k8s 蓝绿yaml 配置
      • `service.yaml` 文件
      • `deploy.yaml` 文件
        • 蓝`v1-deploy.yaml` 文件
        • 绿`v2-deploy.yaml`文件
      • 部署与测试
        • 测试流量是否到v1版本
        • 切换入口流量从v1 到 v2
        • 测试流量是否到v2版本

通过k8s service label标签实现蓝绿发布

  • 两个版本deploysvc,
  • svc版本标签,
  • 然后选择Service Label标签对应的deploy版本

方法1:使用kubelet完成蓝绿切换

在 Kubernetes 中,使用 kubectl 命令完成蓝绿部署.


1. 创建绿色版本


1.1 创建绿色版本 Deployment
# 创建一个名为 "yewu-app-green-deploy" 的 Deployment
kubectl create deployment yewu-app-green-deploy \--image=yewu-app:v2  # 使用镜像 "yewu-app:v2" 部署应用

1.2 创建绿色版本 Service
# 将名为 "yewu-app-green-deploy" 的 Deployment 暴露为一个 Service
## port是service的端口
## --target-port是pod(中的容器)的端口
## --type 指定Service 的类型为ClusterIP,用于通过节点的IP和指定端口访问服务
## --name=green-svc 指定 Service 的名称为 "green-svc"
## --save-config 保存当前命令的配置到资源的注解中,便于后续管理
kubectl expose deployment yewu-app-green-deploy --type=ClusterIP --name=green-svc --port=80 --target-port=8080 --save-config

2. 创建蓝色版本


2.1 创建蓝色版本 Deployment
# 创建一个名为 "yewu-app-blue-deploy" 的 Deployment
kubectl create deployment yewu-app-blue-deploy \--image=yewu-app:v1  # 使用镜像 "yewu-app:v1" 部署应用

2.2 创建蓝色版本 Service
# 将名为 "yewu-app-blue-deploy" 的 Deployment 暴露为一个 Service
## port是service的端口
## --target-port是pod(中的容器)的端口
## --type 指定Service 的类型为ClusterIP,用于通过节点的IP和指定端口访问服务
## --name=blue-svc 指定 Service 的名称为 "blue-svc"
## --save-config 保存当前命令的配置到资源的注解中,便于后续管理
kubectl expose deployment yewu-app-blue-deploy --type=ClusterIP --name=blue-svc --port=80 --target-port=8080 --save-config

3. 创建蓝绿切换SVC (用于外部访问)

创建一个外部 Service,用于切换蓝绿版本:

# 创建一个 ClusterIP 类型的 Service,名称为 "app-svc"
kubectl create service clusterip app-svc \--tcp=80:80  # 将 Service 的端口 80 映射到后端 Pod 的端口 80

4. 创建 Ingress

创建 Ingress 资源以暴露服务:

# 使用 kubectl 创建一个 Ingress 资源
kubectl create ingress app-ingress \--rule="your-domain.com/*=app-svc:80"# --rule 参数定义了 Ingress 的规则:# - your-domain.com 是主机名# - /* 表示匹配所有路径# - app-svc:80 表示将流量转发到名为 app-svc 的 Service 的 80 端口

5. 切换蓝绿版本


5.1 将 app-svc 指向绿色版本:
# 更新名为 "app-svc" 的 Service 的 selector,使其指向绿色版本的 Deployment
kubectl patch svc app-svc \-p '{"spec":{"selector":{"app":"yewu-app-green-deploy"}}}'# -p 参数指定了一个 JSON 格式的部分更新内容# 将 Service 的 selector 更新为匹配标签 "app=yewu-app-green-deploy"

5.2 将 app-svc 切换到蓝色版本:
# 更新名为 "app-svc" 的 Service 的 selector,使其指向蓝色版本的 Deployment
kubectl patch svc app-svc \-p '{"spec":{"selector":{"app":"yewu-app-blue-deploy"}}}'# -p 参数指定了一个 JSON 格式的部分更新内容# 将 Service 的 selector 更新为匹配标签 "app=yewu-app-blue-deploy"

总结

先完成蓝绿部署,然后通过修改 app-svcselector 来切换流量。


方法2:k8s 蓝绿yaml 配置


service.yaml 文件

# 定义 API 版本为 v1
apiVersion: v1
# 定义资源类型为 Service
kind: Service
# 定义 Service 的元数据
metadata:# 定义 Service 的名称为 demoname: demo# 定义 Service 所在的命名空间为 defaultnamespace: default# 定义 Service 的标签,app 标签值为 demolabels:app: demo
# 定义 Service 的规格
spec:# 定义 Service 的端口配置ports:# 定义一个端口配置- # 定义端口为 80port: 80# 定义目标端口为 httptargetPort: http# 定义协议为 TCPprotocol: TCP# 定义端口名称为 httpname: http# 注意这里我们匹配 app 和 version 标签,当要切换流量的时候,我们更新 version 标签的值,比如:v2# 定义 Service 的选择器selector:# 定义选择器的 app 标签值为 demoapp: demo# 定义选择器的 version 标签值为 v1version: v1

deploy.yaml 文件


v1-deploy.yaml 文件
# 定义 API 版本为 apps/v1
apiVersion: apps/v1
# 定义资源类型为 Deployment
kind: Deployment
# 定义 Deployment 的元数据
metadata:# 定义 Deployment 的名称为 demo1-deploymentname: demo1-deployment# 定义 Deployment 所在的命名空间为 defaultnamespace: default# 定义 Deployment 的标签,app 标签值为 demolabels:# 定义 app 标签值为 demoapp: demo# 定义 version 标签值为 v1version: v1
# 定义 Deployment 的规格
spec:# 定义副本数量为 1replicas: 1# 定义修订历史限制为 3revisionHistoryLimit: 3# 定义更新策略strategy:# 定义滚动更新策略rollingUpdate:# 定义最大 surge 百分比为 30%maxSurge: 30%# 定义最大不可用百分比为 30%maxUnavailable: 30%# 定义选择器selector:# 定义选择器的标签匹配规则matchLabels:# 定义 app 标签值为 demoapp: demo# 定义 version 标签值为 v1version: v1# 定义 Pod 模板template:# 定义 Pod 的元数据metadata:# 定义 Pod 的标签labels:# 定义 app 标签值为 demoapp: demo# 定义 version 标签值为 v1version: v1# 定义 Pod 的规格spec:# 定义容器列表containers:# 定义一个容器- # 定义容器名称为 demo1name: demo1# 定义容器使用的镜像为 mritd/demoimage: mritd/demo# 定义存活探针livenessProbe:# 定义 HTTP GET 请求httpGet:# 定义请求路径为 /path: /# 定义请求端口为 80port: 80# 定义请求协议为 HTTPscheme: HTTP# 定义初始延迟秒数为 30initialDelaySeconds: 30# 定义超时秒数为 5timeoutSeconds: 5# 定义周期秒数为 30periodSeconds: 30# 定义成功阈值为 1successThreshold: 1# 定义失败阈值为 5failureThreshold: 5# 定义就绪探针readinessProbe:# 定义 HTTP GET 请求httpGet:# 定义请求路径为 /path: /# 定义请求端口为 80port: 80# 定义请求协议为 HTTPscheme: HTTP# 定义初始延迟秒数为 30initialDelaySeconds: 30# 定义超时秒数为 5timeoutSeconds: 5# 定义周期秒数为 10periodSeconds: 10# 定义成功阈值为 1successThreshold: 1# 定义失败阈值为 5failureThreshold: 5# 定义容器端口列表ports:# 定义一个端口- # 定义端口名称为 httpname: http# 定义容器端口为 80containerPort: 80# 定义协议为 TCPprotocol: TCP

绿v2-deploy.yaml文件
# 定义 API 版本为 apps/v1
apiVersion: apps/v1
# 定义资源类型为 Deployment
kind: Deployment
# 定义 Deployment 的元数据
metadata:# 定义 Deployment 的名称为 demo1-deploymentname: demo1-deployment# 定义 Deployment 所在的命名空间为 defaultnamespace: default# 定义 Deployment 的标签,app 标签值为 demolabels:# 定义 app 标签值为 demoapp: demo# 定义 version 标签值为 v1version: v1
# 定义 Deployment 的规格
spec:# 定义副本数量为 1replicas: 1# 定义修订历史限制为 3revisionHistoryLimit: 3# 定义更新策略strategy:# 定义滚动更新策略rollingUpdate:# 定义最大 surge 百分比为 30%maxSurge: 30%# 定义最大不可用百分比为 30%maxUnavailable: 30%# 定义选择器selector:# 定义选择器的标签匹配规则matchLabels:# 定义 app 标签值为 demoapp: demo# 定义 version 标签值为 v1version: v1# 定义 Pod 模板template:# 定义 Pod 的元数据metadata:# 定义 Pod 的标签labels:# 定义 app 标签值为 demoapp: demo# 定义 version 标签值为 v1version: v1# 定义 Pod 的规格spec:# 定义容器列表containers:# 定义一个容器- # 定义容器名称为 demo1name: demo1# 定义容器使用的镜像为 mritd/demoimage: mritd/demo# 定义存活探针livenessProbe:# 定义 HTTP GET 请求httpGet:# 定义请求路径为 /path: /# 定义请求端口为 80port: 80# 定义请求协议为 HTTPscheme: HTTP# 定义初始延迟秒数为 30initialDelaySeconds: 30# 定义超时秒数为 5timeoutSeconds: 5# 定义周期秒数为 30periodSeconds: 30# 定义成功阈值为 1successThreshold: 1# 定义失败阈值为 5failureThreshold: 5# 定义就绪探针readinessProbe:# 定义 HTTP GET 请求httpGet:# 定义请求路径为 /path: /# 定义请求端口为 80port: 80# 定义请求协议为 HTTPscheme: HTTP# 定义初始延迟秒数为 30initialDelaySeconds: 30# 定义超时秒数为 5timeoutSeconds: 5# 定义周期秒数为 10periodSeconds: 10# 定义成功阈值为 1successThreshold: 1# 定义失败阈值为 5failureThreshold: 5# 定义容器端口列表ports:# 定义一个端口- # 定义端口名称为 httpname: http# 定义容器端口为 80containerPort: 80# 定义协议为 TCPprotocol: TCP
  • 上面定义的资源对象中,最重要的就是Service 中 label selector的定义:
  selector:app: demoversion: v1

部署与测试

  • 部署v1 v2 deploy服务 和 service服务
# 使用 kubectl 工具应用多个 YAML 配置文件
# -f service.yaml: 应用服务配置文件
# -f v1-deploy.yaml: 应用版本1的部署配置文件
# -f v2-deploy.yaml: 应用版本2的部署配置文件
kubectl apply -f service.yaml -f v1-deploy.yaml -f v2-deploy.yaml

测试流量是否到v1版本
# 登陆任意一个pod,向 demo service 发起请求
while sleep 0.3; do curl http://demo; done# 输出日志
Host: demo1-deployment-b5bd596d8-dw27b, Version: v1
Host: demo1-deployment-b5bd596d8-dw27b, Version: v1

切换入口流量从v1 到 v2
# 使用 kubectl 工具更新服务的配置
# patch service demo: 对名为 demo 的服务进行补丁操作
# -p '{"spec":{"selector":{"version":"v2"}}}': 指定补丁内容,将服务的选择器更新为 version=v2
kubectl patch service demo -p '{"spec":{"selector":{"version":"v2"}}}'

测试流量是否到v2版本
# 登陆任意一个pod,向 demo service 发起请求
while sleep 0.3; do curl http://demo; done# 输出日志
Host: demo2-deployment-b5bd596d8-dw27b, Version: v2
Host: demo2-deployment-b5bd596d8-dw27b, Version: v2

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

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

相关文章

智慧酒店企业站官网-前端静态网站模板【前端练习项目】

最近又写了一个静态网站,智慧酒店宣传官网。 使用的技术 html css js 。 特别适合编程学习者进行网页制作和前端开发的实践。 项目包含七个核心模块:首页、整体解决方案、优势、全国案例、行业观点、合作加盟、关于我们。 通过该项目,小伙伴们…

Epplus 8+ 许可证设置

Epplus 8 之后非商业许可证的设置变了如果还用普通的方法会报错 Unhandled exception. OfficeOpenXml.LicenseContextPropertyObsoleteException: Please use the static ‘ExcelPackage.License’ property to set the required license information from EPPlus 8 and later …

CST1016.基于Spring Boot+Vue高校竞赛管理系统

计算机/JAVA毕业设计 【CST1016.基于Spring BootVue高校竞赛管理系统】 【项目介绍】 高校竞赛管理系统,基于 DeepSeek Spring AI Spring Boot Vue 实现,功能丰富、界面精美 【业务模块】 系统共有两类用户,分别是学生用户和管理员用户&a…

2025年第十六届蓝桥杯省赛C++ 研究生组真题

2025年第十六届蓝桥杯省赛C 研究生组真题 1.说明2.题目A:数位倍数(5分)3.题目B:IPv6(5分)4.题目C:变换数组(10分)5.题目D:最大数字(10分&#xff…

空调开机启动后发出噼里啪啦的异响分析与解决

背景 当空调使用时由于制冷或制热运转时(关机后可能也会出现),塑料件热胀冷缩引起,可能会出现“咔咔”的声音;空调冷媒在空调内管路流动时会出现轻微的“沙沙”的声音;也有可能是新装的空调摆风轴出现响声…

BERT、T5、ViT 和 GPT-3 架构概述及代表性应用

BERT、T5、ViT 和 GPT-3 架构概述 1. BERT(Bidirectional Encoder Representations from Transformers) 架构特点 基于 Transformer 编码器:BERT 使用多层双向 Transformer 编码器,能够同时捕捉输入序列中每个词的左右上下文信息…

选导师原理

总述 一句话总结:是雷一定要避,好的一定要抢。方向契合最好,不契合适当取舍。 首先明确自身需求: 我要学东西!青年导师,好沟通,有冲劲,高压力。 我要摆烂!中老年男性教…

【过程控制系统】PID算式实现,控制系统分类,工程应用中控制系统应该注意的问题

目录 1-1 试简述过程控制的发展概况及各个阶段的主要特点。 1-2 与其它自动控制相比,过程控制有哪些优点?为什么说过程控制的控制过程多属慢过程? 1-3 什么是过程控制系统,其基本分类是什么? 1-4 何为集散控制系统…

2025年第十六届蓝桥杯省赛真题解析 Java B组(简单经验分享)

之前一年拿了国二后&#xff0c;基本就没刷过题了&#xff0c;实力掉了好多&#xff0c;这次参赛只是为了学校的加分水水而已&#xff0c;希望能拿个省三吧 >_< 目录 1. 逃离高塔思路代码 2. 消失的蓝宝思路代码 3. 电池分组思路代码 4. 魔法科考试思路代码 5. 爆破思路…

JAVA EE_文件操作和IO

人们大多数时候的焦虑&#xff0c;大概是太想要一个那不确定的答案了吧。 一一 陳長生. 1.认识文件 现实中&#xff0c;我们把一张一张有内容的纸整合在一起称为文件&#xff0c;计算机中&#xff0c;通过硬盘这种I/O设备进行数据保存时&#xff0c;它会独立成一个一个的单位保…

UNITY 屏幕UI自适应

1.主要就是根据屏幕的选择根据尺寸 和UI的锚点和中心点来选择&#xff0c;也可以通过代码来动态修改 2.参考视频&#xff1a;Unity UGUI屏幕自适应看这个就够了_哔哩哔哩_bilibili

05-RabbitMQ 面试题-mk

文章目录 1.RabbitMQ 核心组件及功能详解2.RabbitMQ-如何保证消息不丢失?3.RabbitMQ消息的重复消费问题如何解决的?4.RabbitMQ中死信交换机 ? (RabbitMQ延迟队列有了解过嘛)5.RabbitMQ如果有100万消息堆积在MQ , 如何解决(消息堆积怎么解决)6.RabbitMQ的高可用机制有了解过嘛…

产品需求设计评审会:三步精准定位需求核心

“不谋全局者&#xff0c;不足谋一域&#xff1b;不谋万世者&#xff0c;不足谋一时。”——陈澹然 强调了从全局和长远的角度去谋划事情的重要性&#xff0c;与产品设计中先从宏观层面定位需求&#xff0c;而不是陷入细节的理念相契合。 今日清晨&#xff0c;我参加了一场产品…

java中常用的集合 - 面试篇

HashMap 一、基础常量以及结构 //数组默认初始容量static final int DEFAULT_INITIAL_CAPACITY 1 << 4; // aka 16//数组容量最大值static final int MAXIMUM_CAPACITY 1 << 30;//默认扩容因子static final float DEFAULT_LOAD_FACTOR 0.75f;//链表长度阈值 树…

PDF解析示例代码学习

以下是结合多种技术实现的PDF解析详细示例&#xff08;Python实现&#xff09;&#xff0c;涵盖文本、表格和扫描件处理场景&#xff1a; 一、环境准备与依赖安装 # 核心依赖库 pip install pdfplumber tabula-py pytesseract opencv-python mysql-connector-python 二、完整…

Docker容器网络与NAT

一、背景 之前分享关于NAT网络地址转换的相关文章&#xff0c;docker中的网络正好使用到了NAT&#xff0c;顺带着把这个分享一下&#xff0c;分析docker容器的网络数据包流出、数据流入原理分析。 知识回顾: docker运行一个容器之后&#xff0c;会给这个容器一个独立的netns网络…

Spring Boot 热部署详解,包含详细的配置项说明

Spring Boot 热部署详解 1. 热部署简介 热部署&#xff08;Hot Deployment&#xff09;允许在应用运行时修改代码或配置文件&#xff0c;无需重启应用即可使更改生效。Spring Boot 通过 spring-boot-devtools 模块实现这一功能&#xff0c;其核心依赖于 LiveReload 技术和自动…

详细解读 box-sizing: border-box;

代码解读 * {box-sizing: border-box; } 解释&#xff1a; * - 这是CSS的通用选择器&#xff0c;表示匹配文档中的所有元素 box-sizing: border-box; - 设置元素的盒模型计算方式为border-box 盒模型说明&#xff1a; 默认情况下&#xff0c;CSS使用content-box盒模型&…

《一文讲透》第7期:KWDB 巧用标签与索引优化查询性能

引言 在工业物联网快速发展的今天&#xff0c;各类智能传感器设备已广泛应用于智能制造、能源电力、智慧城市等关键领域。这些设备以极高的采样频率持续产生监测数据&#xff0c;使得单条产线每秒产生数十万条传感器数据已成为行业常态&#xff0c;这对数据存储系统的写入吞吐…

哈希扩展——一致性哈希

目录 一、什么是一致性哈希 二、一致性哈希原理 2.1 hash 环 三、服务器扩容场景 3.1 服务器增加 3.2 服务器减少 3.3 使用虚拟节点 四、 一致性哈希的使用场景 一、什么是一致性哈希 一致性哈希是一种哈希算法&#xff0c;用于将数据分布到不同的节点或存储区域&…