iT邦幫忙

2021 iThome 鐵人賽

DAY 14
0
DevOps

DevOps 好想學!新手也能打造雲端 Study Lab系列 第 14

Day14 - Google Kubernetes Engine 基礎 - Deployment 介紹

  • 分享至 

  • xImage
  •  

什麼是 Deployment ?

前幾天的教學中我們使用 Pod 加上 Service 在 Kubernetes 裡構建應用,這樣的作法只適合在開發環境中測試,因為 Pod 並不是一個穩定的元件,隨時都有可能停止服務,所以若是以單一 Pod 作為生產環境,服務就有可能因 Pod 失效而終止。

https://ithelp.ithome.com.tw/upload/images/20210913/20139235PDpUi1CEl5.png

Pod 失效後,就沒辦法提供服務了。

如何解決這樣的問題,簡單的方法就是對 Pod 做橫向擴展,在叢集中複製多個相同 Pod 同時提供服務,當其中某個 Pod 掛掉時,流量會導入到其他正常運行的 Pod ,這樣就能避免服務中斷。

透過 Deployment 元件,就可以根據使用者期望的數量複製多個相同的 Pod ,若有 Pod 失效, 也會依照宣告數量啟動新的 Pod,並且有著滾動更新、版本回溯等功能,有了 Deployment 元件就可以輕鬆在生產環境部屬並維護應用程式,

https://ithelp.ithome.com.tw/upload/images/20210913/20139235z1hWodaMdc.png

上圖為三副本數的 Deployment 架構,當其中的 Pod 失效了,服務還是能夠正常運行,並且 Deployment 也會啟動新的 Pod 來取代。

環境建置

首先來把部屬 Deployment 的環境準備好。

  1. 進入 Cloud Shell 網站,點擊終端機輸入指令

  2. 列出所有的 project ,找到之前所創建專案的 PROJECT_ID

gcloud projects list

  1. 點擊倒三角形->點選專案的 PROJECT_ID,開啟專案 Terminal

  1. 建立 mydeployment.yaml 檔案
cd ~/k8s-test && touch mydeployment.yaml
  1. 點擊左上 Explorer -> Open Folder -> 選擇 k8s-test 資料夾 -> Open

  1. 使用Kubectl get <type>查看之前創建的 Pod
kubectl get pods

(輸出結果)

NAME    READY   STATUS    RESTARTS   AGE
mypod   1/1     Running   0          2d11h

為了不影響實驗環境,我們先將此 Pod 刪除掉。Kubernetes 除了將 yaml 檔用來部屬,也可以使用kubectl delete -f <file>指令,根據 yaml 檔案提供的資訊來刪除元件。

  1. 使用 kubectl delete -f <file>刪除 Pod
kubectl delete -f mypod.yaml

(輸出結果)

pod "mypod" deleted
  1. 再次使用Kubectl get <type>查看 Pod
kubectl get pods

(輸出結果)

No resources found in default namespace.

可以看到 Pod 被成功刪除。

使用 Deployment 部屬服務

接著就來實際操作如何建置 Deployment 吧!

  1. 點擊mydeployment.yaml檔案並貼上以下內容,並將<your iamge name>改成之前建立的 Image Name

https://ithelp.ithome.com.tw/upload/images/20210914/20139235pt0svlLd1H.png

這裡的 Image 是在 Day08 所建立的 Node 應用

  • mydeployment.yaml
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
    • name: 指定 Deployment 的名稱
  • spec
    • replicas: 需要建立多少 Pod
    • selector: 選擇 Deployment 規則要使用在哪些 Pod,通常會指定 template 中設定的 label
    • template: 此 Deployment 要建立的 Pod 資訊

設定完成就可以用 yaml 檔案來建置。

  1. 使用kubectl apply -f <file>建置 Deployment
kubectl apply -f mydeployment.yaml

使用kubectl get <type>就能夠查看 Deployment 元件。

  1. 查看 Deployment 元件
kubectl get deployments

(輸出結果)

NAME           READY   UP-TO-DATE   AVAILABLE   AGE
mydeployment   3/3     3            3           21s

可以看到成功建立了三個 Pod 並都正常運行,使用kubectl get pods來實際確認看看。

  1. 查看 pod 元件
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 ,看看會發生什麼情況。

  1. 刪除 Pod 其中一個,將<Pod Name>改為其中一個 Pod 的名稱。
kubectl delete pod <Pod Name>

(輸出結果)

pod "mydeployment-5c956d7866-jb7t4" deleted
  1. 再次查看 pod 元件
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 正常運行。

  1. 查看之前創建的 Service 元件,找到myserviceEXTERNAL-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
  1. 開啟瀏覽器,輸入網址後送出
http://<EXTERNAL-IP>

服務也能夠正常運行,代表 Deployment 建置成功。

總結

在這幾天的教學中,是不是覺得 Pod、Service、Deployment 等 k8s 元件建置方式很類似呢,可以簡單歸類成以下順序

  1. 根據需要的元件( 如 Service、Deployment )建立相關 yaml 檔案
  2. 使用 kubectl apply -f <file> 建置元件
  3. 監控、維護服務

Kubernetes 的元件介紹就先暫時停在這,在之後的實戰篇中會根據使用情形學習更多元件。


上一篇
Day13 - Google Kubernetes Engine 基礎 - 使用 Service 暴露服務
下一篇
Day 15 - 使用 Helm 打包 Kubernetes 應用程式
系列文
DevOps 好想學!新手也能打造雲端 Study Lab30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言