步步驚心:從頭部署服務到 Kubernetes (三)

如何使用和設定 Deployment

Duan Li
Brobridge - 寬橋微服務
5 min readApr 25, 2020

--

Photo by Christopher Burns on Unsplash

到前一篇「步步驚心:從頭部署服務到 Kubernetes (二)」為止,部署與測試原則上都可以運作了,但實際應用時,會發現還是有些不方便的地方。例如說,雖然 Service 和 Ingress 設定一次就好,但是每次改完程式後,都要刪除 Pod 然後重新建立。

為了處理這個需求,這篇要帶入 Kubernetes 另一個資源叫 Deployment。
在開始之前,先確定你已經把之前建立的 Pod 、Service 都先移除:

$ kubectl delete pods hellonode
$ kubectl delete svc hellonode

建立 Deployment

首先用指令來建立 Deployment,有兩種下指令的方式,第一種和建立 Pod 的方式很接近,但這個方式是在未知的某個時間點後可能會被移除的語法,不過截至目前為止都還能正常使用。

第二種是官方建議的語法,下面會兩種方法並列。兩個方式比較起來,第一種方式比較容易記憶,而且提供的參數比較多,使用起來比較有彈性:

$ kubectl run hellonode --image=duanli/hello-node  # 第一種
$ kubectl create deployment hellonode --image=duanli/hello-node # 第二種

搭配 Deployment ,建立 Service 的語法也稍微調整一下:

$ kubectl expose deployment hellonode --port=80 --target-port=3000

因為 Ingress 沒有改變,可以測試一下是否還能運作:

$ curl --resolve hello.node.minikube:80:192.168.64.2  http://hello.node.minikubeHello World!

為什麼要用 Deployment?

從前面執行結果看來,與沒有使用 Deployment 好像沒有差,為什麼要用 Deployment 呢?

Deployment 具有下列的功能:

  • Deployment 裡可以設定 Pod 的數量,也就是可以設定要部署幾份一樣的 Pod,所以一旦如果有 Pod 死掉,會自動重新部署並恢復到指定的 Pod 數量
  • 當 Pod 被移除時,Deployment 會再自動建立(或者說,Deployment 可以維持 Pod 的數量)
  • Deployment 有版本控制的功能,也就是說當變更 Deployment 所設定的 image 後,可以透過指令將 Pod rollback 到之前部署的 image 版本。

目前已經以 Deployment 來部署,可以用指令刪除 Pod 來確認這項功能:

可以看到刪除後會自動出現一個新的 Pod,除了 Pod 名稱不太一樣之外,後面的 AGE 欄位也可以看出這個 Pod 是新建立的。

Deployment 對於開發測試有什麼幫助?

在建立 container image 時,可以替 image 加上 tag,作為標示這個 image 的版本或特性,如果在建立 image 時沒有指定 tag,則會自動建立名稱為 latest 的 tag。

可以用指令查看:

$ docker images duanli/hello-node
REPOSITORY TAG IMAGE ID CREATED SIZE
duanli/hello-node latest 0715233fb703 34 hours ago 71.3MB

同一個 image 可以加上不同的 tag:

$ docker tag duanli/hello-node duanli/hello-node:0.0.1
$ docker images duanli/hello-node
REPOSITORY TAG IMAGE ID CREATED SIZE
duanli/hello-node 0.0.1 0715233fb703 34 hours ago 71.3MB
duanli/hello-node latest 0715233fb703 34 hours ago 71.3MB

當我們針對同一個 tag 的 image 做調整時,可以刪除 Pod ,等 Deployment 自動拉下新的 image 建立新的 Pod。

或是有新增修改一些功能要變更 image tag 時,可以用指令讓 Deployment 用取得指定 tag 的 image 取代原本的 Pod。

$ kubectl set image deployment/hellonode hello-node=duanli/hello-node:0.0.1 --record
$ kubectl get pods -l app=hellonode -o jsonpath='{.items[0].spec.containers[0].image}'
duanli/hello-node:0.0.1
$ kubectl rollout history deployment hellonode

上面第二行指令,是在 Pod 重新建立後,可以驗證一下 image 是不是更新了。而第三行指令則是檢查 Deployment 變動的歷史紀錄,指令的結果沒有貼出來,可以自行驗證看看。

結語

這篇內容只有把 Pod 改成 Deployment,對開發者而言可能並沒有太明顯的感覺。但因為在實際運作上,絕大多數都不會單純以 Pod 方式來部署,而且對開發者來說,用 Deployment 部署多少還是有一些優點,也不會比較困難,因此可以盡量以 Deployment 的方式來進行部署與測試。

下一篇會來介紹有關部署後除錯的一些方式。

<<上一篇 | 下一篇>>

--

--

Duan Li
Brobridge - 寬橋微服務

All we do crumbles to the ground, though we refuse to see, dust in the wind, all we are is dust in the wind