k8s的deployment是最常用的workload,也是基础设施扩缩容基础。deployment的作用:
- 发布应用
- 升级应用
- 回退应用
- 扩缩容
deployment的yaml
![](https://img.haomeiwen.com/i6301972/f298e3483e3649c2.png)
从上到下四个圈依次是:
- deployment元信息
- 选择器信息
- replicate信息
- pod模板信息
deployment的结构
![](https://img.haomeiwen.com/i6301972/ca0b92fc7d4405c0.png)
deployment创建出replicate,然后由replicate负责pod的创建。
使用命令实验一下
kubectl apply -f deployment.yaml
kubectl get deployments
![](https://img.haomeiwen.com/i6301972/1fea9b69cb461e2a.png)
kubectl get rs
![](https://img.haomeiwen.com/i6301972/411e04e96585c1b9.png)
kubectl get pods
![](https://img.haomeiwen.com/i6301972/3306ad9f4401dfa5.png)
从名字上可以很清楚的看到ref关系,rs的名字是deployment的名字+rs编号,pod的名字是rs的名字+pod的Hash。
pod升级
可以有两种方法,一种是将yaml中的容器版本修改一下,重新apply一次,另外一种显示的进行修改,这里我们看一看显示的进行修改
···
set image deployment nginx-deploy nginx-deployment=nginx:1.8
···
升级完成后kubectl get pods,
![](https://img.haomeiwen.com/i6301972/22f05f9b0facbc90.png)
可以看到ReplicaSet的编号和pods的编号都改变了,说明发生了一些事情
kubectl get rs
![](https://img.haomeiwen.com/i6301972/662d1ed56ab5ce86.png)
可以看到rs,其中编号尾号77的rs是正在运行中的,那这个过程发生了什么呢?
![](https://img.haomeiwen.com/i6301972/e680272745069093.png)
如图升级的过程,是创建出新的rs,旧的rs上的pod逐个删除掉,rscontroller在新的rs上创建出新的pod。
扩容
···
kubectl edit deployment nigix-deploy
···
修改replica为3,然后使用kubectl get pods查看
![](https://img.haomeiwen.com/i6301972/699474e2f3eb7217.png)
可以看到原有的两个pod没有变化,并且在同样一个rs上新增了一个pod
![](https://img.haomeiwen.com/i6301972/22a06df204e71d54.png)
扩容的示意图如上
回滚
此时我们先查看一下历史
kubectl rollout history deployment nginx-deploy
![](https://img.haomeiwen.com/i6301972/c174a7425e11ef96.png)
一共有两次历史,一次是首次,第二次是升级,然后就是当前的扩容了。
kubectl rollout undo deployment nginx-deploy
可以看到会回退到老的rs上
为什么会这么工作
主要是k8s控制器的工作原理,控制器会执着的循环,直到当前状态达到期望状态,这里有两个控制器,一个deployment控制器,一个rs控制器
![](https://img.haomeiwen.com/i6301972/041dcf95d168bbff.png)
- 我们看到如果是扩缩容,就会创删rs
-
否则,仅仅更新rs
rs controller
- 如果接到的是创删rs,则会调api进行创建删除pod
- 如果仅仅是对rs更新,则会调api对pod进行更新
小结
通过原理可以看到,rs是维系多版本的关键,而rs的数量是进行扩缩容的关键,这样一个设计是比较巧妙而且强大的。
网友评论