Helm 在 Kubernetes 應用程式管理中扮演著關鍵角色,簡化了應用程式的封裝、佈署和管理流程。本文將引導讀者建構一個佈署 Guestbook 應用程式的 Helm Chart,其中包含前端服務和 Redis 資料函式庫。首先,我們會使用 helm create 命令建立 Chart 的基本架構,接著修改 Chart.yaml 檔案以定義 Chart 的相關資訊,並加入 Redis 作為 Chart 的依賴項。為了確保佈署的順利進行,我們會在 templates 目錄下撰寫 Kubernetes 範本檔案,例如 deployment.yaml,用於定義 Guestbook 前端的佈署規格。為了提高 Chart 的可靠性,我們會加入生命週期鉤子,例如 pre-install-hook,以便在安裝 Chart 前執行一些必要的初始化操作。此外,我們也會在 values.yaml 中定義預設值並在範本中進行驗證,確保輸入值的有效性。最後,我們會將建構好的 Helm Chart 釋出到 GitHub Pages 上,建立一個公開的 Helm Chart 儲存函式庫,讓其他使用者可以方便地使用這個 Chart。文章中也會說明如何驗證 image.repository 輸入值,避免佈署錯誤,以及如何建立和使用 Helm Chart 儲存函式庫。
使用 required 函式
與 fail 一樣,「required」函式也用於停止範本渲染。「required」函式不同之處在於它確保在渲染時不會遺漏任何值。
想像一下你有個影像儲存函式庫名稱為「image.repository」,如下所示:
image:
repository: gcr.io/google-samples/gb-frontend
此值指定佈署的映像檔案資源函式庫位置。 由於此值對於 Helm Chart 是非常重要的一部分所以我們可以運用「required」函式來確保每次都有相對應之值去渲染它。 儘管現在我們提供了預設值但我們仍然能夠移除此預設值以確保每次都有相對應之值去渲染它。 接下來進行以下步驟:
- 在「templates/deployment.yaml」範本檔案中找到那一行指定容器影像根據「image.repository」之值(appName chart settings也能幫助指定容器影像但在此例子中我們只專注image.repository),如下所示:
image: '{{ .Values.image.repository }}:{{ .Chart.AppVersion }}'
- 接著將以下內容複製到「deployment.yaml」中去實作上述邏輯:
deployment.yaml
- 測試所有修改都完成後請執行以下指令:
$ helm upgrade my-guestbook . -n chapter5 --set image.repository=
如果有成功更新我的guestbook release並且所有修改都成功執行完畢, 我們應該會收到類別似以下之錯誤訊息:
Error: UPGRADE FAILED: template: guestbook/templates/deployment.yaml:60:25:
executing "guestbook/templates/deployment.yaml" at <required "You must set image.repository for deployment.">: required value for "image.repository" is not set.
使用 Helm 增強待客簽到書 Helm 圖表
待客簽到書 Helm 圖表是一個簡單且實用的範例,展示瞭如何使用 Helm 來佈署 Kubernetes 應用程式。在本篇中,我們將探討如何對這個圖表進行增強,使其更具靈活性和可靠性。我們將重點放在如何驗證輸入值,以確保圖表的正確性和安全性。
增強待客簽到書佈署檔案
首先,我們需要修改 deployment.yaml 檔案,以確保 image.repository 值必須提供。這可以透過在圖表範本中使用 required 函式來實作。以下是具體步驟:
修改
deployment.yaml檔案: 在deployment.yaml檔案中,我們需要新增一個驗證邏輯,以確保image.repository值必須提供。具體來說,我們需要使用 Helm 的範本語法來實作這一點。apiVersion: apps/v1 kind: Deployment metadata: name: {{ .Release.Name }} spec: replicas: {{ .Values.replicaCount }} selector: matchLabels: app: {{ .Chart.Name }} template: metadata: labels: app: {{ .Chart.Name }} spec: containers: - name: {{ .Chart.Name }} image: "{{ required "image.repository is required" .Values.image.repository }}:{{ .Values.image.tag }}" ports: - containerPort: 80在上述範例中,我們使用了
required函式來確保image.repository值必須提供。如果該值未提供,Helm 將會顯示一個錯誤訊息。測試驗證邏輯: 接下來,我們需要測試這個驗證邏輯。可以透過使用
helm upgrade命令來執行這一步驟。$ helm upgrade my-guestbook . -n chapter5 --set image.repository=''如果我們的修改成功,應該會看到類別似以下的錯誤訊息:
Error: UPGRADE FAILED: execution error at (guestbook/templates/deployment.yaml:28:21): value 'image.repository' is required
建立簡單的圖表儲存函式庫
完成對待客簽到書圖表的增強後,我們可以將其發布到圖表儲存函式庫中,以便其他使用者可以輕鬆地存取和使用。本文將介紹如何使用 GitHub Pages 建立一個簡單的圖表儲存函式庫。
說明:
Helm 圖表儲存函式庫是一種包含 Helm 圖表及其相關元資料的伺服器。它主要由兩部分組成:
- Helm 圖表:以
.tgz封存格式包裝。 - index.yaml 檔案:包含儲存函式庫中圖表的元資料。
建立 GitHub Pages 儲存函式庫
建立 GitHub 儲存函式庫: 首先,我們需要建立一個新的 GitHub 儲存函式庫來儲存我們的圖表。
- 前往 GitHub 網站 並登入您的帳戶。
- 點選右上角的加號(+)按鈕,然後選擇「New repository」。
- 提供儲存函式庫名稱(例如:Learn-Helm-Chart-Repository)。
- 勾選「Initialize this repository with a README」選項。
- 點選「Create Repository」按鈕完成建立。
啟用 GitHub Pages: 建立儲存函式庫後,我們需要啟用 GitHub Pages 以便它可以作為 Helm 圖表儲存函式庫。
- 前往剛剛建立的儲存函式庫。
- 點選頁面頂部的「Settings」標籤。
- 滾動到頁面底部,找到「GitHub Pages」區域。
- 在「Source」下拉選單中選擇「master branch」。
- 儲存更改後,您應該會看到一個成功訊息,並且會顯示您的 GitHub Pages 網站 URL。
複製儲存函式庫: 接下來,我們需要將這個儲存函式庫複製到本地機器上。
$ git clone $REPOSITORY_URL
其中 $REPOSITORY_URL 是您剛剛建立的 GitHub 儲存函式庫 URL。
發行待客簽到書 Helm 圖表
現在我們已經準備好發布待客簽到書 Helm 圖表到我們剛剛建立的 GitHub Pages 儲存函式庫中。以下是具體步驟:
更新圖表版本: 在發布之前,我們需要更新圖表的版本號。開啟
Chart.yaml檔案並更新version欄位為1.0.0:version: 1.0.0封裝圖表: 使用以下命令將待客簽到書圖表封裝成
.tgz封存格式:$ helm package ./guestbook上傳到 GitHub 儲存函式庫: 接下來,將封裝好的
.tgz檔案上傳到您的 GitHub 儲存函式庫中。$ cp guestbook-1.0.0.tgz $REPOSITORY_URL/ $ git add guestbook-1.0.0.tgz index.yaml $ git commit -m "Add guestbook chart" $ git push origin master
至此,我們已經成功地將待客簽到書 Helm 圖表發布到了 GitHub Pages 儲存函式庫中。其他使用者現在可以透過新增這個儲存函式庫來安裝和使用我們的待客簽到書圖表。
從頭開始建構 Helm Chart
在現代的雲端運算與微服務架構中,Helm 成了 Kubernetes 應用程式管理的重要工具。它讓開發者能夠輕鬆地封裝、佈署與管理 Kubernetes 應用程式。玄貓(BlackCat)將帶領你從零開始建構一個 Helm Chart,並將其釋出到 GitHub Pages 上的 Helm Repository。
建構 Helm Chart
首先,讓我們來建構一個簡單的 Helm Chart 來佈署 Guestbook 應用程式。這個應用程式包含了一個前端和一個 Redis 資料函式庫,用來儲存留言。
建立 Helm Chart
首先,我們需要使用 helm create 命令來建立一個新的 Helm Chart。
$ helm create guestbook
這個命令會在當前目錄下建立一個名為 guestbook 的目錄,裡麵包含了所有必要的檔案結構和範例範本。
修改 Chart.yaml
接下來,我們需要修改 guestbook/Chart.yaml 檔案,來定義我們的 Chart 的基本資訊。
apiVersion: v2
name: guestbook
description: A Helm chart for the Guestbook application
version: 1.0.0
appVersion: "1.0"
這些資訊包括了 Chart 的名稱、描述、版本和應用程式版本。
新增 Redis 依賴
Guestbook 應用程式需要 Redis 作為後端資料函式庫,因此我們需要在 guestbook/Chart.yaml 中新增 Redis 的依賴。
dependencies:
- name: redis
version: 10.5.7
repository: https://charts.bitnami.com/bitnami
這樣,當我們封裝這個 Chart 的時候,Helm 會自動下載並安裝 Redis Chart。
編寫範本
接下來,我們需要編寫一些 Kubernetes 範本檔案來佈署 Guestbook 前端和 Redis。這些檔案位於 guestbook/templates/ 目錄中。
例如,我們可以編寫一個 deployment.yaml 檔案來定義 Guestbook 前端的 Deployment。
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Release.Name }}-guestbook
spec:
replicas: 3
selector:
matchLabels:
app: guestbook
template:
metadata:
labels:
app: guestbook
spec:
containers:
- name: guestbook
image: gcr.io/heptio-images/ks-guestbook-demo:v2
ports:
- containerPort: 80
這段範本會建立一個名為 guestbook 的 Deployment,並且會佈署三個副本。
生命週期鉤子與輸入驗證
為了讓我們的 Chart 更加健壯,我們可以新增一些生命週期鉤子(hooks)和輸入驗證。例如,我們可以在 templates/ 目錄中新增一個 pre-install-hook.yaml 檔案來執行一些初始化操作。
apiVersion: batch/v1
kind: Job
metadata:
name: {{ .Release.Name }}-pre-install-hook
annotations:
"helm.sh/hook": pre-install
spec:
template:
spec:
containers:
- name: pre-install-hook
image: busybox
command: ["sh", "-c", "echo 'Pre-install hook executed'"]
restartPolicy: OnFailure
這段範本會在安裝過程中執行一個簡單的命令來標示鉤子已經執行。
驗證輸入
為了確保輸入的合法性,我們可以在 values.yaml 中定義一些預設值,並且在範本中進行驗證。例如:
replicaCount: 3
image:
repository: gcr.io/heptio-images/ks-guestbook-demo
tag: v2
resources:
limits:
cpu: 100m
memory: 128Mi
安裝 Helm Chart
接下來,我們可以使用以下命令來安裝這個 Chart:
$ helm install my-release ./guestbook/
這會在 Kubernetes 叢集中佈署 Guestbook 應用程式。
建立與釋出 Helm Repository
完成測試後,我們可以將這個 Helm Chart 發行到 GitHub Pages 上的 Helm Repository。
測試與清理環境
清理環境之前應該先進行測試以確認每項功能都正常運作。完成後透過以下指令完成環境清理:
$ kubectl delete namespace chapter5
$ minikube stop # 若完成工作則停止 Minikube 叢集。
發行到 GitHub Pages
首先,你需要建立一個新的 GitHub Repository 來儲存你的 Helm Charts。然後,將你的本地目錄克隆到 GitHub 上。例如:
$ git clone https://github.com/yourusername/your-charts-repo.git $GITHUB_CHART_REPO_CLONE
將封裝好的 .tgz 檔案複製到 GitHub Repository 中:
$ cp guestbook-1.0.0.tgz $GITHUB_CHART_REPO_CLONE/
接著生成索引檔案:
$ helm repo index $GITHUB_CHART_REPO_CLONE --url https://yourusername.github.io/your-charts-repo/
最後推播到 GitHub:
$ cd $GITHUB_CHART_REPO_CLONE/
$ git add --all
$ git commit -m 'feat: adding the guestbook helm chart'
$ git push origin master # 提交到遠端主分支。
完成後您就可以透過GitHub Pages將您的Helm Chart Repository提供給社群使用。## 新增 Helm Repository
要讓本地的Helm客戶端能夠使用你剛剛推播至GitHub Pages上的Helm Repository,需要透過以下步驟:
- 取得GitHub Pages URL:請至Repository的Settings頁面找到GitHub Pages URL。
- 新增Repository:使用以下命令將你的Repository新增至本地Helm客戶端中:
$ helm repo add learnhelm https://yourusername.github.io/your-charts-repo/
- 更新本地Repository索引:這樣做才能確保Helm能夠查詢到最新版本的Charts:
$ helm repo update learnhelm # 若是首次新增則不需更新索引。
- 搜尋Chart:透過以下命令確認你剛才發布的Chart是否成功加入Helm Repository:
$ helm search repo guestbook # 搜尋以確認是否成功。
如果一切順利您應該會看到learnhelm/guestbook列於搜尋結果中表示成功安裝。
清理環境
完成所有步驟之後應該要進行最後一次檢查以確保每項功能都正常運作。檢查無誤後透過以下指令完成環境清理:
$ kubectl delete namespace chapter5 # 清除Kubernetes namespace。
# 若完成工作則停止 Minikube 叢集。
# 若叢集不需長期執行則考慮停止 Minikube 叢集以節省資源。
$ minikube stop # 停止 Minikube 叢集以節省資源。