Helm 作為 Kubernetes 的套件管理器,簡化了應用程式的佈署和管理。理解 Helm Chart 的安裝、升級、回復和解除安裝流程對於有效管理 Kubernetes 應用程式至關重要。本文將逐步講解這些操作,並結合實際案例說明每個步驟的細節和注意事項。此外,我們也會探討 Helm Chart 的組成結構、YAML 和 JSON 格式的運用,以及如何自訂 Chart 的值檔案。這些知識將幫助你更好地理解 Helm 的運作機制,並在實際應用中更加得心應手。

在 Kubernetes 環境中佈署應用程式時,Helm Chart 提供了便捷的封裝和管理方式。透過 Helm,我們可以輕鬆地安裝、升級、回復和解除安裝應用程式,而無需手動管理大量的 Kubernetes 資原始檔。這篇文章將會探討 Helm Chart 的運作機制,並提供詳細的操作,幫助你更好地理解和使用 Helm。從 Chart 的結構、YAML 和 JSON 格式的解析,到實際的安裝、升級、回復和解除安裝流程,本文都將提供清晰的說明和示例。此外,文章還會涵蓋一些常見問題的解答,例如 Helm Hub 的使用、helm gethelm show 的區別、--set--values 的用法差異,以及如何檢視 Release 的版本歷史記錄等。

操作 Helm Chart:安裝、升級、回復與解除安裝

在使用 Helm 管理 Kubernetes 應用程式的生命週期時,瞭解如何安裝、升級、回復以及解除安裝 Helm Chart 是至關重要的。玄貓將帶領你探討這些操作,並提供具體的案例和解說。

安裝 Helm Chart

當你在 Helm Hub 上搜尋並選擇了一個適合的 WordPress Chart 後,第一步是將該 Chart 的倉函式庫新增到你的本地環境中。這可以透過以下命令完成:

helm repo add bitnami https://charts.bitnami.com/bitnami

接著,你需要更新本地倉函式庫資訊:

helm repo update

現在,你可以透過 helm search 命令來搜尋特定的 Chart:

helm search repo wordpress

找到適合的 Chart 後,你可以使用 helm install 命令來安裝它:

helm install wordpress bitnami/wordpress -n chapter3 --create-namespace

內容解密:

  • helm repo add:將新的 Chart 倉函式庫新增到本地環境。
  • helm repo update:更新本地倉函式庫資訊,確保你能夠取得最新的 Chart。
  • helm search repo:搜尋倉函式庫中的 Chart。
  • helm install:安裝指定的 Chart。

升級 Helm Chart

安裝完成後,你可能需要根據需求升級應用程式。這可以透過 helm upgrade 命令來實作。例如,升級 WordPress Chart:

helm upgrade wordpress bitnami/wordpress -n chapter3 --set image.tag=v2.0.0

內容解密:

  • helm upgrade:升級指定的 Chart 到最新版本。
  • --set:動態設定 Chart 的值,這裡設定了應用程式的映像版本。

回復 Helm Chart

在某些情況下,應用程式可能因為升級而變得不穩定。這時你可以使用 helm rollback 命令來回復到之前的穩定版本:

helm rollback wordpress 3 -n chapter3

這條命令會將 WordPress 的版本回復到第三個版本。

內容解密:

  • helm rollback:回復到指定版本的 Chart。
  • --revision:指定要回復到的版本號。

解除安裝 Helm Chart

當你不再需要某個應用程式時,可以使用 helm uninstall 命令來解除安裝它:

helm uninstall wordpress -n chapter3

內容解密:

  • helm uninstall:解除安裝指定的 Chart。
  • --keep-history:保留解除安裝前的歷史記錄(選擇性引數)。

清理 Kubernetes 環境

在完成上述操作後,你可能需要清理 Kubernetes 環境。首先,刪除相關的名稱空間:

kubectl delete namespace chapter3

接著,停止 Minikube VM:

minikube stop

內容解密:

  • kubectl delete namespace:刪除指定的名稱空間。
  • minikube stop:停止 Minikube VM。

自訂與除錯

在實際操作中,你可能需要自訂值檔案或除錯 Helm Chart。以下是一些常用命令:

  • 取得當前Chart的值:

    helm get values wordpress -n chapter3
    

    內容解密:

    • helm get values: 輸出當前Chart的值
  • 展示Chart值以便除錯:

    helm show values bitnami/wordpress > values.yaml
    

    內容解密:

    • helm show values: 展示chart中預設值以供調整

