Google Code Prettify

2020年4月17日 星期五

K8s: Deployment

在「K8s: ReplicaSet」及「K8s: Service」兩篇,已經有說明了,當 docker hub 上有個 image,怎麼將它部署到 Kubernetes 上,並讓外部可以訪問到它。兩個步驟可以合併成一個步驟如下:
  1. apiVersion: apps/v1
  2. kind: ReplicaSet
  3. metadata:
  4. name: host
  5. spec:
  6. replicas: 3
  7. selector:
  8. matchLabels:
  9. app: host
  10. template:
  11. metadata:
  12. labels:
  13. app: host
  14. spec:
  15. containers:
  16. - name: host
  17. image: twleader/host
  18. ---
  19. apiVersion: v1
  20. kind: Service
  21. metadata:
  22. name: host-svc
  23. spec:
  24. type: LoadBalancer
  25. ports:
  26. - name: http
  27. port: 8080
  28. targetPort: 9080
  29. selector:
  30. app: host
注意看第 18 行,有 --- 將原本兩個 yaml 隔開合併成一個檔,透過這種方式,可以合併多個 yaml 檔,這樣部署可以快一點,但是,對 K8s 來說,這是比較低階的做法,K8s 另外提供了 Deployment 這個更高階部署 rs 的方法,yaml 可以如下:
  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: host
  5. spec:
  6. replicas: 3
  7. template:
  8. metadata:
  9. name: host
  10. labels:
  11. app: host
  12. spec:
  13. containers:
  14. - image: twleader/host:latest
  15. name: host
指令一定要如下,不能忽略後面的 --record !! (原因後面說明)
  1. kubectl create -f xxxx.yaml --record
使用 Deployment 比之前的做法好,這是完全交給 K8s 幫我們決定怎麼部署,除了比較容易外,還可以達到滾動式部署! (Service 還是要另外創建) 假如我們提供的服務不能中斷,換版時希望新版還沒有啟動前,舊版程式要持續提供服務,那麼使用 Deployment,改變第 14 行的版號,讓 K8s 部署新版本,K8s 會先創建新版的 pod 及 ReplicaSet,並等新版的 pod 完全啟動後,再逐步的刪除舊版的 pod。如果要下指令的話,如下:
  1. kubectl set image deployment host host=twleader/host
名稱取的不太好,說明一下,第一個 host 是 deployment 的名稱,接著 host=twleader/host 是指,命名為 host 的 container 要由 twleader/host 這個 image 產生。在滾動更新的過程,如果要知道更新的狀況,可以下這個指令:
  1. kubectl rollout status deployment host
部署好之後,使用 kubectl get po 可以看到舊的 pod 一個一個慢慢消失,使用 kubectl get rs 觀察,則會發現如下,
舊的 ReplicaSet 並沒有被刪除! 這方便當發現新版程式有錯,想要回到舊版時,可以更快速,要怎麼回到舊版呢? 可以使用 undo 如下:
  1. kubectl rollout undo deployment host
事實上,K8s 每次部署都會記錄下每個版本,我們可以回滾到任何一個歷史版本,先看一下 history 指令:
  1. kubectl rollout history deployment host
顯示如下:
之前 create deployment 時有加 --record 的話,這裡的 CHANGE-CAUSE 欄位才會有值,方便我們辨識該版本,我這邊因為都用 create 的方式,如果檔名取不同名稱可以看的出兩個版本的不同,如果是用下指令的,在 image 後面的版號就可以看出版本間的差異,要回到任何一個版本,可以下 undo 並加上 --to-revision 參數:
  1. kubectl rollout undo deployment host --to-revision=2
要特別注意的是,K8s 的版本紀錄是保存在 ReplicaSet 裡,所以舊的 ReplicaSet 不要手動刪除,否則就無法回滾了!

沒有留言:

張貼留言