灰度发布也叫金丝雀部署 ,是指通过控制流量的比例,实现新老版本的逐步更替。比如对于服务A 有 version1、 version2 两个版本 , 当前两个版本同时部署,但是version1比例90% ,version2比例10% ,看运行效果,如果效果好逐步调整流量占比 80~20 ,70~30 ·····10~90 ,0,100 ,最终version1版本下线。
灰度发布的特点:
1)新老板共存
2)可以实时根据反馈动态调整占比
3)理论上不存在服务完全宕机的情况。
4)适合于服务的平滑升级与动态更新。
使用istio进行金丝雀发布
创建金丝雀服务
catdeployment.yaml,内容如下:
apiVersion:apps/v1
kind:Deployment
metadata:
name: appv1
labels:
app: v1
spec:
replicas: 1
selector:
matchLabels:
app: v1
apply: canary
template:
metadata:
labels:
app: v1
apply: canary
spec:
containers:
- name: nginx
image: xianchao/canary:v1
ports:
- containerPort: 80
—-
apiVersion:apps/v1
kind:Deployment
metadata:
name: appv2
labels:
app: v2
spec:
replicas: 1
selector:
matchLabels:
app: v2
apply: canary
template:
metadata:
labels:
app: v2
apply: canary
spec:
containers:
- name: nginx
image: xianchao/canary:v2
ports:
- containerPort: 80
更新:
kubectlapply -f deployment.yaml
创建service
catservice.yaml文件,内容如下:
apiVersion:v1
kind:Service
metadata:
name: canary
labels:
apply: canary
spec:
selector:
apply: canary
ports:
- protocol: TCP
port: 80
targetPort: 80
更新service.yaml文件
kubectlapply -f service.yaml
创建gateway
cat gateway.yaml文件,内容如下:
apiVersion:networking.istio.io/v1beta1
kind:Gateway
metadata:
name: canary-gateway
spec:
selector:
istio: ingressgateway
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- ““
更新gateway.yaml
kubectlapply -f gateway.yaml
创建virtualservice
catvirtual.yaml,内容如下:
apiVersion:networking.istio.io/v1beta1
kind:VirtualService
metadata:
name: canary
spec:
hosts:
- ““
gateways:
- canary-gateway
http:
- route:
- destination:
host: canary.default.svc.cluster.local
subset: v1
weight: 90
- destination:
host: canary.default.svc.cluster.local
subset: v2
weight: 10
—-
apiVersion:networking.istio.io/v1beta1
kind:DestinationRule
metadata:
name: canary
spec:
host: canary.default.svc.cluster.local
subsets:
- name: v1
labels:
app: v1
- name: v2
labels:
app: v2
更新virtual.yaml文件
kubectlapply -f virtual.yaml
获取Ingress_port:
kubectl-n istio-system get service istio-ingressgateway -ojsonpath=’{.spec.ports[?(@.name==”http2”)].nodePort}’
显示结果是30871
验证金丝雀发布效果:
fori in seq 1 100
; do curl 192.168.40.180:30871;done > 1.txt
打开1.txt可以看到结果有90次出现v1,10次出现canary-v2,符合我们预先设计的流量走向。