介绍
灰度发布(又名金丝雀发布),kubernets 中经常用到,发布先版本之前,先更新一部分,新旧版本共同,运行一段时间,看看效果,发现问题,及时处理,不至于服务不可用,新版本稳定后,逐步替换,平滑过渡
原理
kubernetes 中灰度发布通过负载均衡网络实现。服务的负载均衡依赖于服务的标签,新发布的服务既包含新的标签标识新的服务又包含之前版本标签(旧标签),旧标签被用于负载均衡网络发现。新版本服务运行稳定后,进行扩容,旧版本缩容,实现了灰度发布。
金丝雀灰度发布实现
-
部署nginx
nginx-old.yaml
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment-old #部署一个名称为:nginx-deployment-old nginx服务 labels: app: nginx #服务的标签名,用于负载均衡网络 spec: replicas: 3 #副本为3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.7.9 --- apiVersion: v1 kind: Service metadata: name: nginx-service #部署一个nginx-sevice 负载均衡网络 labels: app: nginx spec: selector: app: nginx # 选择标签为 ngix 的pod 加入负载均衡网络 ports: - name: nginx-port protocol: TCP port: 80 nodePort: 32600 # 外部访问端口 targetPort: 80 #内部服务默认端口,即外部通过 32600 端口访问,负载均衡网络直接访问nginx的80端口 type: NodePort # 随机暴露端口
标签为
app: nginx
服务自动加入到负载均衡网络-
查看
#查看服务和pod [root@guanzc-130 kubernetes]# kubectl get pod, service # 查看部署服务ip [root@guanzc-130 kubernetes]# kubectl get service -o wide NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3d2h <none> nginx-service NodePort 10.96.247.178 <none> 80:32600/TCP 5m1s app=nginx
-
通过192.168.1.130
-
灰度发布
把nginx 版本由1.7 升级到1.8 , 通过文件部署,创建一个
nginx-canary.yaml
文件apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment-canary labels: app: nginx #版本的标签名称: track: canary spec: replicas: 1 selector: matchLabels: app: nginx track: canary template: metadata: labels: app: nginx track: canary spec: volumes: - emptyDir: {} name: ourfile containers: - name: nginx image: nginx:1.18.0 volumeMounts: - mountPath: /usr/share/nginx/html name: ourfile initContainers: - image: alpine name: initc-1 command: ["/bin/sh","-c","echo '<h1>canary page</h1>' > /html/index.html"] volumeMounts: - name: ourfile mountPath: /html
-
执行部署
kubectl apply -f nginx-canary.yaml
部署完成后,继续访问:192.168.1.130:32600 出现 canary page
说明,新的版本发布成功
- 网络环境
新旧版本共存,访问server 网络,随机分配。新的服务有两种标签,app:nginx, track:canary
, server 网络通过app:nginx
自动识别新版本服务。
运行一段时间,新的服务正常,可以逐步切换到新版本,新扩容新版为3个副本,全部启动后,在停用旧版本,防止服务不可用
- 新版本扩容,旧版本缩容
# 扩容
kubectl scale --replicas=3 nginx-deployment-canary
# 查看状态,成功后可删除旧版本
kubectl get pod
# 删除旧版本
kubectl delete deploy nginx-deployment-old
再次访问: 192.168.1.130:32600 全部新版本
总结
到此新旧版本共同,到逐步替换,实现了滚动升级