Kubectl Rollout 回滚及Autoscale自动扩容

Kubernetes 中采用ReplicaSet(简称RS)来管理Pod。如果当前集群中的Pod实例数少于目标值,RS 会拉起新的Pod,反之,则根据策略删除多余的Pod。Deployment正是利用了这样的特性,通过控制两个RS里面的Pod,从而实现升级。

滚动升级是一种平滑过渡式的升级,在升级过程中,服务仍然可用。


1. 创建deployment

kubectl create deploy nginx-test --image=nginx:1.14

kubectl exec 退出容器 kubectl rollout restart_运维

2. scale 副本数量

kubectl scale deployment nginx-test --replicas 3

kubectl exec 退出容器 kubectl rollout restart_kubectl exec 退出容器_02


如果集群支持 horizontal pod autoscaling 的话,还可以为Deployment设置自动扩展:

kubectl autoscale deployment nginx-test --min=3 --max=5 --cpu-percent=80


3. 更新 deployment

更新镜像

kubectl set image deployment/nginx-test nginx=nginx:1.15

kubectl exec 退出容器 kubectl rollout restart_nginx_03


回滚到上一个版本:

kubectl rollout undo deployment/nginx-test

kubectl exec 退出容器 kubectl rollout restart_Deployment_04


也可以使用 --revision参数指定某个历史版本:

kubectl rollout undo deployment/nginx-test --to-revisinotallow=2

kubectl exec 退出容器 kubectl rollout restart_Pod_05


4. 历史记录

kubectl rollout history deployment/nginx-test

kubectl exec 退出容器 kubectl rollout restart_nginx_06


创建 Deployment 的时候使用了--record参数可以记录命令,我们可以很方便的查看每次 revision 的变化。查看单个revision 的详细信息:

kubectl rollout history deployment nginx-test --revisinotallow=3

kubectl exec 退出容器 kubectl rollout restart_Deployment_07

5. 验证发布

kubectl rollout status deploy/nginx-test

kubectl exec 退出容器 kubectl rollout restart_运维_08

6. 回滚发布

kubectl rollout undo deployments/nginx-test

kubectl exec 退出容器 kubectl rollout restart_kubectl exec 退出容器_09


想回滚到指定版本呢?答案是k8s完美支持,并且还可以通过资源文件进行配置保留的历史版次量

kubectl rollout undo deployment/nginx-test --to-revision=<版次>


原理
k8s分批次有序地进行着滚动更新,直到把所有旧的副本全部更新到新版本。实际上,k8s是通过两个参数来精确地控制着每次滚动的pod数量:

maxSurge 滚动更新过程中运行操作期望副本数的最大pod数,但不能为0;也可以为百分数(eg:10%)。默认为25%。

maxUnavailable 滚动更新过程中不可用的最大pod数,但不能为0;也可以为百分数(eg:10%)。默认为25%。

重要参数 maxSurge与maxUnavailable
maxSurge: 1 表示滚动升级时会先启动1个pod
maxUnavailable: 1 表示滚动升级时允许的最大Unavailable的pod个数
由于replicas为3,则整个升级,pod个数在2-4个之间

剖析部署概况
DESIRED 最终期望处于READY状态的副本数
CURRENT 当前的副本总数
UP-TO-DATE 当前完成更新的副本数
AVAILABLE 当前可用的副本数
滚动过程是通过控制两个副本集来完成的
 
使用 autoscaler 自动设置在kubernetes集群中运行的pod数量(水平自动伸缩)。

指定Deployment、ReplicaSet或ReplicationController,并创建已经定义好资源的自动伸缩器。使用自动伸缩器可以根据需要自动增加或减少系统中部署的pod数量。


$ autoscale (-f FILENAME | TYPE NAME | TYPE/NAME) [--min=MINPODS] --max=MAXPODS [--cpu-percent=CPU] [flags]


示例
使用默认的自动伸缩策略,指定目标CPU使用率,使其Pod数量在2到10之间。


kubectl autoscale deployment/nginx-test --min=2 --max=10


使其Pod的数量介于1和5之间,CPU使用率维持在80%。


kubectl autoscale deploy/nginx-test --max=5 --cpu-percent=80