本篇已加入《.NET Core on K8S学习实践系列文章索引》,可以点击查看更多容器化技术相关系列文章。

之前一篇介绍了Ingress的基本概念和Nginx Ingress的基本配置和使用,本篇继续Ingress的使用,来看看如何使用Ingress实现灰度发布(金丝雀发布)。此外,我也有录制一个10min+的小视频介绍蓝绿发布和金丝雀发布的基本概念,视频入口点击这里

一、准备工作

1.1 WebAPI项目准备

  首先,我们还是准备两个版本的ASP.NET Core WebAPI项目,具体项目代码参见这里

  他们之间的差别在于一个接口的返回JSON数据,比如V1.0版本中返回的是Version: 1.0,而V1.1版本中返回的是Version:1.1。

    [Route("api/[controller]")]
[ApiController]
public class HomeController : ControllerBase
{
// GET api/home
[HttpGet]
public ActionResult<IEnumerable<string>> Get()
{
return new string[] {
"Hello, welcome to EDC's demo. Version: 1.0"
};
}
}

  运行结果为:

  (2)将此项目各个版本根据Dockerfile打成镜像,分别是xilife/canary-api-demo:1.0,1.1。

  (3)将本地镜像push到远程镜像仓库,这里我传送到了docker hub的一个公共仓库里边:

docker push xilife/canary-api-demo:1.0
docker push xilife/canary-api-demo:1.1

1.2 WebAPI项目部署

  其次,我们将这两个WebAPI项目部署到K8s集群中,还是通过熟悉的yaml文件来将其部署为Service:

  (1)V1.0版本(假设为线上版本)

apiVersion: apps/v1
kind: Deployment
metadata:
name: canary-api-demo
namespace: xdp-poc
labels:
name: canary-api-demo
spec:
replicas:
selector:
matchLabels:
name: canary-api-demo
template:
metadata:
labels:
name: canary-api-demo
spec:
containers:
- name: canary-api-demo
image: xilife/canary-api-demo:1.0
ports:
- containerPort:
imagePullPolicy: IfNotPresent --- kind: Service
apiVersion: v1
metadata:
name: canary-api-svc
namespace: xdp-poc
spec:
type: NodePort
ports:
- port:
targetPort:
selector:
name: canary-api-demo

  (2)V1.1版本(假设为灰度版本)

apiVersion: apps/v1
kind: Deployment
metadata:
name: canary-api-demo-gray
namespace: xdp-poc
labels:
name: canary-api-demo-gray
spec:
replicas:
selector:
matchLabels:
name: canary-api-demo-gray
template:
metadata:
labels:
name: canary-api-demo-gray
spec:
containers:
- name: canary-api-demo-gray
image: xilife/canary-api-demo:1.1
ports:
- containerPort:
imagePullPolicy: IfNotPresent --- kind: Service
apiVersion: v1
metadata:
name: canary-api-svc-gray
namespace: xdp-poc
spec:
type: NodePort
ports:
- port:
targetPort:
selector:
name: canary-api-demo-gray

  将这两个应用部署至K8s集群:

kubectl apply -f deploy-canary-api-svc.yml
kubectl apply -f deploy-canary-api-gray-svc.yml

二、Ingress灰度发布应用

  Ingress-Nginx 支持配置 Ingress Annotations 来实现不同场景下的灰度发布和测试,可以满足金丝雀发布、蓝绿部署与 A/B 测试等业务场景。

  因此我们准备两个版本的Ingress的yml文件,它提供了两种方式:

  一是基于用户请求的流量切分,具体又包括了基于Request Header的流量切分与基于Cookie的流量切分两种方式;如下图所示:

  二是基于服务权重的流量切分;如下图所示:

2.1 基于Request Header的流量切分方式

  根据Request Header的流量切分方式的约定,适用于灰度发布及A/B测试。当 Request Header 设置为 always时,请求将会被一直发送到 Canary 版本;当 Request Header 设置为 never时,请求不会被发送到 Canary 入口;对于任何其他 Header 值,将忽略 Header,并通过优先级将请求与其他金丝雀规则进行优先级的比较。

  为1.0版本准备一个Ingress,让它先工作着:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: nginx-ingress
namespace: xdp-poc
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/rewrite-target: /api/$
spec:
rules:
- host: portal.k8s.xi-life.cn
http:
paths:
- path: /api(/|$)(.*)
backend:
serviceName: canary-api-svc
servicePort:

  应用至K8s集群:

kubectl apply -f ingress-nginx.yaml

  再为1.1版本准备一个Ingress,让它作为灰度版本的入口逐步替换原v1版本的流量接入:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: nginx-ingress-gray
