iT邦幫忙

2021 iThome 鐵人賽

DAY 15
0
DevOps

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

Day 15 - 使用 Helm 打包 Kubernetes 應用程式

  • 分享至 

  • xImage
  •  

Helm 介紹

https://ithelp.ithome.com.tw/upload/images/20210915/20139235W3C0qiVylh.jpg

在前幾天中我們使用各種 yaml 檔案來建立應用,隨著設定檔越來越多,安裝、管理起來就變的更加麻煩,而 Helm 就是為解決這樣問題的套件,可以將 yaml 檔案給包裝成名叫 Chart 的集合,讓使用者可以輕鬆建立、安裝、管理 Kubernetes 應用程式。

Helm 有點類似 apt 與 yum 這種軟體套件系統,只是專門設計給 Kubernetes 來用。

Helm 環境建置

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

  2. 使用kubectl get all將不同元件列出

kubectl get all

(輸出結果)

NAME                                READY   STATUS    RESTARTS   AGE
pod/mydeployment-5c956d7866-2bw8z   1/1     Running   0          9h
pod/mydeployment-5c956d7866-pkxg9   1/1     Running   0          9h
pod/mydeployment-5c956d7866-qbsgj   1/1     Running   0          9h

NAME                 TYPE           CLUSTER-IP    EXTERNAL-IP     PORT(S)        AGE
service/kubernetes   ClusterIP      10.3.240.1    <none>          443/TCP        3d4h
service/myservice    LoadBalancer   10.3.253.46   34.150.28.184   80:30254/TCP   2d3h

NAME                           READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/mydeployment   3/3     3            3           9h

NAME                                      DESIRED   CURRENT   READY   AGE
replicaset.apps/mydeployment-5c956d7866   3         3         3       9h

在前幾篇的教學中我們透過 yaml 檔案建置了不同元件,現在使用kubectl delete -f <file>指令根據 yaml 檔案把元件給清除。

  1. 使用kubectl delete -f <file>刪除之前創建的元件
cd ~/k8s-test
kubectl delete -f .

(輸出結果)

deployment.apps "mydeployment" deleted
service "myservice" deleted
Error from server (NotFound): error when deleting "mypod.yaml": pods "mypod" not found
  1. 再次使用kubectl get all把不同元件列出
kubectl get all
NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.3.240.1   <none>        443/TCP   3d4h

環境就清除乾淨了。

因為 myservice 有使用到 GCP 的 Load Balancer,所以刪除會花一點時間。

接著來準備 Helm 應用,Helm 在 Cloud Shell 已經安裝好了,可以直接使用。

  1. 查看 Helm 版本
helm version

(輸出結果)

version.BuildInfo{Version:"v3.5.0", GitCommit:"32c22239423b3b4ba6706d450bd044baffdcf9e6", GitTreeState:"clean", GoVersion:"go1.15.6"}

本次使用的是 Helm v3 版本。

  1. 使用helm create <name>建立 Helm Chart
cd ~
helm create webapp

會產生目錄內容如下

webapp/
├── charts
├── Chart.yaml
├── templates
│   ├── deployment.yaml
│   ├── _helpers.tpl
│   ├── hpa.yaml
│   ├── ingress.yaml
│   ├── NOTES.txt
│   ├── serviceaccount.yaml
│   ├── service.yaml
│   └── tests
│       └── test-connection.yaml
└── values.yaml

在 templates 中我們只需要 service.yaml 以及 deployment.yaml 檔案,其他的可以刪掉。

  1. 將不必要的檔案給刪除
cd ~/webapp/templates && rm _helpers.tpl hpa.yaml ingress.yaml NOTES.txt serviceaccount.yaml tests/test-connection.yaml
cd ~

產生新的目錄內容如下

webapp
├── charts
├── Chart.yaml
├── templates
│   ├── deployment.yaml
│   ├── service.yaml
│   └── tests
└── values.yaml

建立 Helm Chart

環境建置好了就可以準備 Chart ,我們將之前建立mydeployment.yamlmyservice.yaml檔試著打包到 Chart 裡。

  1. 點擊左上 Explorer -> Open Folder -> 選擇 webapp 資料夾 -> Open

https://ithelp.ithome.com.tw/upload/images/20210915/20139235oYklMj4XcB.png

資料夾裡主要會有三個物件

  • Chart.yaml

    • Chart 的版本、名稱
  • values.yaml

    • 定義 Chart 的參數,可以將參數代入到 templates 的原件
  • templates

    • 定義 Chart 的元件(如 service、deployment)

之前的章節中我們建立了 deployment 與 service 的物件如下

  • 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
  • myservice.yaml
apiVersion: v1
kind: Service
metadata:
  name: myservice
spec:
  type: LoadBalancer
  ports:
  - protocol: TCP
    port: 80
    targetPort: 8080
  selector:
    app: myapp

這些 yaml 檔案的某些內容如名稱、image、type 等等是有可能會做修改的,可以做為參數整理到values.yaml檔案裡面。

  1. 點擊values.yaml檔案並以下面內容取代,且將<your iamge name>改成之前建立的 Image Name

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

https://ithelp.ithome.com.tw/upload/images/20210915/20139235xOAIZi4G6Z.png

  • values.yaml
app:
  replicaCount: 3
  image:
    repo: <your iamge name>
    tag: v1
  service:
    type: LoadBalancer
    port: 80

接著在templates資料夾中把需要的yaml檔案放進去,並將需要帶入的內容用{{ 參數 }}取代。

  1. 點擊templates/deployment.yaml檔案並以下面內容取代

