前幾天的教學中我們使用 Pod 加上 Service 在 Kubernetes 裡構建應用,這樣的作法只適合在開發環境中測試,因為 Pod 並不是一個穩定的元件,隨時都有可能停止服務,所以若是以單一 Pod 作為生產環境,服務就有可能因 Pod 失效而終止。
Pod 失效後,就沒辦法提供服務了。
如何解決這樣的問題,簡單的方法就是對 Pod 做橫向擴展,在叢集中複製多個相同 Pod 同時提供服務,當其中某個 Pod 掛掉時,流量會導入到其他正常運行的 Pod ,這樣就能避免服務中斷。
透過 Deployment 元件,就可以根據使用者期望的數量複製多個相同的 Pod ,若有 Pod 失效, 也會依照宣告數量啟動新的 Pod,並且有著滾動更新、版本回溯等功能,有了 Deployment 元件就可以輕鬆在生產環境部屬並維護應用程式,
上圖為三副本數的 Deployment 架構,當其中的 Pod 失效了,服務還是能夠正常運行,並且 Deployment 也會啟動新的 Pod 來取代。
首先來把部屬 Deployment 的環境準備好。
進入 Cloud Shell 網站,點擊終端機輸入指令
列出所有的 project ,找到之前所創建專案的 PROJECT_ID
gcloud projects list
PROJECT_ID
,開啟專案 Terminalmydeployment.yaml
檔案cd ~/k8s-test && touch mydeployment.yaml
左上 Explorer -> Open Folder -> 選擇 k8s-test 資料夾 -> Open
Kubectl get <type>
查看之前創建的 Podkubectl get pods
(輸出結果)
NAME READY STATUS RESTARTS AGE
mypod 1/1 Running 0 2d11h
為了不影響實驗環境,我們先將此 Pod 刪除掉。Kubernetes 除了將 yaml 檔用來部屬,也可以使用kubectl delete -f <file>
指令,根據 yaml 檔案提供的資訊來刪除元件。
kubectl delete -f <file>
刪除 Podkubectl delete -f mypod.yaml
(輸出結果)
pod "mypod" deleted
Kubectl get <type>
查看 Podkubectl get pods
(輸出結果)
No resources found in default namespace.
可以看到 Pod 被成功刪除。
接著就來實際操作如何建置 Deployment 吧!
mydeployment.yaml
檔案並貼上以下內容,並將<your iamge name>
改成之前建立的 Image Name這裡的 Image 是在 Day08 所建立的 Node 應用
apiVersion: apps/v1
kind: Deployment
metadata:
name: mydeployment
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: mycontainer
image: <your iamge name>
ports:
- containerPort: 8080
apiVersion
kind
metadata
spec
設定完成就可以用 yaml 檔案來建置。
kubectl apply -f <file>
建置 Deploymentkubectl apply -f mydeployment.yaml
使用kubectl get <type>
就能夠查看 Deployment 元件。
kubectl get deployments
(輸出結果)
NAME READY UP-TO-DATE AVAILABLE AGE
mydeployment 3/3 3 3 21s
可以看到成功建立了三個 Pod 並都正常運行,使用kubectl get pods
來實際確認看看。
kubectl get pods
NAME READY STATUS RESTARTS AGE
mydeployment-5c956d7866-jb7t4 1/1 Running 0 50s
mydeployment-5c956d7866-pkxg9 1/1 Running 0 50s
mydeployment-5c956d7866-qbsgj 1/1 Running 0 50s
嘗試刪除其中一個 Pod ,看看會發生什麼情況。
<Pod Name>
改為其中一個 Pod 的名稱。kubectl delete pod <Pod Name>
(輸出結果)
pod "mydeployment-5c956d7866-jb7t4" deleted
kubectl get pods
NAME READY STATUS RESTARTS AGE
mydeployment-5c956d7866-9bdhn 1/1 Running 0 18s
mydeployment-5c956d7866-pkxg9 1/1 Running 0 2m29s
mydeployment-5c956d7866-qbsgj 1/1 Running 0 2m29s
會看到還是有三個 Pod,而其中一個是新建立的,代表 Deployment 會自動調整 Pod 數量。接著測試服務能不能透過 Deployment 正常運行。
myservice
的EXTERNAL-IP
kubectl get svc
(輸出結果)
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.3.240.1 <none> 443/TCP 2d18h
myservice LoadBalancer 10.3.253.46 34.150.28.184 80:30254/TCP 42h
http://<EXTERNAL-IP>
服務也能夠正常運行,代表 Deployment 建置成功。
在這幾天的教學中,是不是覺得 Pod、Service、Deployment 等 k8s 元件建置方式很類似呢,可以簡單歸類成以下順序
kubectl apply -f <file>
建置元件Kubernetes 的元件介紹就先暫時停在這,在之後的實戰篇中會根據使用情形學習更多元件。