namespace: xdp-poc
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/rewrite-target: /api/$
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-by-header: "canary"
nginx.ingress.kubernetes.io/canary-by-header-value: "true"
spec:
rules:
- host: portal.k8s.xi-life.cn
http:
paths:
- path: /api(/|$)(.*)
backend:
serviceName: canary-api-svc-gray
servicePort:

  应用至K8s集群:

kubectl apply -f ingress-nginx-gray.yaml

  快速验证:

2.2 基于Cookie的流量切分方式

  根据基于 Cookie 的流量切分方式的约定,当 Cookie 值设置为 always时,它将被路由到 Canary 入口;当 Cookie 值设置为 never时,请求不会被发送到 Canary 入口;对于任何其他值,将忽略 Cookie 并将请求与其他金丝雀规则进行优先级的比较。

  为灰度版本准备Ingress:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: nginx-ingress-gray
namespace: xdp-poc
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/proxy-body-size: "100m"
nginx.ingress.kubernetes.io/limit-rps: ''
nginx.ingress.kubernetes.io/rewrite-target: /api/$
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-by-cookie: "xdp-v2-cookie"
spec:
rules:
- host: portal.k8s.xi-life.cn
http:
paths:
- path: /api(/|$)(.*)
backend:
serviceName: canary-api-svc-gray
servicePort:

  应用至K8s集群:

kubectl apply -f ingress-nginx-gray.yaml

  快速验证:

  (1)未添加Cookie

  (2)为要访问的域名添加一个Cookie

  (3)再次请求验证

2.3 基于服务权重的流量切分方式

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

  为灰度版本准备Ingress:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: nginx-ingress-gray
namespace: xdp-poc
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/proxy-body-size: "100m"
nginx.ingress.kubernetes.io/limit-rps: ''
nginx.ingress.kubernetes.io/rewrite-target: /api/$
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-weight: ""
spec:
rules:
- host: portal.k8s.xi-life.cn
http:
paths:
- path: /api(/|$)(.*)
backend:
serviceName: canary-api-svc-gray
servicePort:

  应用至K8s集群:

kubectl apply -f ingress-nginx-gray.yaml

  快速验证:这里我直接通过浏览器来测试,需要注意的是这里的50%是一个近似分布值,可能实际中不会太精确。

三、三种方式的对比

  Nginx Ingress提供的三种灰度发布的方式的优先级顺序为:
canary-by-header -> canary-by-cookie -> canary-weight
  已知限制:
  (1)Ingress-Nginx是在0.21.0版本中才引入的Canary功能,因此建议确保版本在0.22.0及之后(据说0.21.0版本的基于Cookie方式有点问题);
  (2)目前每个Ingress规则中最多只能应用一个canary入口

四、小结

  本文介绍了Nginx Ingress提供的三种灰度发布(canary)的方式,然后介绍了如何使用Nginx Ingress并进行配置实现ASP.NET Core WebAPI应用服务的灰度发布实践,最后对比三种方式的优先级及限制,希望对你有所帮助。

参考资料

(1)JadePeng,《K8s基于Nginx Ingress实现灰度发布

(2)我的小碗汤,《Nginx Ingress实现灰度和金丝雀发布

(3)梁宽,《再也不踩坑的K8s实战指南

(4)WangT,《K8s基于Nginx Ingress进行蓝绿部署/金丝雀发布

(5)linus.lin,《一文明白蓝绿部署、滚动部署、灰度发布、金丝雀发布

作者:周旭龙

出处:https://edisonchou.cnblogs.com

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。

