Helm Chart 提供了一個有效管理 Kubernetes 應用程式的方法。本文將以 Guestbook 應用程式為例,示範如何從零開始建立一個 Helm Chart,並將其佈署到 Kubernetes 叢集中。Guestbook 應用程式是一個簡單的 PHP 前端應用程式,它會將訊息儲存到 Redis 資料函式庫中。我們會使用 Minikube 作為本地的 Kubernetes 環境,並使用 Helm 和 kubectl 進行佈署和管理。首先,我們需要理解 Guestbook 應用程式的架構,它包含一個前端和一個 Redis 後端。前端負責接收使用者輸入的訊息,並將其寫入 Redis 資料函式庫;Redis 則負責儲存這些訊息。為了實作高用性和資料複製,Redis 會以叢集模式執行,包含一個主節點和多個從節點。在開始建立 Helm Chart 之前,我們需要準備好 Minikube 環境,並建立一個名為 chapter5 的名稱空間。接著,我們可以使用 helm create 命令建立一個名為 guestbook 的 Helm Chart 基礎架構。這個命令會產生一些預設的檔案和資料夾,包含 Chart.yaml、values.yaml 和 templates/ 資料夾。我們可以根據需求修改這些檔案來定義 Chart 的行為。由於 Guestbook 應用程式依賴於 Redis,我們需要在 Chart 中加入 Redis 作為依賴項。這可以透過修改 Chart.yaml 檔案,加入 Redis 的儲存函式庫和版本資訊來完成。完成後,使用 helm dependency update 命令下載 Redis Chart。最後,我們需要組態 values.yaml 檔案,設定 Redis 和 Guestbook 前端的相關引數,例如 Redis 的全名覆寫、是否使用密碼驗證、以及 Guestbook 前端的副本數量和資源限制等。
建立第一個 Helm Chart
本文將介紹如何建立 Helm Chart 以佈署 Kubernetes 中的 Guestbook 應用程式。該應用程式由 Kubernetes 社群提供,並且在其官方檔案中有詳細介紹。玄貓將引導讀者從理解應用程式開始,進而建立、改進並釋出該 Helm Chart。
主要內容
- 理解 Guestbook 應用程式
- 建立 Guestbook Helm Chart
- 改進 Guestbook Helm Chart
- 將 Guestbook Chart 釋出到 Chart 儲存函式庫
技術需求
本章節需要以下技術:
- Minikube:用於在本地搭建 Kubernetes 環境。
- kubectl:Kubernetes 命令列工具。
- Helm:Kubernetes 的套件管理工具。
此外,本文的 GitHub 資料函式庫位於 https://github.com/PacktPublishing/-Learn-Helm,我們將參考該資料函式庫中的 helm-charts/charts/guestbook 資料夾。
理解 Guestbook 應用程式
Guestbook 應用程式是一個簡單的 PHP 前端應用程式,設計目的是將訊息持久化到 Redis 資料函式庫中。該應用程式的前端包括一個對話方塊和一個提交按鈕。
應用程式功能
- 使用者在訊息對話方塊中輸入訊息。
- 點選提交按鈕。
- 訊息會被儲存到 Redis 資料函式庫中。
Redis 是一個記憶體中的鍵值儲存系統,本章節中我們將使用叢集模式來進行資料複製。該叢集由一個主節點和多個從節點組成,主節點負責接收來自前端的寫入請求,並將資料複製到從節點上,前端則從這些從節點上讀取資料。
此圖示展示了 Guestbook 前端與 Redis 後端的互動方式:
graph TD
    A[Guestbook 前端] -->|寫入| B[Redis 主節點]
    B -->|複製| C[Redis 從節點]
    A -->|讀取| C
