寫在前面的話api
上一節主要簡單的提了一下控制器都有哪些經常使用的,而且簡單的功能是啥,最後一併提了 ReplicaSet 控制器。app
可是 ReplicaSet 通常不須要咱們直接配置,多以從本節開始,開始學習 K8S 默認的控制器 Deployment。ide
Deployment 資源清單學習
和 rs 同樣,deployment 咱們也能夠簡寫成 deploy,先簡單的看下其資源清單的結構,以下表:測試
deployment | ||||
---|---|---|---|---|
apiVersion | apps/v1 | |||
kind | Deployment | |||
metadata | 和其餘 metadata 同樣,包括 name / labels 等 | |||
spec | ||||
minReadySeconds | 最小準備時間 | |||
paused | 暫停 | |||
replicas | 副本數量 | |||
revisionHistoryLimit | 歷史版本保存數量,默認 10 | |||
rollbackTo | ||||
revision | 回滾到指定版本 | |||
selector | ||||
matchExpressions | 標籤選擇器 | |||
matchLabels | 標籤選擇器(通常用這個) | |||
strategy | ||||
rollingUpdate | ||||
maxSurge | 能被同一時間升級容許的最大 Pod 數,能夠是數字或百分比 | |||
maxUnavailable | 同一時間不容許升級數,能夠是數字或者百分比 | |||
type | 選擇方式,能夠是 RollingUpdate(默認)或者 Recreate | |||
template | ||||
metadata | Pod 的 metadata | |||
spec | Pod 的 spec |
Deployment 示例spa
apiVersion: apps/v1 kind: Deployment metadata: name: deploy-demo namespace: default spec: replicas: 2 selector: matchLabels: app: erp release: stable template: metadata: name: deploy-container namespace: default labels: app: erp release: stable spec: containers: - name: myapp image: ikubernetes/myapp:v1 imagePullPolicy: IfNotPresent ports: - name: http containerPort: 80 - name: https containerPort: 443
運行:咱們這裏將再也不使用 create 根據配置文件建立,而是使用 apply 建立:code
# 建立 kubectl apply -f deploy-demo.yaml # 查看 kubectl get deploy
kubectl get rs kubectl get pods
結果如圖:blog
咱們說過 Deployment 屬於 ReplicaSet 的更上層,因此咱們建立 Deploy 以後是能夠查看到 ReplicaSet 的,並且根據命名的特色咱們也能夠發現:資源
Deploy --> ReplicaSet --> Pod 命令屬於一級一級的增長。其中 rs 名字後面的隨機數其實際是模板名稱的 hash 值。get
此時咱們能夠作個升級測試,修改 yaml 中的鏡像版本由 v1 改成 v2:
kubectl apply -f deploy-demo.yaml
再度應用配置查看:
kubectl get pods -l app=erp -w
經過該方法咱們能夠看到整個過程,完成後查看 rs:
kubectl get rs -o wide
結果如圖:
能夠看到原來 v1 版本的 rs 在運行變成了 0,而 v2 版本的變成了 2,可是 v1 版本的 rs 並未刪除。
這是因爲咱們保存歷史版本的緣由,也就是:
kubectl rollout history deployment deploy-demo
結果如圖:
使用打補丁的方式直接修改 Pod 數量:
kubectl patch deployment deploy-demo -p '{"spec":{"replicas":3}}'
結果如圖:
一樣,咱們可使用另外的方法更新,好比更新鏡像版本:
kubectl set image deployment deploy-demo myapp=ikubernetes/myapp:v3
結果如圖:
在更新過程當中,咱們可使用 pause 暫停實現金絲雀發佈:
kubectl rollout pause deployment deploy-demo
那麼他會根據更新策略進行一次更新後暫停,等待下次 resume 後徹底更新:
kubectl rollout resume deployment deploy-demo
這裏就不作過多演示了。
一樣,回滾歷史版本:
kubectl rollout undo deployment deploy-demo --to-revision=2
結果如圖:
小結
其實對於 Deployment,咱們須要記憶的並很少,由於以前的 Pod 和 RS 中已經將底層的知識記了一遍,咱們在這裏只是至關於在他的外面繼續套了一層套子。