如何在 Kubernetes 中借助 Service 实现灰度发布和蓝绿发布

前言

部署在 Kubernetes 集群中的应用,在升级发布时可能会存在的问题:

1,由于 Kuberneter 底层 Pod 容器生命周期与网络组件生命周期是异步管理的,在升级时如果没有处理好应用优雅退出的问题,就很容易导致 http 访问请求 5xx

2,原生 Deployment 应用的滚动发布功能是一把梭的全量发布模式,没有灰度和分批控制发布的概念,一旦出现问题,故障影响范围就会迅速扩大

这也是为什么需要灰度发布,蓝绿发布,彩虹发布,金丝雀发布、A/B Test等多样化形式发布的重要原因,核心目标只有一个,就是为了确保服务的稳定性,减少或避免因变更带来的不稳定因素

今天我们主要来聊下,如何在不引入第三方插件的情况下,来实现简单的灰度发布和蓝绿发布功能

通过 Service 实现灰度发布和蓝绿发布

在 Kubernetes 里面 Pod 的网络通信都是借助 Service 实现的,Service 的底层是依赖 Iptables 或者 eBPF 加上 dns 技术实现的,具体细节感兴趣可自行探索,这里不在展开,那么我们来看下如何借助 Service 实现灰度发布和蓝绿发布。

灰度发布

依赖资源:1 个 Service 对象,两个 Deployment 对象,一般称为 blue 和 green

原理:每次升级发布都会额外拉起一个 Deployment ,然后通过 Service 的 selector 来绑定 Deployment,通过在旧的 Deployment上缩容一个副本,新的 Deployment 上扩容一个副本类似这样的一缩一扩的方式实现灰度发布。

假设:blue_deployment.yaml 是 v1 版本,注意我们设置了 selector label

apiVersion: apps/v1
kind: Deployment
metadata:name: py-hello-blue
spec:selector:matchLabels:app: hellocolor: bluereplicas: 1template:metadata:labels:app: hellocolor: bluespec:terminationGracePeriodSeconds: 30containers:- name: helloimagePullPolicy: Alwaysimage: localhost:5001/py-http:1ports:- containerPort: 8888resources:requests:memory: "50Mi"limits:memory: "200Mi"lifecycle:preStop:exec:                                                                      command: ["sleep", "5"]# command: ["/usr/bin/tini", "--", "bash", "-c"]command: ["sh", "-c"]args:- |python app.py

现在要灰度升级,我们新建一个 green_deployment.yaml 是 v2 版本,注意也设置了 label 标签:

apiVersion: apps/v1
kind: Deployment
metadata:name: py-hello-green
spec:selector:matchLabels:app: hellocolor: greenreplicas: 1template:metadata:labels:app: hellocolor: greenspec:terminationGracePeriodSeconds: 30containers:- name: helloimagePullPolicy: Alwaysimage: localhost:5001/py-http:2ports:- containerPort: 8888resources:requests:memory: "50Mi"limits:memory: "200Mi"lifecycle:preStop:exec:                                                                      command: ["sleep", "5"]# command: ["/usr/bin/tini", "--", "bash", "-c"]command: ["sh", "-c"]args:- |python app.py

ok,现在我们通过 Service 来绑定流量:

apiVersion: v1
metadata:name: py-hello-service
kind: Service
spec:selector:app: hello#color: green#color: blueports:- name: webport: 8888protocol: TCPtargetPort: 8888type: ClusterIP

在这个 Service 中,我们如果设置 color 标签,则可以把流量全部导入v1 或者 v2,如果我们不设置 color 标签,那么默认会把流量请求在两个 Deployment 中轮询,为了实现灰度发布,我们需要通过缩扩副本来实现:我们例子都只有一个副本,所以灰度起来也很简单:

# blue 旧服务
kubectl scale deployment/py-hello-blue --replicas=1# green 新服务扩容 1,就相当于 50% 流量进来,如果想要 10% 流量,则可以把 bluee 扩容到 9
kubectl scale deployment/py-hello-green --replicas=1

注意这里面的流量调控并不是精准的,只能实现简单的灰度发布

蓝绿发布

