当前位置: 首页 > news >正文

K8S Nginx Ingress实现金丝雀发布

通过给 Ingress 资源指定 Nginx Ingress 所支持的 annotation 可实现金丝雀发布。

需给服务创建2个 Ingress,其中1个常规 Ingress另1个为带 nginx.ingress.kubernetes.io/canary: "true" 固定的 annotation 的 Ingress,称为 Canary Ingress。

Canary Ingress 一般代表新版本的服务,结合另外针对流量切分策略的 annotation 一起配置即可实现多种场景的金丝雀发布。

以下为相关 annotation 的详细介绍:

  • nginx.ingress.kubernetes.io/canary-by-header
    表示如果请求头中包含指定的 header 名称,并且值为 always,就将该请求转发给该 Ingress 定义的对应后端服务。如果值为 never 则不转发,可以用于回滚到旧版。如果为其他值则忽略该 annotation。

  • nginx.ingress.kubernetes.io/canary-by-header-value
    该 annotation 可以作为 canary-by-header 的补充,可指定请求头为自定义值,包含但不限于 always 或 never。当请求头的值命中指定的自定义值时,请求将会转发给该 Ingress 定义的对应后端服务,如果是其它值则忽略该 annotation。

  • nginx.ingress.kubernetes.io/canary-by-header-pattern
    与 canary-by-header-value 类似,区别为该 annotation 用正则表达式匹配请求头的值,而不是只固定某一个值。如果该 annotation 与 canary-by-header-value 同时存在,该 annotation 将被忽略。

  • nginx.ingress.kubernetes.io/canary-by-cookie
    与 canary-by-header 类似,该 annotation 用于 cookie,仅支持 always 和 never

  • nginx.ingress.kubernetes.io/canary-weight
    表示 Canary Ingress 所分配流量的比例的百分比,取值范围 [0-100]。例如,设置为10,则表示分配10%的流量给 Canary Ingress 对应的后端服务。

一、部署蓝环境版本服务

1、ConfigMap

kind: ConfigMap
apiVersion: v1
metadata:name: nginx-blue-config
data:nginx.conf: |-worker_processes  1;events {accept_mutex on;multi_accept on;use epoll;worker_connections  1024;}http {ignore_invalid_headers off;server {listen 80;location / {access_by_lua 'local header_str = ngx.say("blue")';}}}

2、Deployment

kind: Deployment
apiVersion: apps/v1
metadata:name: nginx-bluelabels:dce.daocloud.io/app: nginx-blueannotations:dce.daocloud.io/last-replicas: '1'deployment.kubernetes.io/revision: '3'kubernetes.io/change-cause: update YAML
spec:replicas: 1selector:matchLabels:dce.daocloud.io/component: nginx-bluetemplate:metadata:name: nginx-bluelabels:dce.daocloud.io/app: nginx-bluedce.daocloud.io/component: nginx-blueannotations:dce.daocloud.io/parcel.egress.burst: '0'dce.daocloud.io/parcel.egress.rate: '0'dce.daocloud.io/parcel.ingress.burst: '0'dce.daocloud.io/parcel.ingress.rate: '0'dce.daocloud.io/parcel.net.type: calicospec:volumes:- name: nginx-blue-configconfigMap:name: nginx-blue-configdefaultMode: 420containers:- name: nginx-blueimage: 'x.x.x.x/library/openresty:1.19.9.1-sw-r4'resources:limits:cpu: 500mmemory: '314572800'requests:cpu: 200mmemory: '314572800'volumeMounts:- name: nginx-blue-configmountPath: /etc/nginx/nginx.confsubPath: nginx.conf

3、Service

kind: Service
apiVersion: v1
metadata:name: nginx-blue-defaultlabels:dce.daocloud.io/app: nginx-blueannotations:io.daocloud.dce.serviceSelectorType: service
spec:ports:- name: nginx-nginx-default-80680-80protocol: TCPport: 80targetPort: 80nodePort: 31046selector:dce.daocloud.io/component: nginx-blueclusterIP: 172.31.69.137type: NodePortsessionAffinity: NoneexternalTrafficPolicy: Cluster

4、修改pod内容

cd /usr/local/openresty/nginx/html/ls
50x.html  index.htmlecho "Hello Blue" > index.htmlcat index.html 
Hello Blue

二、部署绿环境版本服务

1、ConfigMap

kind: ConfigMap
apiVersion: v1
metadata:name: nginx-green-config
data:nginx.conf: |-worker_processes  1;events {accept_mutex on;multi_accept on;use epoll;worker_connections  1024;}http {ignore_invalid_headers off;server {listen 80;location / {access_by_lua 'local header_str = ngx.say("green")';}}}

2、Deployment