問題與回答

  1. Helm Hub 是什麼?如何使用它來查詢 Charts 和 Charts 倉函式庫?

    • Helm Hub 是一個公共倉函式庫,包含了各種可用的 Helm Charts。你可以透過瀏覽器存取它並搜尋特定的 Charts 或倉函式庫。
  2. helm gethelm show 的區別在哪裡?

    • helm get 用於取得已安裝 Release 的值或資源。
    • helm show 用於展示未安裝 Charts 的資源或值。
  3. 在安裝和升級命令中 --set--values 的區別是什麼?

    • --set 用於動態設定單個值。
    • --values 用於指定一個包含多個值的 YAML 檔案。
  4. 如何檢視 Release 的版本歷史記錄?

    • 使用 helm history RELEASE_NAME -n NAMESPACE 命令。
  5. 沒有提供值時升級 Release 的預設行為是什麼?

    • 沒有提供值時,升級操作會保持原有組態不變。
  6. 如果有五個版本且回復到第三個版本,helm history 命令會顯示什麼?

    • 它會顯示所有五個版本,並標記第三個版本為「已佈署」。
  7. 如何檢視某名稱空間中的所有 Releases?

    • 使用 helm list -n NAMESPACE 命令。
  8. 如何列出新增到倉函式庫中的所有 Charts?

    • 使用 helm search repo REPO_NAME

下一步

在掌握了以上操作後,玄貓建議進一步學習如何建立和除錯自己的 Helm Charts。這將幫助你更深入地理解 Helm 的結構和功能。

推薦閱讀

要進一步瞭解新增倉函式庫、檢查 Charts 和使用生命週期命令,請參考 Helm 官方檔案


此圖示展示了從安裝到解除安裝過程中各命令和步驟之間邏輯關係:

  graph TD;
    A[Search for a WordPress chart] --> B[Add repository];
    B --> C[Inspect the chart];
    C --> D[Create custom values file];
    D --> E[Install the chart];
    E --> F[Upgrade the release];
    F --> G[Rollback to previous revision];
    G --> H[Uninstall the release];

透過以上操作和深入瞭解每個步驟的原理和考量,玄貓相信大家能夠更好地掌握 Helm 在 Kubernetes 中應用程式管理中的關鍵技巧。

Helm Charts 技術深度分析

在前一章節中,玄貓已經介紹如何從使用者的角度使用 Helm,作為一個 Kubernetes 的套件管理器來安裝應用程式。當使用 Helm 時,玄貓並不需要深入瞭解 Kubernetes 或應用程式的細節,因為所有的資源和邏輯都包含在 Helm Chart 中。玄貓只需熟悉 Chart 提供的值來自訂安裝。

本章節將轉換重點,從使用 Helm Charts 到深入瞭解它們的運作原理及建立過程。為此,我們將探討以下主題:

  • YAML 格式的理解
  • Chart 範本的理解
  • Chart 定義的理解
  • 生命週期管理
  • HelM Chart 的檔案撰寫

技術需求

本章節需要在本地機器上安裝 Helm 二進位制檔案。這個工具的安裝和組態在第二章「準備 Kubernetes 和 Helm 環境」中有詳細說明。

YAML 格式的理解

YAML Ain’t Markup Language(YAML)是一種用於建立人類可讀組態的檔案格式。它是最常用來組態 Kubernetes 資源的檔案格式,也是 Helm Chart 中許多檔案使用的格式。

YAML 檔案採用鍵值對(key-value)格式來宣告組態。讓我們來探討 YAML 的鍵值對結構。

定義鍵值對

最基本的 YAML 鍵值對範例如下:

name: LearnHelm

在這個範例中,name 是鍵,LearnHelm 是值。在 YAML 中,鍵和值由冒號(:)分隔,冒號左側的是鍵,右側的是值。空白也很重要:

name:LearnHelm

這行並不構成有效的鍵值對,因為冒號和 LearnHelm 之間缺少空白。這會導致解析錯誤。冒號和值之間必須有一個空白。

雖然前面的範例只是簡單的鍵值對,但 YAML 允許使用者組態更複雜的巢狀元素或區塊。以下是一個範例:

resources:
  limits:
    cpu: 100m
    memory: 512Mi

這個範例展示了一個 resources 物件包含一個包含兩個鍵值對的對映:

Keys are determined by following the indentation under a YAML block. Each indentation adds a dot (.) separator to the name of the key. The value of the key has been reached when there are no longer any indentations remaining in the YAML block. By common practice, indentations in YAML should use two spaces, but users can provide as many spaces as they desire as long as the spacing is consistent throughout the document.

注意事項

請注意,YAML 不支援 Tab 鍵,使用 Tab 鍵會導致解析錯誤。

瞭解了 YAML 的鍵值對後,讓我們來探討一些常見的值型別。

值型別

YAML 檔案中的值可以有不同的型別。最常見的是字串(string),字串是文字值。字串可以透過將值包裹在引號中來宣告,但這並不是必需的。如果一個值至少包含一個字母或特殊字元,那麼它就是一個字串,無論是否有引號。多行字串可以使用管道符號(|)來設定:

configuration: |
  server.port=8443
  logging.file.path=/var/log

值也可以是整數(integer)。當一個值是沒有被引號包裹的數字時,它就是整數:

replicas: 1

而這段 YAML 則將 replicas 賦予了字串值:

replicas: '1'

布林值(Boolean)也經常使用,可以用 true 或 false 來宣告:

ingress:
  enable: true