接着灰度发布的例子,我们蓝布发布的实现就非常简单了,直接在 Service 里面增加 color 标签为 green 就可以把全部流量切换到新拉起的服务中,当然如果测试失败了,也可以快速进行回滚,同理将 color 改回为 blue 即可

apiVersion: v1
metadata:name: py-hello-service
kind: Service
spec:selector:app: hellocolor: green #如果蓝布切换后,测试失败,可以快速把 color 改为 blue 进行回滚ports:- name: webport: 8888protocol: TCPtargetPort: 8888type: ClusterIP

总结

通过 service 进行灰度发布和蓝绿发布虽然功能比较简单,但是对于大部分普通的发布业务也足够用了,这种方案可以结合发布平台稍做封装,比如一键创建新克隆版本,切换流量,扩缩容等,有了这些基础功能后,使用起来会更加流畅

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

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

相关文章

四川玖璨电子商务有限公司:怎么拉升抖店体验分

抖音是中国最受欢迎的短视频分享平台之一,而在抖音上开设自己的抖店成为许多电商从业者的选择。为了提高抖店的曝光度和用户体验,抖店体验分成为了一个重要的指标。在本文中,小编将从两个方面来讨论怎么拉升抖店体验分,包括影响因…

Flink的Standalone部署实战

在Flink是通用的框架,以混合和匹配的方式支持部署不同场景,而Standalone单机部署方便快速部署,记录本地部署过程,方便备查。 环境要求 1)JDK1.8及以上 2)flink-1.14.3 3)CentOS7 Flink相关信…

第 7 章 排序算法(4)(插入排序)

7.7插入排序 7.7.1插入排序法介绍: 插入式排序属于内部排序法,是对于欲排序的元素以插入的方式找寻该元素的适当位置,以达到排序的目的。 7.7.2插入排序法思想: 插入排序(Insertion Sorting)的基本思想是:把n个待排…

app版本号比对

package com.zyy.user.api.helper;import com.zyy.framework.model.dto.result.ResultEnum; import com.zyy.framework.model.exception.BusinessException; import lombok.Builder; import lombok.Data;import javax.validation.constraints.NotNull;/*** APP版本比较工具*/ p…

点云平面拟合和球面拟合

一、介绍 In this tutorial we learn how to use a RandomSampleConsensus with a plane model to obtain the cloud fitting to this model. 二、代码 #include <iostream> #include <thread> #include <pcl/point_types.h> #include <pcl/common/io.…

Android GreenDao数据库升级(附Demo)

前言 大家好久不见&#xff0c;一转眼马上八月份下旬了&#xff0c;最近由于工作比较忙&#xff0c;没时间给大家更新博文。百忙之中抽出时间&#xff0c;给大家来更新一篇关于GreenDao3数据库的升级。 关于GreenDao的详细介绍以及一些逻辑性的增、删、改、查等&#xff0c;可以…

Nevron Open Vision for .NET Crack

Nevron Open Vision for .NET Crack NET Vision是一个用于生成具有数据可视化功能的强大数据表示应用程序的包。该套件具有用于.NET的Nevron Chart、用于.NET的Nevron Diagram和用于.NET的Nevron User Interface。精心设计的对象模型、许多功能和卓越的演示使复杂数据的可视化变…

【Git起步】初次安装和配置

1.什么是版本控制 版本控制系统&#xff08;VCS&#xff09;是一种记录文件内容变化以便将来查阅特定版本修订情况的系统。 使用版本控制系统在出错时、需要时可以回溯。 2.Git简介 Git是一个分布式版本控制系统&#xff0c;用于跟踪和管理代码的变更历史。 它允许开发者在…

git操作:将一个仓库的分支提交到另外一个仓库分支

这个操作&#xff0c;一般是同步不同网站的同个仓库&#xff0c;比如说gitee 和github。某个网站更新了&#xff0c;你想同步他的分支过来。然后基于分支开发或者其它。 操作步骤 1.本地先clone 你自己的仓库。也就是要push 分支的仓库。比如A仓库&#xff0c;把B仓库分支&am…

分类预测 | MATLAB实现S4VM半监督支持向量机二分类预测

