在前幾天中我們使用各種 yaml 檔案來建立應用,隨著設定檔越來越多,安裝、管理起來就變的更加麻煩,而 Helm 就是為解決這樣問題的套件,可以將 yaml 檔案給包裝成名叫 Chart 的集合,讓使用者可以輕鬆建立、安裝、管理 Kubernetes 應用程式。
Helm 有點類似 apt 與 yum 這種軟體套件系統,只是專門設計給 Kubernetes 來用。
進入 Cloud Shell 網站,點擊終端機輸入指令
使用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 檔案把元件給清除。
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
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 已經安裝好了,可以直接使用。
helm version
(輸出結果)
version.BuildInfo{Version:"v3.5.0", GitCommit:"32c22239423b3b4ba6706d450bd044baffdcf9e6", GitTreeState:"clean", GoVersion:"go1.15.6"}
本次使用的是 Helm v3 版本。
helm create <name>
建立 Helm Chartcd ~
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
檔案,其他的可以刪掉。
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
環境建置好了就可以準備 Chart ,我們將之前建立mydeployment.yaml
、myservice.yaml
檔試著打包到 Chart 裡。
左上 Explorer -> Open Folder -> 選擇 webapp 資料夾 -> Open
資料夾裡主要會有三個物件
Chart.yaml
values.yaml
templates
之前的章節中我們建立了 deployment 與 service 的物件如下
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: v1
kind: Service
metadata:
name: myservice
spec:
type: LoadBalancer
ports:
- protocol: TCP
port: 80
targetPort: 8080
selector:
app: myapp
這些 yaml 檔案的某些內容如名稱、image、type 等等是有可能會做修改的,可以做為參數整理到values.yaml
檔案裡面。
values.yaml
檔案並以下面內容取代,且將<your iamge name>
改成之前建立的 Image Name這裡的 Image 是在 Day08 所建立的 Node 應用
app:
replicaCount: 3
image:
repo: <your iamge name>
tag: v1
service:
type: LoadBalancer
port: 80
接著在templates
資料夾中把需要的yaml
檔案放進去,並將需要帶入的內容用{{ 參數 }}
取代。
templates/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 }}
{{ .Values.app.image.repo }}
、{{ .Values.app.image.tag }}
透過參數的方式,將可能更動的地方提取出來,之後要做改動只要在 valuses.yaml 檔案修改就行。
templates/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 }}
寫好之後,就可以安裝了,使用 helm install <name> <chart>
指令就能夠部屬應用。
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
查看所有發布。
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 現在的部屬情形。
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>
就能卸載。
helm uninstall webapp-dev
(輸出結果)
release "webapp-dev" uninstalled
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 的部屬方式變得更輕鬆簡單,就像我們平常安裝解安裝程式一樣。並且管理設定檔也會更加方便。
安安,請問下,我照步驟執行完了helm install,查看helm list跟kubectl get all也都正常運行,但是使用網頁預覽8080還是進不去
因為本篇是把專案用 helm 的方式部屬到 Kubernetes Cluster 上而非 Cloud Shell,所以從 Cloud Shell 的網頁預覽中看不到東西是很正常的,你應該在瀏覽器輸入 http://<EXTERNAL-IP>
,從你的logs看是要輸入 34.92.170.229 這個IP,應該就能看到東西了。
有出現了^^ 感謝