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

news2024/12/27 12:48:20

前言

部署在 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: hello
      color: blue
  replicas: 1
  template:
    metadata:
      labels:
        app: hello
        color: blue
    spec:
      terminationGracePeriodSeconds: 30
      containers:
      - name: hello
        imagePullPolicy: Always
        image: localhost:5001/py-http:1
        ports:
        - containerPort: 8888
        resources:
          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: hello
      color: green
  replicas: 1
  template:
    metadata:
      labels:
        app: hello
        color: green
    spec:
      terminationGracePeriodSeconds: 30
      containers:
      - name: hello
        imagePullPolicy: Always
        image: localhost:5001/py-http:2
        ports:
        - containerPort: 8888
        resources:
          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: blue
  ports:
    - name: web
      port: 8888
      protocol: TCP
      targetPort: 8888
  type: 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: hello
    color: green #如果蓝布切换后,测试失败,可以快速把 color 改为 blue 进行回滚
  ports:
    - name: web
      port: 8888
      protocol: TCP
      targetPort: 8888
  type: ClusterIP

总结

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

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

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

相关文章

自然语言处理在智能客服和聊天机器人中的应用

文章目录 1. 引言2. NLP基础2.1 词法分析2.2 语法分析2.3 语义理解2.4 情感分析 3. 智能客服中的应用3.1 自动问答3.2 意图识别3.3 情感分析与情绪识别 4. 聊天机器人中的应用4.1 对话生成4.2 上下文理解 5. 技术原理与挑战5.1 语言模型5.2 数据质量和多样性5.3 上下文理解 6. …

windows可视化界面管理服务器上的env文件

需求:在 Windows 环境中通过可视化界面编辑位于 Linux 主机上的 env 文件的情况,我现在环境是windows环境,我的env文件在linux的192.168.20.124上,用户是op,密码是op,文件绝对路径是/home/op/compose/env …

pm4py使用指南(非机翻)

目录 1. 日志数据读取及预处理(1)查看case和event数量(2)查看起始事件和结束事件(3)时间戳格式的问题 2. 日志数据过滤3. 流程发现4. 模型转化5. 模型可视化 1. 日志数据读取及预处理 通过 pandas库 读取c…

PyCharm搭建Pytorch环境

💂 个人主页:风间琉璃🤟 版权: 本文由【风间琉璃】原创、在CSDN首发、需要转载请联系博主💬 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)和订阅专栏哦 本文是在anaconda配置好pytorch坏境下,使用PyCharm搭建Pytorch环境。…

vue2 element 踩坑爬坑

动态增减表单项 这个其实官网有demo,但是自己也调试了好久,记录下,具体写法自己查看文档:https://element.eleme.cn/#/zh-CN/component/form 关键地方在于key,新增数组时,要在数据里增加个key,…

免费插件集-illustrator插件-Ai插件-制卡专用分层分色

文章目录 1.介绍2.安装3.通过窗口>扩展>知了插件4.功能解释5.示例6.总结 1.介绍 本文介绍一款免费插件,加强illustrator使用人员工作效率,进行制卡专用分层分色。首先从下载网址下载这款插件 https://download.csdn.net/download/m0_67316550/878…

pandas(一):read_csv解决第一列Unnamed问题

先直接给答案:configdata pd.read_csv(savepath, encodingutf-8, index_col0)。 然后我们展开来说明: 首先下面这个图片是原始csv数据 1、第一列问题 上述图片可以看到,因为csv文件自带第一列序号,如果我们直接用pd.read_csv读…

【Spring】Spring循环依赖(超重要!!)

目录 什么是循环依赖问题 循环依赖具体是怎么解决的 具体的解决步骤: 通俗实例: 严谨的循环依赖解决图例 为什么使用的是三级缓存,二级缓存不够用吗? 什么是循环依赖问题 Spring的循环依赖是指在Bean之间存在相互依赖关…

MinDoc:针对IT团队的文档、笔记系统