分类预测 | MATLAB实现S4VM半监督支持向量机二分类预测 目录 分类预测 | MATLAB实现S4VM半监督支持向量机二分类预测分类效果基本介绍程序设计参考资料 分类效果 基本介绍 分类预测 | MATLAB实现S4VM半监督支持向量机二分类预测 程序设计 完整源码和数据获取方式&#xff1a; …

使用端口映射实现Spring Boot服务端接口的公网远程调试:详细配置与步骤解析

文章目录 前言1. 本地环境搭建1.1 环境参数1.2 搭建springboot服务项目 2. 内网穿透2.1 安装配置cpolar内网穿透2.1.1 windows系统2.1.2 linux系统 2.2 创建隧道映射本地端口2.3 测试公网地址 3. 固定公网地址3.1 保留一个二级子域名3.2 配置二级子域名3.2 测试使用固定公网地址…

解决npm安装依赖失败,node和node-sass版本不匹配的问题

npm安装依赖报错&#xff1a; npm ERR! cb() never called! npm ERR! This is an error with npm itself. 一. 问题描述 用npm安装依赖报错&#xff1a; npm ERR! cb() never called! npm ERR! This is an error with npm itself. Please report this error at: npm ERR! …

【数据结构】C语言实现栈(详细解读)

前言: &#x1f4a5;&#x1f388;个人主页:​​​​​​Dream_Chaser&#xff5e; &#x1f388;&#x1f4a5; ✨✨专栏:http://t.csdn.cn/oXkBa ⛳⛳本篇内容:c语言数据结构--C语言实现栈 目录 什么是栈 栈的概念及结构 实现栈的方式 链表的优缺点: 顺序表的优缺点: 栈…

深度学习中数据处理相关的技巧

文章目录 提取隐蔽特征惰性加载数据集类别分布不均衡 提取隐蔽特征 在某些任务中&#xff0c;一些类别的特征可能相对较为罕见或难以捕捉。由于这些特征在数据集中出现的频率较低&#xff0c;模型可能无法充分学习它们&#xff0c;从而导致对这些类别的辨别能力较弱。为了解决…

CSS打字回删效果动画源码

<!DOCTYPE html> <html lang="en"> <head><meta charset

深入探索快速排序:高效分而治之的算法

1. 引言&#xff1a;快速排序的背景与重要性 快速排序&#xff08;Quick Sort&#xff09;是一种高效的排序算法&#xff0c;以其出色的性能和普适性而受到广泛关注。它利用了分而治之的思想&#xff0c;通过将数组分割成较小的子数组&#xff0c;并将这些子数组分别排序来实现…

pytorch基于ray和accelerate实现多GPU数据并行的模型加速训练

在pytorch的DDP原生代码使用的基础上&#xff0c;ray和accelerate两个库对于pytorch并行训练的代码使用做了更加友好的封装。 以下为极简的代码示例。 ray ray.py #codingutf-8 import os import sys import time import numpy as np import torch from torch import nn im…

使用 Amazon Redshift Serverless 和 Toucan 构建数据故事应用程序

这是由 Toucan 的解决方案工程师 Django Bouchez与亚马逊云科技共同撰写的特约文章。 带有控制面板、报告和分析的商业智能&#xff08;BI&#xff0c;Business Intelligence&#xff09;仍是最受欢迎的数据和分析使用场景之一。它为业务分析师和经理提供企业的过去状态和当前状…

MQ消息队列(主要介绍RabbitMQ)

消息队列概念&#xff1a;是在消息的传输过程中保存消息的容器。 作用&#xff1a;异步处理、应用解耦、流量控制..... RabbitMQ&#xff1a; SpringBoot继承RabbitMQ步骤&#xff1a; 1.加入依赖 <dependency><groupId>org.springframework.boot</groupId&g…

隧道HTTP具备的条件

作为一名专业的爬虫代理供应商&#xff0c;我们都知道使用代理是保证爬虫的高效性和稳定性的重要手段之一。而隧道代理则是近年来备受推崇的一种代理形式&#xff0c;它通过将请求通过隧道传输&#xff0c;可以有效地隐藏爬虫的真实IP地址&#xff0c;提高爬虫的反爬能力。 在…