Google Code Prettify

2020年4月17日 星期五

K8s: Deployment

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

沒有留言:

張貼留言