https://ithelp.ithome.com.tw/upload/images/20210915/20139235cPMCeB0Lxe.png

  • deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ .Release.Name }}
spec:
  replicas: {{ .Values.app.replicaCount }}
  selector:
    matchLabels:
      app: {{ .Release.Name }}
  template:
    metadata:
      labels:
        app: {{ .Release.Name }}
    spec:
      containers:
        - name: {{ .Release.Name }}
          image: {{ .Values.app.image.repo }}:{{ .Values.app.image.tag }}
          ports:
            - containerPort: 8080
  • {{ .Release.Name }}
    • 發布的名稱
  • {{ .Values.app.replicaCount }}
    • 在 valuses.yaml 檔案定義,設定副本數量
  • {{ .Values.app.image.repo }}{{ .Values.app.image.tag }}
    • 在 valuses.yaml 檔案定義,設定要使用的 Image 名稱

透過參數的方式,將可能更動的地方提取出來,之後要做改動只要在 valuses.yaml 檔案修改就行。

  1. 點擊templates/service.yaml檔案並以下面內容取代

https://ithelp.ithome.com.tw/upload/images/20210915/20139235QoqVuli2r8.png

  • service.yaml
apiVersion: v1
kind: Service
metadata:
  name: {{ .Release.Name }}
spec:
  type: {{ .Values.app.service.type }}
  ports:
  - protocol: TCP
    port: {{ .Values.app.service.port }}
    targetPort: 8080
  selector:
    app: {{ .Release.Name }}
  • {{ .Release.Name }}
    • 發布的名稱
  • {{ .Values.app.service.type }}{{ .Values.app.service.port }}
    • 在 valuses.yaml 檔案定義,設定要使用 Service Type 和 Port

寫好之後,就可以安裝了,使用 helm install <name> <chart> 指令就能夠部屬應用。

  1. 使用 Helm 部屬應用
cd ~/webapp
helm install webapp-dev .

(輸出結果)

NAME: webapp-dev
LAST DEPLOYED: Tue Sep 14 16:24:17 2021
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None

其中的 NAME 就會作為參數傳遞到 {{ .Release.Name }}

部屬成功後,可以使用helm list查看所有發布。

  1. 查看發布詳情
helm list

(輸出結果)

NAME        NAMESPACE  REVISION  UPDATED       STATUS    CHART         APP VERSION
webapp-dev  default    1         2021-09-14xx  deployed  webapp-0.1.0  1.16.0

接著查看Kubernetes 現在的部屬情形。

  1. 使用kubectl get all將不同元件列出
kubectl get all

(輸出)

NAME                              READY   STATUS    RESTARTS   AGE
pod/webapp-dev-6f55fd5b7b-2tkf5   1/1     Running   0          84s
pod/webapp-dev-6f55fd5b7b-8t5lg   1/1     Running   0          84s
pod/webapp-dev-6f55fd5b7b-wvr8k   1/1     Running   0          84s

NAME                 TYPE           CLUSTER-IP     EXTERNAL-IP    PORT(S)        AGE
service/kubernetes   ClusterIP      10.3.240.1     <none>         443/TCP        3d7h
service/webapp-dev   LoadBalancer   10.3.253.213   34.96.199.39   80:30282/TCP   86s

NAME                         READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/webapp-dev   3/3     3            3           85s

NAME                                    DESIRED   CURRENT   READY   AGE
replicaset.apps/webapp-dev-6f55fd5b7b   3         3         3       85s

可以看到應用已建置好了,部屬完成後,要解除安裝也很簡單,helm uninstall <name>就能卸載。

  1. 使用 Helm 解安裝應用
helm uninstall webapp-dev

(輸出結果)

release "webapp-dev" uninstalled
  1. 再查看Kubernetes 部屬情形。
kubectl get all

(輸出結果)

NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.3.240.1   <none>        443/TCP   3d7h

應用程式成功解除安裝。

結論

使用 Helm 工具,就可以讓 Kubernetes 的部屬方式變得更輕鬆簡單,就像我們平常安裝解安裝程式一樣。並且管理設定檔也會更加方便。


上一篇
Day14 - Google Kubernetes Engine 基礎 - Deployment 介紹
下一篇
Day16 - 準備 GitLab 的 GitOps 環境
系列文
DevOps 好想學!新手也能打造雲端 Study Lab30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
seesawin
iT邦新手 5 級 ‧ 2022-02-24 13:57:18

安安,請問下,我照步驟執行完了helm install,查看helm list跟kubectl get all也都正常運行,但是使用網頁預覽8080還是進不去

https://ithelp.ithome.com.tw/upload/images/20220224/20117176kxnrIFNpgO.jpg

https://ithelp.ithome.com.tw/upload/images/20220224/20117176TemhuZbTGF.jpg

https://ithelp.ithome.com.tw/upload/images/20220224/20117176sQcxCCsgHX.jpg

uccuz iT邦研究生 5 級 ‧ 2022-02-24 14:22:30 檢舉

因為本篇是把專案用 helm 的方式部屬到 Kubernetes Cluster 上而非 Cloud Shell,所以從 Cloud Shell 的網頁預覽中看不到東西是很正常的,你應該在瀏覽器輸入 http://<EXTERNAL-IP>,從你的logs看是要輸入 34.92.170.229 這個IP,應該就能看到東西了。
https://ithelp.ithome.com.tw/upload/images/20220224/201392359VuGm6wBPn.png

seesawin iT邦新手 5 級 ‧ 2022-02-24 23:05:52 檢舉

有出現了^^ 感謝/images/emoticon/emoticon07.gif

我要留言

立即登入留言