我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Kubernetes如何实现前后端应用的金丝雀发布

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Kubernetes如何实现前后端应用的金丝雀发布

这篇文章主要讲解了“Kubernetes如何实现前后端应用的金丝雀发布”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Kubernetes如何实现前后端应用的金丝雀发布”吧!

Deployment滚动更新策略实现金丝雀发布

利用Deployment的滚动更新策略maxSurge和maxUnavailable设置最大可超期望的节点数和最大不可用节点数可实现简单的金丝雀发布。
rollingUpdate.maxSurge最大可超期望的节点数,百分比 10% 或者绝对数值 5
rollingUpdate.maxUnavailable最大不可用节点数,百分比或者绝对数值

apiVersion: extensions/v1beta1kind: Deploymentmetadata:    name: demo-deployment    namespace: defaultspec:  replicas: 10  selector:    matchLabels:      name: hello-deployment  strategy:    type: RollingUpdate    rollingUpdate:      maxSurge: 10%      maxUnavailable: 0       template:    metadata:      labels:        name: demo-deployment    spec:      containers:      - name: webserver        image: nginx:1.14        ports:        - containerPort:80

此方案只适合单个应用的金丝雀发布,如果是前后端应用就不合适了,会出现前端正常版本调用后端金丝雀版本,或者前端金丝雀版本调用后端正常版本的情况。于是乎,Pass掉此方案,另寻他路。

2、Ingress-Nginx配置Ingress Annotations实现金丝雀发布

Ingress-Nginx 支持配置 Ingress Annotations 来实现不同场景下的金丝雀发布。Nginx Annotations 支持以下 4 种 Canary 规则:

  • nginx.ingress.kubernetes.io/canary-by-header:基于 Request Header 的流量切分,适用于灰度发布以及 A/B 测试。当 Request Header 设置为 always时,请求将会被一直发送到 Canary 版本;当 Request Header 设置为 never时,请求不会被发送到 Canary 入口;对于任何其他 Header 值,将忽略 Header,并通过优先级将请求与其他金丝雀规则进行优先级的比较。

  • nginx.ingress.kubernetes.io/canary-by-header-value:要匹配的 Request Header 的值,用于通知 Ingress 将请求路由到 Canary Ingress 中指定的服务。当 Request Header 设置为此值时,它将被路由到 Canary 入口。该规则允许用户自定义 Request Header 的值,必须与上一个 annotation (即:canary-by-header)一起使用。

  • nginx.ingress.kubernetes.io/canary-weight:基于服务权重的流量切分,适用于蓝绿部署,权重范围 0 - 100 按百分比将请求路由到 Canary Ingress 中指定的服务。权重为 0 意味着该金丝雀规则不会向 Canary 入口的服务发送任何请求。权重为 100 意味着所有请求都将被发送到 Canary 入口。

  • nginx.ingress.kubernetes.io/canary-by-cookie:基于 Cookie 的流量切分,适用于灰度发布与 A/B 测试。用于通知 Ingress 将请求路由到 Canary Ingress 中指定的服务的cookie。当 cookie 值设置为 always时,它将被路由到 Canary 入口;当 cookie 值设置为 never时,请求不会被发送到 Canary 入口;对于任何其他值,将忽略 cookie 并将请求与其他金丝雀规则进行优先级的比较。

Kubernetes如何实现前后端应用的金丝雀发布

注意:金丝雀规则按优先顺序进行如下排序:
canary-by-header - > canary-by-cookie - > canary-weight
很显然canary-weight也是一种随机策略,也会导致前端正常版本调用后端金丝雀版本的情况,故Pass掉此策略。
canary-by-cookiecanary-by-header-value适合后端金丝雀发布实现,canary-by-cookie适合前端金丝雀发布实现。

apiVersion: extensions/v1beta1kind: Ingressmetadata:  name: demo-canary  annotations:        kubernetes.io/ingress.class: nginx    nginx.ingress.kubernetes.io/canary: "true"    nginx.ingress.kubernetes.io/canary-by-header: "canary"    nginx.ingress.kubernetes.io/canary-by-cookie: "canary"spec:  rules:  - host: demo-api.fulu.com    http:      paths:      - backend:          serviceName: demo-api-canary          servicePort: 80