kind: Deployment
apiVersion: apps/v1
metadata:name: nginx-greenlabels:dce.daocloud.io/app: nginx-greenannotations:deployment.kubernetes.io/revision: '5'kubernetes.io/change-cause: update YAML
spec:replicas: 1selector:matchLabels:dce.daocloud.io/component: nginx-greentemplate:metadata:name: nginx-greenlabels:dce.daocloud.io/app: nginx-greendce.daocloud.io/component: nginx-greenenv: greenannotations:dce.daocloud.io/parcel.egress.burst: '0'dce.daocloud.io/parcel.egress.rate: '0'dce.daocloud.io/parcel.ingress.burst: '0'dce.daocloud.io/parcel.ingress.rate: '0'dce.daocloud.io/parcel.net.type: calicodce.daocloud.io/parcel.net.value: default-ipv4-ippoolspec:volumes:- name: nginx-green-configconfigMap:name: nginx-green-configdefaultMode: 420containers:- name: nginx-greenimage: 'x.x.x.x/library/openresty:1.19.9.1-sw-r4'resources:limits:cpu: 500mmemory: '314572800'requests:cpu: 200mmemory: '314572800'volumeMounts:- name: nginx-green-configmountPath: /etc/nginx/nginx.confsubPath: nginx.conf

3、Service

kind: Service
apiVersion: v1
metadata:name: nginx-green-defaultlabels:dce.daocloud.io/app: nginx-greenannotations:io.daocloud.dce.serviceSelectorType: service
spec:ports:- name: nginx-nginx-default-15833-80protocol: TCPport: 80targetPort: 80nodePort: 35218selector:dce.daocloud.io/component: nginx-greenclusterIP: 172.31.207.22type: NodePortsessionAffinity: NoneexternalTrafficPolicy: Cluster

 4、修改pod内容

cd /usr/local/openresty/nginx/html/ls
50x.html  index.htmlecho "Hello Green" > index.htmlcat index.html 
Hello Green

三、设置Ingress

1、blue环境Ingress

kind: Ingress
apiVersion: networking.k8s.io/v1beta1
metadata:name: nginx-blue-ingresslabels:dce.daocloud.io/app: nginx-blueannotations:nginx.ingress.kubernetes.io/use-port-in-redirects: 'true'
spec:rules:- host: nginx.ms-sit.xxxxxx.nethttp:paths:- path: /pathType: ImplementationSpecificbackend:serviceName: nginx-blue-defaultservicePort: 80

2、green环境Ingress

kind: Ingress
apiVersion: networking.k8s.io/v1beta1
metadata:name: nginx-green-ingresslabels:dce.daocloud.io/app: nginx-greenannotations:kubernetes.io/ingress.class: nginxnginx.ingress.kubernetes.io/canary: 'true'nginx.ingress.kubernetes.io/canary-by-header: envnginx.ingress.kubernetes.io/canary-by-header-pattern: green
spec:rules:- host: nginx.ms-sit.xxxxxx.nethttp:paths:- path: /pathType: ImplementationSpecificbackend:serviceName: nginx-green-defaultservicePort: 80

四、测试

 

 

http://www.lryc.cn/news/143959.html

相关文章:

  • 【C++入门】new和delete(C/C++内存管理)
  • C++设计模式之桥接模式
  • 前端速查速记系列----评论列表
  • hiredis的安装与使用
  • 【InsCode】InsCode打造的JavaSE与Linux命令互融的伪Linux文件系统小项目
  • “深入解析JVM:探索Java虚拟机的内部机制“
  • 内网远程控制总结
  • Excel显示此值与此单元格定义的数据验证限制不匹配怎么办?
  • mysql(八)事务隔离级别及加锁流程详解
  • 华为云Stack的学习(二)
  • 好用的网页制作工具就是这6个,快点来看!
  • 一文讲通物联网嵌入式
  • Unity3D Pico VR 手势识别 二
  • ubuntu中使用iptables限制端口
  • Orchestrator介绍二 自身高可用性方案
  • 成集云 | 旺店通多包裹数据同步钉钉 | 解决方案
  • 什么是字体图标(Icon Font)?如何在网页中使用字体图标?
  • Blender文件云端GPU渲染
  • C++——引用
  • Flask入门一 ——虚拟环境及Flask安装
  • 接口测试json入参,不同类型参数格式书写
  • go web框架 gin-gonic源码解读03————middleware
  • win10电脑记事本在哪里?电脑记事本如何查看字数?
  • 【微服务】06-安全问题
  • js的this指向问题
  • Redis常用数据类型及命令
  • 软件工程(六) 面向对象分析(OOA)之UML图特点
  • QT 消息对话框按钮显示
  • 平衡二叉树及其应用详解
  • vue3+ ts ts语法在script写不知道为啥一直报错