一、基于K8S的应用升级策略
可在 Deployment.spec.strategy 中设置
升级策略有两种
- Recreate:在创建新策略之前删除所有容器集,升级期间服务不可用,适合停机升级;
- RollingUpdate(默认):滚动升级,可以设置升级策略,升级期间服务可用;
注意点:
Recreate
Kubernetes 先终止当前版本中的所有容器,然后在旧容器删除时同时启动所有新容器,不会有 2 种版本容器同时运行,这对服务使用者来说更简单。
优点:不存在新老版本共存;
缺点:可能存在服务某段时间服务不可用;
特点:所有容器集一起Terminating,一起Pending,一起ContainerCreating,一起Running。
场景:当发布到开发/测试环境的时候,重建或者滚动更新通常是一个不错的选择。
RollingUpdate
Deployment控制器的滚动更新操作并非在同一个ReplicaSet控制器对象下删除并创建Pod资源,而是将它们分置于两个不同的控制器之下:旧控制器的Pod对象数量不断减少的同时,新控制器的Pod对象数量不断增加,直到旧控制器不再拥有Pod对象,而新控制器的副本数量变得完全符合期望值为止;
优点:不存在某段时间内服务不可用;
缺点:切换过程中,存在pod新老版本共存;
特点:默认是滚动更新,缺省是滚动更新(核心参数↓);
- maxUnavailable:滚动升级时允许的最大unavailable的pod数量,可以是整数或者百分比(默认25%),这个值越小,越能保证服务稳定,更新越平滑;
- maxSurge:滚动升级时先启动的pod数量,可以是整数或者百分比(默认25%),这个值调的越大,副本更新速度越快;
场景:在生产环境,滚动更新发布比较合适,但是新版本的提前测试是非常有必要的。
测试验证
nginx-recreate.yaml
apiVersion: apps/v1kind: Deploymentmetadata: name: nginx-deployment labels: app: nginxspec: replicas: 4 revisionHistoryLimit: 4 strategy: type: Recreate selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.7.9 ports: - containerPort: 80---apiVersion: v1kind: Servicemetadata: name: nginx-servicespec: selector: app: nginx ports: - protocol: TCP port: 80 targetPort: 80 nodePort: 30080 type: NodePort
nginx-rolling.yaml
apiVersion: apps/v1kind: Deploymentmetadata: name: nginx-deployment labels: app: nginxspec: replicas: 4 revisionHistoryLimit: 4 strategy: type: RollingUpdate rollingUpdate: maxUnavailable: 25% maxSurge: 25% selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.7.9 ports: - containerPort: 80---apiVersion: v1kind: Servicemetadata: name: nginx-servicespec: selector: app: nginx ports: - protocol: TCP port: 80 targetPort: 80 nodePort: 30080 type: NodePort
recreate:
1、创建 --> 2、版本更新 --> 3、更新
rollingUpdate:
while sleep 0.5;do curl 172.25.36.200:30080 -I;done
二、蓝绿发布
蓝绿部署:蓝绿部署,service-selector 选择器,一键切换;
核心:先将v1,v2都启动起来,然后一键切换(保证deployment name不同即可做到)
滚动更新 的 缺点 是:切换过程中,可能会出现访问到 v1 的情况;
重新创建 的 缺点 是:切换过程中,可能出现服务端无响应的情况;
蓝绿部署就是滚动更新提供的另一种方案,就是v2都启动之后,然后一键切过去,不存在切换过程中访问到v1的情况,可以无缝升级,可以无缝回退。
蓝绿部署 = 无缝切换 + 不会无响应
测试验证
nginx-blue.yaml
apiVersion: apps/v1kind: Deploymentmetadata: name: nginx-blue-deployment labels: app: nginx-bluespec: replicas: 4 revisionHistoryLimit: 4 strategy: type: RollingUpdate rollingUpdate: maxUnavailable: 25% maxSurge: 25% selector: matchLabels: app: nginx-blue template: metadata: labels: app: nginx-blue spec: containers: - name: nginx-blue image: nginx:1.7.9 ports: - containerPort: 80
nginx-green.yaml
apiVersion: apps/v1kind: Deploymentmetadata: name: nginx-green-deployment labels: app: nginx-greenspec: replicas: 4 revisionHistoryLimit: 4 strategy: type: RollingUpdate rollingUpdate: maxUnavailable: 25% maxSurge: 25% selector: matchLabels: app: nginx-green template: metadata: labels: app: nginx-green spec: containers: - name: nginx-green image: nginx:latest ports: - containerPort: 80
nginx-bluegreen-svc.yaml
apiVersion: v1kind: Servicemetadata: name: nginx-bluegreen-servicespec: selector: app: nginx-green ports: - protocol: TCP port: 80 targetPort: 80 nodePort: 30090 type: NodePort
验证:
while sleep 0.5;do curl 172.25.36.200:30090 -I;done
三、金丝雀发布
金丝雀发布一般是先发一个新版本应用,或者一个小比例,例如1个pod的新应用,主要做流量验证用,也称为金丝雀 (Canary) 测试,国内常称灰度测试。
以前旷工下矿前,会先放一只金丝雀进去用于探测洞里是否有有毒气体,看金丝雀能否活下来,金丝雀发布由此得名。
简单的金丝雀测试一般通过手工测试验证,复杂的金丝雀测试需要比较完善的监控基础设施配合,通过监控指标反馈,观察金丝雀的健康状况,作为后续发布或回退的依据。
如果金丝测试通过,则把剩余的 V1 版本全部升级为 V2 版本。如果金丝雀测试失败,则直接回退金丝雀,发布失败。
验证:
v1:当前线上V1版本(副本3个)
v2:未来线上V2新版本(副本1个)
需求 :v1作为当前线上运行版本,保持75%流量;新版本25%流量作为验证,一旦出现问题,随时回滚删除新版本pod;
nginx-canary-v1.yaml
apiVersion: apps/v1kind: Deploymentmetadata: name: nginx-v1spec: replicas: 3 revisionHistoryLimit: 4 strategy: type: RollingUpdate rollingUpdate: maxUnavailable: 25% maxSurge: 25% selector: matchLabels: app: nginx-canary template: metadata: labels: app: nginx-canary spec: containers: - name: nginx-canary image: nginx:1.7.9 ports: - containerPort: 80
nginx-canary-v2.yaml
apiVersion: apps/v1kind: Deploymentmetadata: name: nginx-v2spec: replicas: 1 revisionHistoryLimit: 4 strategy: type: RollingUpdate rollingUpdate: maxUnavailable: 25% maxSurge: 25% selector: matchLabels: app: nginx-canary template: metadata: labels: app: nginx-canary spec: containers: - name: nginx-canary image: nginx:latest ports: - containerPort: 80
nginx-canary-svc.yaml
apiVersion: v1kind: Servicemetadata: name: nginx-canary-servicespec: selector: app: nginx-canary ports: - protocol: TCP port: 80 targetPort: 80 nodePort: 30100 type: NodePort
验证:
while sleep 0.5;do curl 172.25.36.200:30100 -I;done
四、总结
- 当发布到开发/测试环境时,重新创建或升级部署通常是一个不错的选择。
- 生产方面,蓝/绿部署通常很合适。
- 需要对新平台/新功能进行适当的引流验证,选择金丝雀版本。
扩展内容:
● https://www.cnblogs.com/huangqingshi/p/15526718.html
服务器租用托管,机房租用托管,主机租用托管,https://www.e1idc.com