準備環境
為了觀察我們的 Chart 在實際執行中的情況,我們需要設定 Minikube 環境。以下是步驟:
- 
啟動 Minikube: $ minikube start
- 
建立一個名為 chapter5的名稱空間:$ kubectl create namespace chapter5
這個名稱空間將用於佈署 Guestbook Chart。現在,環境已經準備好,我們可以開始撰寫我們的 Chart。
建立 Guestbook Helm Chart
架構初始化
首先,我們需要為 Helm Chart 建立初始檔案結構。這裡使用 helm create 命令來快速生成基礎結構。
$ helm create guestbook
這個命令會在本地建立一個名為 guestbook 的資料夾,內含以下檔案和資料夾:
- charts/:暫時為空,後續會用來存放依賴的其他 Chart。
- Chart.yaml:定義 Chart 的後設資料。
- templates/:定義 Kubernetes 資源範本。
- values.yaml:定義預設的值。
預設情況下,這些檔案已經包含了許多有用的預設設定和範本。我們可以利用這些預設值來加速開發過程。
清理不必要的測試檔案
Helm 在生成 Chart 時會自動包含測試範本資料夾,但我們可以先移除它以便自己在後續章節中撰寫測試。執行以下命令來移除 templates/tests/ 資料夾:
$ rm -rf guestbook/templates/tests
建立 Guestbook Chart 初始結構
繼續進行下去之前,玄貓要確保讀者對基本檔案結構有清楚的瞭解:
guestbook/
├── charts/
├── Chart.yaml
├── templates/
│   ├── deployment.yaml
│   ├── service.yaml
│   └── ...
└── values.yaml
小段落標題:Chart.yaml 檔案
這是定義我們 Chart 的後設資料的檔案。以下是範例內容:
apiVersion: v2
name: guestbook
description: A Helm chart for the Guestbook application.
version: 0.1.0
appVersion: "1.0"
小段落標題:values.yaml 檔案
這裡定義了一些預設值,這些值可以在範本中使用。例如:
replicaCount: 2
image:
  repository: gcr.io/google-samples/gb-frontend:v4
service:
  type: LoadBalancer
resources: {}
小段落標題:templates/ 資料夾
這個資料夾包含 Kubernetes 資源的範本檔案。例如,deployment.yaml 範本可能如下所示:
apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ include "guestbook.fullname" . }}
spec:
  replicas: {{ .Values.replicaCount }}
  selector:
    matchLabels:
      app: {{ include "guestbook.name" . }}
  template:
    metadata:
      labels:
        app: {{ include "guestbook.name" . }}
    spec:
      containers:
        - name: frontend
          image: "{{ .Values.image.repository }}"
          ports:
            - containerPort: 80
接下來…
接下來玄貓會帶領大家進一步改進我們的 Helm Chart,確保它能夠成功佈署 Guestbook 應用程式並在 Kubernetes 中正常執行。
建立您的第一個 Helm 圖表
在 Guestbook 圖表的骨架結構完成後,我們將進一步評估所生成的 Chart.yaml 檔案。這個檔案包含了 Helm 圖表的後設資料。
評估圖表定義
Chart.yaml 檔案是 Helm 圖表的核心後設資料檔案。儘管在第四章「理解 Helm 圖表」中已經詳細討論過,但我們仍然需要重新回顧其中一些主要設定:
- apiVersion:設定為 v1 或 v2(v2 是 Helm 3 的首選)。
- version:Helm 圖表的版本號,應遵循語意化版本控制(SemVer)。
- appVersion:應用程式的版本號,這是由 Helm 圖表佈署的應用程式版本。
- name:Helm 圖表的名稱。
- description:對 Helm 圖表及其設計佈署目標的簡要描述。
- type:設定為 application 或 library。application 型別用於佈署特定應用程式,而 library 型別則包含可供其他圖表使用的輔助函式(也稱為「命名範本」)以減少重複工作。
- dependencies:依賴其他圖表的列表。
當你檢視所生成的 Chart.yaml 檔案時,會發現除了 dependencies 外,其他欄位已經設定完成。我們將這些設定保持預設值,直到相關步驟出現時再進行修改。
此外,一個不在預設設定義中的設定是 dependencies。我們將在下一節中詳細討論這個設定,並新增一個 Redis 依賴項來簡化開發工作。
新增 Redis 圖表依賴
如「瞭解 Guestbook 應用程式」所提到的,這個 Helm 圖表必須能夠佈署一個 Redis 資料函式庫來儲存應用程式狀態。如果從頭開始建立這個圖表,你需要了解如何正確佈署 Redis 到 Kubernetes,並建立相應的範本來佈署它。
反之,透過新增一個已經包含必要邏輯和範本的 Redis 依賴項,可以大幅減少建立 guestbook Helm 圖表的工作量。讓我們透過新增 Redis 依賴來簡化圖表開發。
新增 Redis 輔助函式
以下是新增 Redis 輔助函式的一些步驟:
- 在 Helm Hub 儲存函式庫中搜尋 Redis
$ helm search hub redis
- 搜尋結果中會顯示 Bitnami 的 Redis 圖表。這是我們將使用作為依賴項的圖表。如果你還沒有在第三章「安裝您的第一個 Helm 圖表」中新增 bitnami 圖表儲存函式庫,現在可以使用以下命令來新增:
$ helm add repo bitnami https://charts.bitnami.com
- 決定要使用哪個版本的 Redis 輔助函式。可以透過以下命令檢視可用版本:
$ helm search repo redis --versions
NAME CHART VERSION APP VERSION bitnami/redis 10.5.14 5.0.8 bitnami/redis 10.5.13 5.0.8 bitnami/redis 10.5.12 5.0.8 bitnami/redis 10.5.11 5.0.8 需要選擇的是輔助函式版本而不是應用程式版本。應用程式版本只描述了 Redis 的版本,而輔助函式版本描述了實際的 Helm 輔助函式版本。
你可以選擇一個特定的輔助函式版本或使用萬用字元(例如 10.5.x)。使用萬用字元可以輕鬆地讓你的輔助函式隨著最新 Redis 資料函式庫更新比對該萬用字元(在這個例子中是 10.5.x)。在此例子中,我們將使用 10.5.x。
- 
在 Chart.yaml檔案中新增dependencies欄位。對於 guestbook 輔助函式,我們將其組態為以下最低要求欄位(更多欄位請參考第四章「瞭解 Helm 輔助函式」):- name:依賴項輔助函式名稱
- version:依賴項輔助函式版本
- repository:依賴項輔助函式儲存函式庫 URL
 
