1.Deployment控制器详细信息中包含了其更新策略的相关配置。kubectl describe命令中输出的StrategyType、RollingUpdateStrategy字段等;
root@kubernetes-master01:~# kubectl describe deploy sleep
Name: sleep
Namespace: default
CreationTimestamp: Wed, 25 May 2022 15:03:14 +0800
Labels:
Annotations: deployment.kubernetes.io/revision: 1
Selector: app=sleep
Replicas: 1 desired | 1 updated | 1 total | 1 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
# Deployment默认更新策略就是RollingUpdate默认更新策略是25%
1.Deployment的更新策略:
Deployment控制器支持两种更新策略: 滚动更新(rolling update)和重建创建(recreate)也称为单批次更新。
1.重建(Recreate),当更新策略设定为Recreate,在更新镜像时,它会先删除现在正在运行的Pod,等彻底杀死后,重新创建新的RS(ReplicaSet)然后启动对应的Pod,在整个更新过程中,会造成服务一段时间无法提供服务。也称之为单批次更新。
2.滚动更新(Rolling Update)滚动更新是默认的更新策略,一次仅更新一批Pod,当更新的Pod就绪后再更新另一批,直到全部更新完成为止;该策略实现了不间断服务的目标,但是在更新过程中,不同客户端得到的响应内容可能会来自不同版本的应用。会出现新老版本共存状态。
2.ReCreate实践;
Recreate分为三个步骤:
1.杀死所有旧版本的Pod,此时Pod无法正常对外提供服务;
2.创建新的RS,启动新的Pod;
3.等待Pod就绪,对外提供服务;
2.1应用配置示例
# 须在Spec字段中明确定义strategy滚动更新策略和type类型 root@kubernetes-master01:~# cat nginx-deployment-test.yaml apiVersion: apps/v1 kind: Deployment metadata: name: deployment-nginx-test namespace: default spec: strategy: # 滚动更新策略 type: Recreate # Recreate表示的是单批次更新。 replicas: 2 selector: matchLabels: app: nginx-deployment template: metadata: labels: app: nginx-deployment spec: containers: - name: nginx image: nginx:1.16 #imagePullPolicy: IfNotPresent ports: - name: http containerPort: 80 root@kubernetes-master01:~# kubectl apply -f nginx-deployment-test.yaml折叠
2.2访问测试,同时配置文件修改Nginx的版本测试服务是否会中断;
# 跟上任何符号会报错Nginx的错误页,现版本是1.16。当然是为了证实nginx版本。
root@kubernetes-master01:~# curl 10.107.246.117/v
404 Not Found
404 Not Found
nginx/1.16.1
2.3现版本是1.16,现在测试滚动更新;
1.修改yaml配置文件修改编辑配置文件的spec.containers.image字段修改Nginx的版本
2.通过set image来修改
我是通过set image来修改。
root@kubernetes-master01:~# kubectl set image deployment/deployment-nginx-test nginx=nginx:latest
deployment.apps/deployment-nginx-test image updated
2.4访问测试,的确中间是有业务访问间断的,因此在生产环境不建议这种方式。在更新的过程中旧Pod是处于Terminating状态。
root@kubernetes-master01:~# while sleep 0.5; do curl http://10.107.246.117/version;done
404 Not Found
nginx/1.16.1