千家信息网

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

发表于:2025-11-09 作者:千家信息网编辑
千家信息网最后更新 2025年11月09日,这篇文章主要讲解了"Kubernetes如何实现前后端应用的金丝雀发布",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Kubernetes如何实现前后端
千家信息网最后更新 2025年11月09日Kubernetes如何实现前后端应用的金丝雀发布

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

1、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 并将请求与其他金丝雀规则进行优先级的比较。

注意:金丝雀规则按优先顺序进行如下排序:
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,如果有则先删除它们,再替换正常版本的镜像。

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 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中输入[xss_clean]='canary =
always'手动设置canary的cookie值。

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

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

后端Postman测试

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


如果删除canary的请求头,此时访问后端服务为正常版本

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

金丝 金丝雀 版本 前端 服务 应用 入口 规则 路由 最大 代码 情况 权重 灰度 点数 策略 测试 中指 优先级 后缀 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 路客互联网科技有限公司 冬奥会网络安全重保项目经受住 等保软件开发标准 网络安全筑牢国家安全防线 买排版软件开发需要注意什么 深信网络技术基础课有哪些 抹掉所有内容无法连接服务器 青少年网络安全知识题多选题 计算机网络技术考研题 铁路局网络安全管理办法 网络安全纳入体系的会议纪要 对软件开发业务逻辑精通 重庆戴尔服务器维修云主机 带服务器的单机游戏能修改吗 盘州网络安全系统怎么做 爱宸网络技术有限公司 计算机软件开发用途 武汉中外合资科技互联网 山西ntp校时服务器云主机 梦幻西游春晚服务器能干什么 杭州 软件开发 交流会 网络安全问题儿童舞蹈 佛山市响当当网络技术 电脑服务器和虚拟主机有什么区别 coc 数据库 怎样创建dsn数据库 彩信服务器 数据库防火墙厂家 宁波工业网络技术电话 2019网络安全技术大会
0