Helm Chart 提供了強大的 Kubernetes 應用程式封裝和佈署功能。理解 Hooks 的生命週期管理對於有效控制佈署流程至關重要,可以透過權重和刪除策略精細調整 Hooks 的執行順序和資源清理。Helm Chart 的檔案撰寫,包含 README.md、LICENSE 和 NOTES.txt,對於提升 Chart 的可讀性和易用性至關重要。一個良好的 Helm Chart 應該包含清晰的前置條件說明、Values 引數定義和應用程式存取方式等資訊。此外,NOTES.txt 可以動態生成應用程式佈署後的存取資訊,方便使用者快速上手。透過 Guestbook 應用程式的 Helm Chart 建置範例,可以學習如何定義 Chart 的後設資料、Values 引數、Deployment、Service 和 Ingress 等資源,並瞭解如何封裝和佈署 Chart 到 Chart 儲存函式庫。最後,文章提供的常見問題解答涵蓋了 Helm Chart 開發過程中常見的疑惑,例如 Kubernetes 和 Helm 中常用的 YAML 格式、Chart.yaml 的必填欄位、依賴項的覆寫、資料函式庫升級的快照策略、Chart 檔案的撰寫、範本中重複 YAML 塊的生成、Chart.yaml 和 Chart.lock 的區別、Hooks 的定義以及範本中函式和管道的使用等,有助於讀者更全面地理解和應用 Helm Chart。
Helm Chart的使用技巧
瞭解 Helm Hooks
在 Helm Charts 的生命週期中,hooks 提供了一種有效的方式來管理各個階段的操作。你可以根據需要定義多個 hooks,並且在同一個生命週期階段中組態多個 hooks。這些 hooks 預設是以名稱的字母順序來排序執行的,但你也可以透過設定 helm.sh/weight 註解來自訂其順序。
apiVersion: batch/v1
kind: Job
metadata:
name: my-job
annotations:
'helm.sh/hook': post-install
'helm.sh/hook-weight': "5"
spec:
template:
spec:
containers:
- name: my-container
image: my-image
內容解密:
在這個範例中,我們建立了一個 Kubernetes Job 資源,並且使用了 helm.sh/hook 註解來指定這個 Job 在 chart 安裝後執行。此外,我們還使用了 helm.sh/hook-weight 註解來設定這個 hook 的權重為 5。Helm 會根據權重值來排序 hooks,權重值較低的 hook 會先執行。
當多個 hooks 有相同的權重值時,Helm 會迴歸到預設的字母順序排序。這種靈活的組態方式讓你可以精確控制 hooks 的執行順序,以滿足特定的應用需求。
移除 Hooks
與一般範本資源不同的是,hooks 在執行 helm uninstall 命令時並不會被移除,因為它們不被 Helm 追蹤或管理。因此,你需要採取其他策略來移除 hooks。
helm.sh/hook-delete-policy 註解
你可以在與 hook 関聯的 Pod 或 Job 上指定 helm.sh/hook-delete-policy 註解來控制何時移除資源。以下是可用的選項:
- before-hook-creation: 在建立 hook 之前移除資源。
- hook-succeeded: 在 hook 執行成功後移除資源。
- hook-failed: 在 hook 執行失敗後移除資源。
apiVersion: batch/v1
kind: Job
metadata:
name: my-job
annotations:
'helm.sh/hook': post-install
'helm.sh/hook-delete-policy': hook-succeeded
spec:
template:
spec:
containers:
- name: my-container
image: my-image
內容解密:
在這個範例中,我們設定了 helm.sh/hook-delete-policy 註解為 hook-succeeded,這意味著只有當 hook 執行成功後才會移除相關資源。這樣可以確保在 hook 執行失敗時不會意外移除資源。
TTL (Time-To-Live)
Kubernetes 提供了 TTL 機制來限制資源在完成後保留的時間。你可以透過設定 job 的 ttlSecondsAfterFinished 屬性來實作這一點。
apiVersion: batch/v1
kind: Job
metadata:
name: ttl-job
annotations:
'helm.sh/hook': post-install
spec:
ttlSecondsAfterFinished: 60
內容解密:
在這個範例中,我們設定了 ttlSecondsAfterFinished 屬性為 60,這意味著 job 在完成或失敗後會被保留 60 秒鐘,然後自動移除。這種機制可以避免不必要的資源佔用。
Helm Chart 的檔案撰寫
良好的檔案撰寫對於 Helm Chart 的使用者經驗至關重要。Helm 支援幾種常見的檔案格式來幫助使用者理解和操作 chart。
README.md 檔案
README.md 是 Helm Chart 中最重要的檔案之一,通常包含以下內容:
- 前置條件:例如建立 secret 或設定 Kubernetes 叢集中的其他組態。
- 值(Values):描述 chart 中的各種可組態值、其功能及預設值。
- 應用特定資訊:提供應用安裝後如何存取和操作的詳細說明。
# My Helm Chart
## Prerequisites
Before installing this chart, you need to create a secret in your Kubernetes cluster.
## Values
| Name | Description | Default |
|---------------|-----------------------|---------|
| replicaCount | Number of replicas | 2 |
## Application Information
After installation, you can access the application at `http://<your-domain>`.
LICENSE 檔案
LICENSE 檔案用於描述 chart 的使用和分發許可權。你可以選擇常見的開源許可證,例如 Apache License 2.0 或 MIT License。
Apache License, Version 2.0
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
templates/NOTES.txt 檔案
NOTES.txt 檔案用於提供應用安裝後的使用。與 README.md 不同的是,NOTES.txt 檔案可以透過 Go 範本動態生成。
Congratulations! You have successfully installed My Helm Chart.
To access your application, visit http://{{ .Values.service.host }}.
次段落標題:serviceType 值組態
假設你有一個名為 serviceType 的值組態在 values.yaml 檔案中:
## serviceType can be set to NodePort or LoadBalancer.
serviceType: NodePort
你可以在 NOTES.txt 中動態參照這個值:
Your service type is set to {{ .Values.serviceType }}.
次段落標題:Helm Hooks 的靈活組態
Hooks 提供了一種靈活的方式來管理 Helm Chart 的生命週期事件。透過適當地設定權重和刪除策略,你可以精確控制 hooks 的執行順序和刪除時機,從而確保應用在各個階段都能正常執行。此外,透過檔案化 chart 的前置條件、可組態值和應用資訊,可以幫助使用者更好地理解和操作 chart。
次段落標題:針對特定需求進行資源保留
在某些情況下,你可能希望在執行 helm uninstall 命令時保留某些資源,例如持久性儲存區(PersistentVolumeClaim)。你可以透過使用 helm.sh/resource-policy 註解來實作這一點:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-pvc
annotations:
'helm.sh/resource-policy': keep
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
次段落標題:內容解密:PersistentVolumeClaim 資源保留策略
在這個範例中,我們設定了 helm.sh/resource-policy 註解為 keep,這意味著即使在執行 helm uninstall 命令時也會保留這個 PVC 資源。這樣可以確保持久性儲存區中的資料不會被意外刪除。需要注意的是,被保留的資源會成為孤兒資源(orphaned resource),因此需要手動刪除以避免潛在的命名衝突或其他問題。
此圖示展示了 Helm Hooks 在不同生命週期階段的執行順序及其相關組態。
```mermaid
graph TD;
A[Helm Release] --> B[Pre-install Hooks];
B --> C[Install Resources];
C --> D[Post-install Hooks];
D --> E[Upgrade Resources];
E --> F[Post-upgrade Hooks];
F --> G[Delete Resources];
G --> H[Post-delete Hooks];
次段落標題:內容解密:Helm Hooks 生命週期圖示說明
此圖示展示了 Helm Release 在不同生命週期階段所涉及到的一系列操作流程及其相關組態。從 Pre-install Hooks 引導至 Post-delete Hooks 各階段之間形成一個完整的生命週期管理流程圖表展示:
- Pre-install Hooks:在安裝之前執行一些必要操作。
- Install Resources:安裝所需的 Kubernetes 資源。
- Post-install Hooks:安裝完成後進行一些必要操作。
- Upgrade Resources:更新已有的 Kubernetes 資源。
- Post-upgrade Hooks:更新完成後進行一些必要操作。
- Delete Resources:刪除已有 Kubernetes 資源。
- Post-delete Hooks:刪除完成後進行一些必要操作。
透過合理設計 hooks 和其權重以及刪除策略等設定引數可完整控管每一個生命週期階段之間流程。
利用 Helm 建置 Kubernetes 應用程式
在上一章中,玄貓已經介紹了 Helm 圖表的各個組成部分。現在是時候將這些知識應用於實際操作,建置一個 Helm 圖表。學會如何建置 Helm 圖表,能夠讓你將複雜的 Kubernetes 應用程式封裝成簡單易佈署的形式。
在這一章中,玄貓將引導你建置一個佈署 Guestbook 應用程式的 Helm 圖表,這是 Kubernetes 社群中常見的快速啟動應用程式。這個圖表將遵循 Kubernetes 和 Helm 圖表開發的最佳實踐,提供一個良好編寫且易於維護的自動化解決方案。在開發過程中,你將學到許多技能,這些技能可以應用於建置你自己的 Helm 圖表。最後,你將學到如何封裝你的 Helm 圖表並佈署到圖表儲存函式庫中,讓它對最終使用者更容易存取。
建置 Guestbook 應用程式的 Helm 圖表
首先,我們需要建立一個新的 Helm 圖表目錄。可以使用以下命令來初始化一個新的 Helm
helm create guestbook
這個命令會在當前目錄中建立一個名為 guestbook 的目錄,並且包含一些基本的檔案和資料夾結構。
Chart.yaml 檔案
接下來,我們需要編輯 Chart.yaml 檔案,這是 Helm 圖表的後設資料檔案。以下是一個範例 Chart.yaml 檔案:
apiVersion: v2
name: guestbook
description: A Helm chart for the Guestbook application
version: 0.1.0
appVersion: "1.0"
值檔案(values.yaml)
接下來,我們需要編輯 values.yaml 檔案,這是用來定義預設值的檔案。以下是一個範例 values.yaml 檔案:
replicaCount: 2
image:
repository: gcr.io/heptio-images/ks-guestbook-demo
tag: "0.1"
pullPolicy: IfNotPresent
service:
type: NodePort
port: 80
ingress:
enabled: false
resources: {}
範本檔案(templates/)
在 templates/ 資料夾中,我們需要建立一些 Kubernetes 資源範本檔案。以下是一些基本的範本檔案範例:
deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Release.Name }}-guestbook
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
app: guestbook
template:
metadata:
labels:
app: guestbook
spec:
containers:
- name: guestbook
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
ports:
- containerPort: 80
service.yaml
apiVersion: v1
kind: Service
metadata:
name: {{ .Release.Name }}-guestbook
spec:
type: {{ .Values.service.type }}
ports:
- port: {{ .Values.service.port }}
targetPort: 80
nodePort: {{ .Values.service.nodePort }}
protocol: TCP
name: http
ingress.yaml(可選)
如果你想要使用 Ingress 控制器來存取應用程式,可以建立一個 ingress.yaml 範本檔案:
{{- if .Values.ingress.enabled -}}
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: {{ .Release.Name }}-guestbook
spec:
rules:
- host: guestbook.example.com
http:
paths:
- pathType: Prefix
path: /
backend:
service:
name: {{ .Release.Name }}-guestbook
port:
number: {{ .Values.service.port }}
{{- end }}
包裝和佈署 Helm 圖表
在完成所有範本檔案後,我們可以使用以下命令來封裝 Helm
helm package guestbook/
這個命令會生成一個名為 guestbook-0.1.0.tgz 的壓縮檔案。你可以將這個壓縮檔案推播到圖表儲存函式庫中,讓其他使用者能夠輕鬆地安裝你的應用程式。
推播到圖表儲存函式庫
推播到圖表儲存函式庫之前,你需要組態 Helm 儲存函式庫。以下是一些基本步驟:
- 建立一個新的儲存函式庫:
helm repo add my-repo https://my-repo-url.com/charts/
- 推播壓縮檔案到儲存函式庫:
helm push guestbook-0.1.0.tgz my-repo/
指引檔案(NOTES.txt)
為了讓使用者更容易理解如何存取應用程式,我們可以建立一個 templates/NOTES.txt 檔案。以下是一個範例:
Follow these instructions to access your application.
{{- if eq .Values.service.type "NodePort" }}
export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath='{.spec.ports[0].nodePort}' services {{ .Release.Name }})
export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath='{.items[0].status.addresses[0].address}')
echo "URL: http://$NODE_IP:$NODE_PORT"
{{- else }}
export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ .Release.Name }}-guestbook --template '{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}')
echo "URL: http://$SERVICE_IP"
{{- end }}
推薦閱讀
要了解更多關於建置 Helm 圖表的基本知識,可以參考 Helm 說明檔案中的 Chart Template Guide 頁面。Charts 頁面也描述了許多本章節中討論的主題,包括圖表檔案結構、依賴性以及 Chart.yaml 檔案。
常見問題與解答
在建置和佈署過程中,可能會遇到一些常見問題。以下是一些問題和解答:
-
Kubernetes 和 Helm 中最常使用的檔案格式是什麼?
- YAML 是 Kubernetes 和 Helm 中最常使用的檔案格式。
-
Chart.yaml 檔案中的三個必填欄位是什麼?
apiVersion,name, 和version是Chart.yaml檔案中的三個必填欄位。
-
如何參考或覆寫圖表依賴項中的值?
- 傳統上要參考或覆寫依賴項中的值可以直接定義在主 Chart 的 values.yaml 或直接修改依賴 Chart 的 values。
-
如何在升級資料函式庫之前確保取得資料快照?
- 在進行升級之前定義資料函式庫快照掛鉤(hook),使其能夠先執行快照操作再進行升級。
-
作為圖表開發者,可以建立哪些檔案來提供使用者檔案並簡化安裝過程?
- 包括 README.md、templates/NOTES.txt 和 LICENSE 檔案等來提供詳細說明及簡化安裝過程。
-
在圖表範本中使用哪種架構來生成重複的 YAML 塊?
- Go 範本語法中的迴圈(range)和條件判斷(if)等結構可以用於生成重複的 YAML 塊。
-
Chart.yaml 檔案與 Chart.lock 檔案有什麼區別?
- Chart.yaml 是手動編寫的人類可讀後設資料組態檔;Chart.lock 是自動生成的快照檔以記錄具體版本和依賴項。
-
定義資源作為掛鉤的註解名稱是什麼?
- 名為
hook的註解或標籤可以定義資源作為掛鉤(hook)。
- 名為
-
在範本中函式和管道有什麼作用?有哪些常見函式?
- 函式和管道可進行資料轉換、處理與調整;常見函式如 toYaml、include、required 或 default 則可用於處理條件判斷或預設值設定。