本篇主要讨论如何实现滚动更新和回滚,任意更换版本并且回滚以前的版本(版本更新),而下一章会讨论到 Pod 缩放,根据机器资源自动拓展和收缩应用(自动扩容实例)。

本文为作者的 Kubernetes 系列电子书的一部分,电子书已经开源,欢迎关注,电子书浏览地址:

https://k8s.whuanle.cn【适合国内访问】

https://ek8s.whuanle.cn 【gitbook】

滚动更新和回滚

部署应用

首先我们来部署 nginx,使用 nginx 作为练习的镜像。

打开 https://hub.docker.com/_/nginx 可以查询 nginx 的镜像版本,笔者这里选择三个版本:1.19.101.20.0latest,后续我们更新和回滚时,会在这几个版本之间选择。

首先,我们创建一个 Nginx 的 Deployment,副本数量为 3,首次部署的时候,跟之前的操作一致,不需要什么特殊的命令。这里我们使用旧一些的版本,笔者使用的是 1.19.0。

kubectl create deployment nginx --image=nginx:1.19.0 --replicas=3
# 或者
# kubectl create deployment nginx --image=nginx:1.19.0 --replicas=3 --record

执行 kubectl get podskubectl describe pods可以观察到有有三个 Pod,每个 Pod 的 nginx 镜像版本都是 1.19.0。

NAME                     READY   STATUS    RESTARTS   AGE
nginx-85b45874d9-7jlrv   1/1     Running   0          5s
nginx-85b45874d9-h22xv   1/1     Running   0          5s
nginx-85b45874d9-vthfb   1/1     Running   0          5s
Events:
  Type    Reason     Age   From               Message
  ----    ------     ----  ----               -------
  Normal  Scheduled  119s  default-scheduler  Successfully assigned default/nginx-85b45874d9-vthfb to instance-2
  Normal  Pulled     117s  kubelet            Container image "nginx:1.19.0" already present on machine
  Normal  Created    117s  kubelet            Created container nginx
  Normal  Started    117s  kubelet            Started container nginx

更新版本

其实更新 Pod 是非常简单的,我们不需要控制每个 Pod 的更新,也不需要担心会不会对业务产生影响,K8S 会自动控制这些过程。我们只需要触发镜像版本更新事件,K8S 会自动为我们更新所有 Pod 的。

kubectl set image 可以更新现有资源对象的容器镜像,对象包括 PodDeploymentDaemonSetJobReplicaSet。在更新版本中,单个容器的 Pod,对于多个容器的 Pod 行为是差不多的,所以我们使用单容器 Pod 练习即可。

更新 Deployment 中的镜像版本,触发 Pod:

kubectl set image deployment nginx nginx=nginx:1.20.0

格式为:

kubectl set image deployment {deployment名称} {镜像名称}:={镜像名称}:{版本}
12-03 12:45