返回文章列表

Helm Chart 入門:建構 Guestbook 應用程式佈署

本文介紹如何使用 Helm Chart 佈署 Guestbook 應用程式到 Kubernetes 叢集。從理解 Guestbook 應用程式架構開始,逐步引導讀者建立、改進 Helm Chart,並加入 Redis 作為應用程式的依賴服務。文章涵蓋了 Helm Chart 的基本結構、values.yaml

Web 開發 DevOps

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 的套件管理工具。

理解 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 語言