作为一名IT从业者,无论是在公司团队中,还是在平时自己写一些笔记、博客等文档,我都习惯使用markdown来进行书写。在使用过许多支持markdown语法的系统或软件(如Typora、未知、我来、思源、觅道等)后,我总觉…

pytestx重新定义接口框架设计

概览 脚手架: 目录: 用例代码: """ 测试登录到下单流程,需要先启动后端服务 """test_data {"查询SKU": {"skuName": "电子书"},"添加购物车": {"sk…

异步I/O优化Python代理程序性能

作为一名爬虫程序员,你是否曾经遇到过需要处理大量网络请求的情况?你是否想要提高你的Python代理程序的性能,让它更快、更高效?别担心,我来给你分享一些关于异步I/O如何优化Python代理程序性能的实用知识。 首先&…

云计算技术应用专业实训室建设方案

一、 云计算技术应用系统概述 云计算技术是一种基于互联网的计算模式,通过将计算资源(如服务器、存储、数据库、网络、软件等)提供为一种服务,使用户能够按需获取和使用这些资源,而无需拥有和管理实际的物理设备。云计…

使用RAMMap+PoolMon分析Windows内存使用异常问题

1 RAMMap和PoolMon工具简介 RAMMap和PoolMon都是微软Sysinternals的工具,前者可以从使用类型、页列表、进程、文件、优先级,以及物理地址来检查内存的使用情况,但是无法检查尚未提交和分页的进程内存使用情况;后者可以是作为RAMM…

使用haproxy搭建web架构

haproxy HAProxy是一个免费的负载均衡软件,可以运行于大部分主流的Linux操作系统上。 HAProxy提供了可以在七层和四层两种负载均衡能力,它可以提供高可用性、负载均衡、及基于TCP和HTTP应用的代理。适用于负载大的Web站点,在运行在硬件上可…

使用 SQLStudio 进行数据库管理并通过 Docker Compose 进行部署

在现代软件开发中,数据库管理是一个至关重要的环节。SQLStudio 是一个强大的工具,可以帮助开发人员轻松管理数据库,现在改名成SQLynx,我们用的是旧的镜像,本文还是用SQLStudio这个名称。同时,使用 Docker C…

Qt双击某一文件通过自己实现的程序打开,并加载文件显示

双击启动 简述方法一方法二注意 简述 在Windows系统中,双击某类扩展名的文件,通过自己实现的程序打开文件,并正确加载及显示文件。有两种方式可以到达这个目的。 对于系统不知道的扩展名的文件,第一次打开时,需要自行…

ModaHub魔搭社区:WinPlan企业经营垂直大模型数据建模(二)

目录 维度模版管理 录入维度数据 经营指标 创建经营指标 经营指标管理 维度模版管理 创建维度后,可在维度库的左侧栏展示全部启用中的维度,你也可以再次编辑维度模版;如不再需要该维度,可停用,停用后可在停用管理里重新启用或删除。 1)停用:维度停用后,不会出现在…

3个方法学会:恢复指定人微信聊天记录

和朋友吵架后一怒之下把她微信删除了,和好之后又想把聊天记录恢复回来。网上很多方法都是直接恢复所有的微信聊天记录,我想问问,可以只恢复这个朋友的聊天记录吗?有什么方法吗? 朋友之间有一些小摩擦、小争吵是很正常的…

MyCAT命令行监控

9066端口 ,用mysql命令行连接 Mysql –utest –ptest –P9066 show help 可显示所有相关管理命令 显示后端物理库连接信息,包括当前连接数,端口 Show backend Show connection 显示当前前端客户端连接情况,已经网络流量信息、…

JavaFX:根据控件内容显示tooltip

如题。当控件为空,没有内容时显示tooltip,反之不显示。示例如下: package ch06;import javafx.application.Application; import javafx.application.Platform; import javafx.beans.value.ObservableValue; import javafx.geometry.VPos; i…