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.yamlvalues.yamltemplates/ 資料夾。我們可以根據需求修改這些檔案來定義 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 資料函式庫中。該應用程式的前端包括一個對話方塊和一個提交按鈕。

應用程式功能

  1. 使用者在訊息對話方塊中輸入訊息。
  2. 點選提交按鈕。
  3. 訊息會被儲存到 Redis 資料函式庫中。

Redis 是一個記憶體中的鍵值儲存系統,本章節中我們將使用叢集模式來進行資料複製。該叢集由一個主節點和多個從節點組成,主節點負責接收來自前端的寫入請求,並將資料複製到從節點上,前端則從這些從節點上讀取資料。

此圖示展示了 Guestbook 前端與 Redis 後端的互動方式:

graph TD
    A[Guestbook 前端] -->|寫入| B[Redis 主節點]
    B -->|複製| C[Redis 從節點]
    A -->|讀取| C

準備環境

為了觀察我們的 Chart 在實際執行中的情況,我們需要設定 Minikube 環境。以下是步驟:

  1. 啟動 Minikube:

    $ minikube start
    
  2. 建立一個名為 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 輔助函式的一些步驟:

  1. 在 Helm Hub 儲存函式庫中搜尋 Redis
$ helm search hub redis
  1. 搜尋結果中會顯示 Bitnami 的 Redis 圖表。這是我們將使用作為依賴項的圖表。如果你還沒有在第三章「安裝您的第一個 Helm 圖表」中新增 bitnami 圖表儲存函式庫,現在可以使用以下命令來新增:
$ helm add repo bitnami https://charts.bitnami.com
  1. 決定要使用哪個版本的 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

  1. 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

必要的覆寫值

  1. fullnameOverride

    • 作用:完全覆寫 Redis 的全名範本。
    • 範例
      fullnameOverride: redis
      
    • 解釋:Redis 依賴項使用 redis.fullname 範本來設定 Redis 主服務和從服務的名稱。Guestbook 應用程式需要這些服務命名為 redis-masterredis-slave,因此我們將 fullnameOverride 設為 redis
  2. usePassword

    • 作用:控制是否使用密碼驗證。
    • 範例
      usePassword: false
      
    • 解釋:Guestbook 應用程式是為不驗證存取設計的,因此我們需要將這個值設定為 false
  3. 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 語言