通过NGINX Plus Ingress Controller在k8s实现灰度发布
2020-06-28 16:21:31
Will Tang
在之前的文章中,我们讨论了如何通过F5 Big-IP产品实现应用的灰度发布。那在k8s容器云中,我们是否也能实现灰度发布呢?答案是一定的,借助F5提供的Container Ingress Services(简称CIS),我们依然可以在容器云中通过F5 Big-IP产品使用相同的方式实现应用的灰度发布。今天我们要讨论的是如何通过NGINX Plus(简称N+)来实现容器云中的应用灰度发布。
NGINX Plus Ingress Controller介绍
NGINX Ingress Controller是NGINX公司开发的可用于k8s充当Ingress Controller的产品,有NGINX和NGINX Plus两个版本。NGINX是开源免费版,而NGINX Plus是商业版本。
NGINX Plus Ingress Controller除了支持基于http内容的7层路由、TLS/SSL卸载等标准的k8s Ingress功能外,还提供了其它诸多的扩展功能。
而除了k8s原生定义的Ingress之外,NGINX Plus Ingress Controller还通过CRD定义了功能更丰富,配置更简单的7层负载均衡资源,VirtualServer和VirtualServerRoute(简称VS和VSR),用于对Ingress资源做补充和替换。例如通过VS的Split功能,就能很方便的在k8s中实现按比例的灰度发布。
N+ Ingress Controller实现按比例灰度发布的简单示例
本示例中演示如下功能:我们通过https://cafe.example.com/coffee/来访问应用,这个应用在容器云内有两个版本,对应两个service,一个叫coffee-v1,一个叫coffee-v2,通过N+ Ingress Controller中VS资源的Split功能,10%的请求会访问coffee-v2,90%的请求会访问coffee-v1。
首先运行coffee-v1和coffee-v2两个服务,使用nginxdemos/nginx-hello:plain-text容器来做演示。
apiVersion: apps/v1
kind: Deployment
metadata:
name: coffee-v1
spec:
replicas: 2
selector:
matchLabels:
app: coffee-v1
template:
metadata:
labels:
app: coffee-v1
spec:
containers:
- name: coffee-v1
image: nginxdemos/nginx-hello:plain-text
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: coffee-v1-svc
spec:
ports:
- port: 80
targetPort: 8080
protocol: TCP
name: http
selector:
app: coffee-v1
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: coffee-v2
spec:
replicas: 2
selector:
matchLabels:
app: coffee-v2
template:
metadata:
labels:
app: coffee-v2
spec:
containers:
- name: coffee-v2
image: nginxdemos/nginx-hello:plain-text
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: coffee-v2-svc
spec:
ports:
- port: 80
targetPort: 8080
protocol: TCP
name: http
selector:
app: coffee-v2
VS的CRD和一些全局参数在安装N+ Ingress Controller时都已配置好,详细内容可以参考官网文档。https://docs.nginx.com/nginx-ingress-controller/overview/
下面我们下发一个VS,实现按比例的灰度发布。
apiVersion: k8s.nginx.org/v1
kind: VirtualServer
metadata:
name: cafe-split
spec:
host: cafe.example.com
tls:
secret: cafe-secret
upstreams:
- name: coffee-v1
service: coffee-v1-svc
port: 80
- name: coffee-v2
service: coffee-v2-svc
port: 80
routes:
- path: /coffee
splits:
- weight: 90
action:
pass: coffee-v1
- weight: 10
action:
pass: coffee-v2
可以看到整个配置非常简单且易读。
然后我们使用ApacheBench发起100个请求,可以看到全部成功。
再通过N+自带的dashboard,我们可以看到100个请求中的87个被分到了coffee-v1并做了负载均衡,13个请求被分到了coffee-v2并做了负载均衡,比例近似9:1。
发布评论 加入社群
相关文章
F5灰度发布解决方案介绍
Will Tang
2019-10-23 23:30:39 3355

回复评论
发布评论