請將以下 YAML 語法新增到 Chart.yaml 檔案末尾:
dependencies:
- name: redis
version: 10.5.x
repository: https://charts.bitnami.com
完整 Chart.yaml 檔案應如下所示:
apiVersion: v2
name: guestbook
description: A Helm chart for Kubernetes
type: application
version: 0.1.0
appVersion: "1.16.0"
dependencies:
- name: redis
version: "10.5.x"
repository: "https://charts.bitnami.com"
檢查完整內容後:
下載 Redis 輔助函式
第一次下載依賴項時,應該使用 helm dependency update 命令。此命令會將依賴項下載到 charts/ 資料夾並生成 Chart.lock 檔案,該檔案指定所下載輔助函式之相關後設資料。
$ helm dependency update
接著我們來看一下如何佈署 Guestbook 輔助函式。隨著更多功能被增加進來,Guestbook 輔助函式會變得更加強大且靈活。
分析與改進點
在這個範例中,我們成功地將 Redis 作為 Guestbook 的依賴項新增進去。這不僅展示瞭如何使用外部輔助函式來減少開發工作量,也強調了在 Kubernetes 中管理依賴關係的重要性。
未來可以考慮以下改進點:
- 測試與驗證:確保每次新增或更新依賴項後都進行充分測試和驗證。
- 安全性:確保從可信來源取得依賴項並進行安全掃描。
- 版本控制:規劃好不同環境(如開發、測試、生產)下各自需要的依賴項版本。
透過這些改進點,可以進一步提升 Helm 輔助函式的穩定性和安全性。
建置您的第一個 Helm 圖表
在 Helm 中建置您的第一個圖表時,通常需要管理一些依賴項。本篇文章將帶領您完成一個完整的 Helm 圖表建置過程,從下載依賴項到組態 values.yaml 檔案。這裡以 Redis 作為依賴項來進行說明。
下載 Redis 依賴項
首先,您需要使用 helm dependency update 命令來下載 Redis 依賴項。這個命令會根據您的 Helm 圖表位置來下載所需的依賴項。
$ helm dependency update guestbook
這個命令會從指定的圖表函式庫中下載最新版本的 Redis 圖表,並將其存放在 charts/ 目錄下。您可以透過列出 guestbook/charts 目錄來驗證下載是否成功:
$ ls guestbook/charts
redis-10.5.14.tgz
組態 values.yaml 檔案
接下來,我們需要修改 values.yaml 檔案來組態 Redis 和 Guestbook 前端應用程式。values.yaml 檔案用於提供一組預設引數,這些引數在圖表範本中會被參照。使用者可以在安裝時使用 --set 或 --values 旗標來覆寫這些預設值。
修改 values.yaml 檔案
Helm 的 values.yaml 檔案應該是自檔案化的,包含每個值的直覺名稱和相關說明。這樣使用者和維護者都可以方便地瞭解這些值的作用。
# Example of a well-documented values.yaml file
redis:
  fullnameOverride: redis
  usePassword: false
  configmap: |-
    # Enable AOF https://redis.io/topics/persistence#append-only-file
    appendonly yes
    # Disable RDB persistence, AOF persistence already enabled.
    save ''