前端根据用户标签或者手动在浏览器中设置cookie的值canary=always,前端代码如果检测到此cookie,则传递canary=always的请求头到后端,那么就可以实现前端正常版本访问后端正常版本,或者前端金丝雀版本访问后端金丝雀版本,不会出现版本混淆的情况。

2.1 流程

  • 如果是第一次发布,必须是正常版本。

  • 如果发布金丝雀版本,则先检测是否有-canary后缀的ingress、service、deployment,如果有则替换金丝雀版本的镜像,如果没有则创建-canary后缀的ingress、service、deployment。

  • 如果发布正常版本,则先检测是否有-canary后缀的ingress、service、deployment,如果有则先删除它们,再替换正常版本的镜像。

Kubernetes如何实现前后端应用的金丝雀发布

2.2 代码

前端代码改造

以React为例,修改axios请求拦截器,从cookie中获取当前是否访问金丝雀版本,如果是,传递金丝雀版本请求头给后端服务。

import cookie from 'react-cookies'axios.interceptors.request.use(  (config) => {    // 金丝雀版本    const canaryCookie = cookie.load('canary')    if (canaryCookie !== undefined) {      config.headers.canary = canaryCookie}return config  },  (error) => {    return Promise.reject(error)  })

后端代码改造

以.Net为例,通过代理透传canary请求头到其他Api服务

public class CanaryHttpMessageHandler : DelegatingHandler{    private readonly IHttpContextAccessor _httpContextAccessor;    private const string Canary = "canary";    public CanaryHttpMessageHandler(IHttpContextAccessor httpContextAccessor)    {        _httpContextAccessor = httpContextAccessor;    }    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)    {        var headers = _httpContextAccessor?.HttpContext?.Request?.Headers;        if (headers != null && headers.ContainsKey(Canary))        {            // 透传请求头canary            var canary = headers[Canary].ToString() ?? "";            if (!string.IsNullOrWhiteSpace(canary))                request.Headers.TryAddWithoutValidation(Canary, canary);        }        return await base.SendAsync(request, cancellationToken);    }}

前端Chrome测试

使用Chrome浏览器访问前端网站F12,在Console中输入document.cookie='canary =
always'手动设置canary的cookie值。

Kubernetes如何实现前后端应用的金丝雀发布

在Cookies中可以看到设置,此时访问前端网站为灰度版本。

Kubernetes如何实现前后端应用的金丝雀发布

如果删除canary的cookie,此时访问前端网站为正常版本

后端Postman测试

使用Postman访问后端接口,在请求头中输入canary = always。此时访问后端服务为灰度版本。

Kubernetes如何实现前后端应用的金丝雀发布
如果删除canary的请求头,此时访问后端服务为正常版本
Kubernetes如何实现前后端应用的金丝雀发布

感谢各位的阅读,以上就是“Kubernetes如何实现前后端应用的金丝雀发布”的内容了,经过本文的学习后,相信大家对Kubernetes如何实现前后端应用的金丝雀发布这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Kubernetes如何实现前后端应用的金丝雀发布

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Kubernetes如何实现前后端应用的金丝雀发布

这篇文章主要讲解了“Kubernetes如何实现前后端应用的金丝雀发布”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Kubernetes如何实现前后端应用的金丝雀发布”吧!1、Deploym
2023-06-21

前端开发中移动端如何实现自适应布局

这篇文章将为大家详细讲解有关前端开发中移动端如何实现自适应布局,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一. 在HTML的头部加入meta标签在HTML的头部,也就是head标签中增加meta标签,告
2023-06-08

虚拟现实技术在游戏开发中的应用与前景(VR技术如何为游戏开发带来新机遇?)

虚拟现实(VR)技术在游戏开发中创造了沉浸式体验,增强了交互性和情感共鸣。它允许非线性和分支性的故事线,提升叙事可能性。VR还促进了合作和社交体验,为教育和培训提供了逼真的场景。随着硬件进步、内容创新和市场增长,VR技术将在游戏行业带来深远的影响,推动游戏玩法、叙事形式和玩家互动方式的革新。
虚拟现实技术在游戏开发中的应用与前景(VR技术如何为游戏开发带来新机遇?)
2024-04-02

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录