k8s的deployment是最常用的workload,也是基礎(chǔ)設(shè)施擴縮容基礎(chǔ)。deployment的作用:
- 發(fā)布應(yīng)用
- 升級應(yīng)用
- 回退應(yīng)用
- 擴縮容
deployment的yaml

從上到下四個圈依次是:
- deployment元信息
- 選擇器信息
- replicate信息
- pod模板信息
deployment的結(jié)構(gòu)

deployment創(chuàng)建出replicate,然后由replicate負(fù)責(zé)pod的創(chuàng)建。
使用命令實驗一下
kubectl apply -f deployment.yaml
kubectl get deployments

kubectl get rs

kubectl get pods

從名字上可以很清楚的看到ref關(guān)系,rs的名字是deployment的名字+rs編號,pod的名字是rs的名字+pod的Hash。
pod升級
可以有兩種方法,一種是將yaml中的容器版本修改一下,重新apply一次,另外一種顯示的進(jìn)行修改,這里我們看一看顯示的進(jìn)行修改
···
set image deployment nginx-deploy nginx-deployment=nginx:1.8
···
升級完成后kubectl get pods,

可以看到ReplicaSet的編號和pods的編號都改變了,說明發(fā)生了一些事情
kubectl get rs

可以看到rs,其中編號尾號77的rs是正在運行中的,那這個過程發(fā)生了什么呢?

如圖升級的過程,是創(chuàng)建出新的rs,舊的rs上的pod逐個刪除掉,rscontroller在新的rs上創(chuàng)建出新的pod。
擴容
···
kubectl edit deployment nigix-deploy
···
修改replica為3,然后使用kubectl get pods查看

可以看到原有的兩個pod沒有變化,并且在同樣一個rs上新增了一個pod

擴容的示意圖如上
回滾
此時我們先查看一下歷史
kubectl rollout history deployment nginx-deploy

一共有兩次歷史,一次是首次,第二次是升級,然后就是當(dāng)前的擴容了。
kubectl rollout undo deployment nginx-deploy
可以看到會回退到老的rs上
為什么會這么工作
主要是k8s控制器的工作原理,控制器會執(zhí)著的循環(huán),直到當(dāng)前狀態(tài)達(dá)到期望狀態(tài),這里有兩個控制器,一個deployment控制器,一個rs控制器

- 我們看到如果是擴縮容,就會創(chuàng)刪rs
-
否則,僅僅更新rs
rs controller - 如果接到的是創(chuàng)刪rs,則會調(diào)api進(jìn)行創(chuàng)建刪除pod
- 如果僅僅是對rs更新,則會調(diào)api對pod進(jìn)行更新
小結(jié)
通過原理可以看到,rs是維系多版本的關(guān)鍵,而rs的數(shù)量是進(jìn)行擴縮容的關(guān)鍵,這樣一個設(shè)計是比較巧妙而且強大的。