這段 YAML 將 ingress.enable 設定為 true 布林值。其他可接受的布林值包括 yes、no、on、off、y、n、Y 和 N。

此外,價值得以設定為更複雜的型別,例如列表(list)。YAML 中列表中的專案由破折號(-)符號標識:

servicePorts:
  - 8080
  - 8443

這段 YAML 將 servicePorts 設定為包含整數(如 8080 和 8443)的列表。這種語法也可以用來描述物件列表:

deployment:
  env:
    - name: MY_VAR
      value: MY_VALUE
    - name: SERVICE_NAME
      value: MY_SERVICE

在此情況下,env 被設定為一個包含 name 和 value 欄位的物件列表。列表在 Kubernetes 和 Helm 組態中經常使用,理解它們對於充分利用 Helm 的潛力非常有價值。

儘管 YAML 在 Kubernetes 和 Helm 的世界中更常被使用是因為其易讀性,JavaScript Object Notation(JSON)格式也是可以使用的。讓我們簡要描述這種格式。

JSON 格式

YAML 是另一種廣泛使用格式——JSON 的超集。JSON 是一串鍵值對,類別似於 YAML。主要區別在於:YAML 僅依賴空白和縮排來正確組態鍵值對,而 JSON 則依賴大括號和方括號。

以下範例將前面提到的 YAML 轉換為 JSON 型態:

{
 "deployment": {
   "env": [
     {
       "name": "MY_VAR",
       "value": "MY_VALUE"
     },
     {
       "name": "SERVICE_NAME",
       "value": "MY_SERVICE"
     }
   ]
 }
}

JSON 中所有鍵都包裹在引號內並放置在冒號之前:

  • 大括號 {} 用來表示區塊,與 YAML 中縮排表示區塊相似。
  • 中括號 [] 用來表示列表,與 YAML 中破折號表示列表相似。

以上介紹已經提供了足夠資訊來理解如何在 Helm Charts 中使用 YAML 和 JSON。

Helm Chart 建構

如玄貓在前面章節所提到過的一樣,Helm Chart 是 Kubernetes 資源封裝的一種方式,允許使用者佈署各種複雜程度應用程式至 Kubernetes 。但是要被視為一個 Helm Chart ,它必須遵循特設定檔案結構。

假設有一個名叫 my-chart 的頂層目錄作為 Helm Chart 的名稱:

my-chart/
# chart files and directories

目前採用這樣子命名方式是最佳實踐之一並且非技術規範強制要求之事項所以會簡化識別Helm chart 名稱

以下是頂層目錄下可能包含之檔案與目錄之列表: 此圖示

  classDiagram
    direction LR

    class my-chart{
        +Chart.yaml : Object File.
        +values.yaml : Object File.
        +templates/ : Directory.
        +charts/ : Directory.
        +README.md : Markdown File.
        +LICENSE : License File.
    }

    class templates{
        +ConfigMap.yaml : Object File.
        +Deployment.yaml : Object File.
        +Service.yaml : Object File.
    }

    class charts{
        +dependencies/ : Directory.

    }

    my-chart --> templates : Contains.
    my-chart --> charts : Contains.

當中以 Chart.yaml 與 values.yaml 作為主軸並且以 templates/ 與 charts/ 作為其他子目錄進行收納資源檔案及其相關依賴性檔案。 所有具有 .tgz 檔案副檔名之資源則可視作為可佈署之資源檔案。 完整範例如下:

my-chart/
|-- Chart.yaml          # Helm chart metadata and information about the chart itself.
|-- values.yaml         # Default configuration values for the chart.
|-- templates/          # Kubernetes manifest templates.
|   |-- configmap.yaml   # Example ConfigMap template.
|   |-- deployment.yaml # Example Deployment template.
|   |-- service.yaml     # Example Service template.
|-- charts/             # Directory for chart dependencies (optional).
|   |-- dependencies/   # Subdirectory for dependency charts (optional).
|-- README.md           # Documentation for the chart (optional).
|-- LICENSE             # License information for the chart (optional).

詳細解說如下:

  • Chart.yaml:包含 Helm Chart 後設資料以及關於該 Chart 本身之詳細資訊。
  • values.yaml:預設組態值供該 Chart。
  • templates/:Kubernetes 清單範本。
  • charts/:Chart 的依賴性目錄(選擇性)。
  • README.md:該 Chart 的檔案(選擇性)。
  • LICENSE:該 Chart 的授權資訊(選擇性)。

範本範例及解說

範本解密:

此圖示展示了完整之 helm chart 資料夾結構及其內部檔案名稱以及其運作原理。 Helm chart 資料夾底下會含有:Chart.yaml、values.yaml、templates/、charts/、README.md、LICENSE等幾種型別之檔案並且以 templates/ 作為範本內容及以 charts/ 作為相關依賴性內容

範本解密:

Helm chart 資料夾底下會含有:Chart.yaml、values.yaml、templates/、charts/、README.md、LICENSE等幾種型別之檔案並且以 templates/ 作為範本內容及以 charts/ 作為相關依賴性內容