ASP.NET Core on K8S学习之旅(14)Ingress灰度发布的更多相关文章

  1. ASP.NET Core on K8S学习之旅(12)Ingress

    本篇已加入<.NET Core on K8S学习实践系列文章索引>,可以点击查看更多容器化技术相关系列文章. 一.关于Ingress Kubernetes对外暴露Service主要有三种方 ...

  2. ASP.NET Core on K8S学习之旅(13)Ocelot API网关接入

    本篇已加入<.NET Core on K8S学习实践系列文章索引>,可以点击查看更多容器化技术相关系列文章. 上一篇介绍了Ingress的基本概念和Nginx Ingress的基本配置和使 ...

  3. ASP.NET Core on K8S学习初探(1)K8S单节点环境搭建

    当近期的一个App上线后,发现目前的docker实例(应用服务BFF+中台服务+工具服务)已经很多了,而我司目前没有专业的运维人员,发现运维的成本逐渐开始上来,所以容器编排也就需要提上议程.因此我决定 ...

  4. ASP.NET Core on K8S学习初探(3)部署API到K8S

    在上一篇<基本概念快速一览>中,我们把基本的一些概念快速地简单地不求甚解地过了一下,本篇开始我们会将ASP.NET Core WebAPI部署到K8S,从而结束初探的旅程. Section ...

  5. ASP.NET Core on K8S学习初探(2)K8S基本概念快速一览

    在上一篇<单节点环境搭建>中,通过Docker for Windows在Windows开发机中搭建了一个单节点的K8S环境,接下来就是动人心弦的部署ASP.NET Core API到K8S ...

  6. ASP.NET Core on K8S深入学习(1)K8S基础知识与集群搭建

    在上一个小系列文章<ASP.NET Core on K8S学习初探>中,通过在Windows上通过Docker for Windows搭建了一个单节点的K8S环境,并初步尝试将ASP.NE ...

  7. ASP.NET Core on K8S 入门学习系列文章目录

    一.关于这个系列 自从2018年底离开工作了3年的M公司加入X公司之后,开始了ASP.NET Core的实践,包括微服务架构与容器化等等.我们的实践是渐进的,当我们的微服务数量到了一定值时,发现运维工 ...

  8. .NET Core on K8S学习实践系列文章索引(Draft版)

    一.关于这个系列 自从去年(2018年)底离开工作了3年的M公司加入X公司之后,开始了ASP.NET Core的实践,包括微服务架构与容器化等等.我们的实践是渐进的,当我们的微服务数量到了一定值时,发 ...

  9. ASP.NET Core on K8S深入学习(2)部署过程解析与Dashboard

    上一篇<K8S集群部署>中搭建好了一个最小化的K8S集群,这一篇我们来部署一个ASP.NET Core WebAPI项目来介绍一下整个部署过程的运行机制,然后部署一下Dashboard,完 ...

随机推荐

  1. BeanDefinition源码解析

    我们知道BeanDefintion定义了Bean在IoC容器内的基本数据结构.在学习IoC之前先了解BeanDefition对我们理解IoC容器是有帮助的. 首先BeanDefinition是一个接口 ...

  2. SQL 文件导入数据库

    1.首先通过 xshell 连接数据库服务器,执行命令 mysql -u root -p 命令,按照提示输入密码,连接上数据库 2.在连接终端上执行命令 create database JD_Mode ...

  3. IP 基础知识全家桶,45 张图一套带走

    前言 前段时间,有读者希望我写一篇关于 IP 分类地址.子网划分等的文章,他反馈常常混淆,摸不着头脑. 那么,说来就来!而且要盘就盘全一点,顺便挑战下小林的图解功力,所以就来个 IP 基础知识全家桶. ...

  4. Coursera课程笔记----C程序设计进阶----Week 5

    指针(二) (Week 5) 字符串与指针 指向数组的指针 int a[10]; int *p; p = a; 指向字符串的指针 指向字符串的指针变量 char a[10]; char *p; p = ...

  5. 导出jar包和api文档

    导出jar包过程 右击项目名称->export 选择java->JAR file next->选择路径 导出成功 生成api文档 选择doc->右键export java-&g ...

  6. [hdu5226]组合数求和取模(Lucas定理)

    题意:给一个矩阵a,a[i][j] = C[i][j](i>=j) or 0(i < j),求(x1,y1),(x2,y2)这个子矩阵里面的所有数的和. 思路:首先问题可以转化为求(0,0 ...

  7. vue项目中使用bpmn-流程图xml文件中节点属性转json结构

    内容概述 本系列“vue项目中使用bpmn-xxxx”分为七篇,均为自己使用过程中用到的实例,手工原创,目前陆续更新中.主要包括vue项目中bpmn使用实例.应用技巧.基本知识点总结和需要注意事项,具 ...

  8. spring boot构建restful服务

    使用spring boot快速构建出restful服务 JPA实现REST 创建spring boot项目,在项目文件pom.xml中添加以下依赖: <dependency> <gr ...

  9. C# -- WebClient自动获取web页面编码并转换

    C# -- WebClient自动获取web页面编码并转换 抽个时间,写篇小文章,最近有个朋友,用vb开发一个工具,遇到WebClient获取的内容出现乱码,可惜对vb不是很熟悉,看了几分钟vb的语法 ...

  10. python --设置Python3 设置为机器默认

    echo alias python=python3 >> ~/.bashrc source ~/.bashrc 反之,如果仍然需要Python2.7 ,则改成2.7就行. update : ...