組態 Redis 值
雖然新增依賴項可以避免手動建立 Redis 的圖表範本,但您仍然需要覆寫一些值來組態它。我們將使用 helm show values 命令來檢視 Redis 圖表的所有值,然後選擇需要覆寫的值。
檢視 Redis 值
$ helm show values charts/redis-10.5.14.tgz
必要的覆寫值
- 
fullnameOverride - 作用:完全覆寫 Redis 的全名範本。
- 範例:
fullnameOverride: redis
- 解釋:Redis 依賴項使用 redis.fullname範本來設定 Redis 主服務和從服務的名稱。Guestbook 應用程式需要這些服務命名為redis-master和redis-slave,因此我們將fullnameOverride設為redis。
 
- 
usePassword - 作用:控制是否使用密碼驗證。
- 範例:
usePassword: false
- 解釋:Guestbook 應用程式是為不驗證存取設計的,因此我們需要將這個值設定為 false。
 
- 
configmap - 作用:定義 Redis 組態檔案。
- 範例:
configmap: |- # Enable AOF https://redis.io/topics/persistence#append-only-file appendonly yes # Disable RDB persistence, AOF persistence already enabled. save ''
- 解釋:這段組態啟用了 AOF 持久化並停用了 RDB 持久化。
 
建立 Guestbook Helm 圖表
在組態完 Redis 值後,我們還需要修改一些預設值來組態 Guestbook 前端資源。這些值通常在 helm create 命令生成的 values.yaml 檔案中已經有預設設定,我們只需根據需求進行調整。
以下是完整的 values.yaml 檔案範例:
# values.yaml for Guestbook Helm chart
# Configure the Redis dependency
redis:
  fullnameOverride: redis
  usePassword: false
  configmap: |-
    # Enable AOF https://redis.io/topics/persistence#append-only-file
    appendonly yes
    # Disable RDB persistence, AOF persistence already enabled.
    save ''
# Configure the Guestbook frontend resources (add additional configurations as needed)
frontend:
  replicas: 3
  resources:
    limits:
      cpu: "500m"
      memory: "128Mi"
    requests:
      cpu: "250m"
      memory: "64Mi"
#### 內容解密:
# values.yaml for Guestbook Helm chart
# Configure the Redis dependency
# 全部重新命名為 Redis 的全名範本,確保與 Guestbook 應用程式一致。
redis:
  fullnameOverride: redis
# 不使用密碼驗證,確保與 Guestbook 應用程式相容。
usePassword: false
# 組態 Redis 的持久化方式,啟用 AOF 持久化並停用 RDB 持久化。
configmap: |-
    # Enable AOF https://redis.io/topics/persistence#append-only-file
    appendonly yes
    # Disable RDB persistence, AOF persistence already enabled.
    save ''
# Configure the Guestbook frontend resources (add additional configurations as needed)
# 副本數量設定為3,確保高用性。
frontend:
  replicas: 3
# 資源限制設定,確保應用程式有足夠的 CPU 和記憶體資源。
resources:
    limits:
      cpu: "500m"
      memory: "128Mi"
    requests:
      cpu: "250m"
      memory: "64Mi"
上面程式碼主要針對 GuestBook 前端資源進行了資源配額和例項副本數量等一些基本組態。
總結來說,建置第一個 Helm 圖表涉及多個步驟,從下載依賴項到組態 values.yaml 檔案。透過這些步驟,您可以確保您的 Helm 圖表能夠正確地佈署和執行所需的應用程式及其依賴項。希望這篇文章能夠幫助您更好地理解和應用 Helm 語言
 
            