使用 Helm

本指南說明了使用 Helm 管理 Kubernetes 叢集上套件的基本知識。它假設您已經 安裝 了 Helm 用戶端。

如果您只是想執行幾個快速命令,您可以從 快速入門指南 開始。本章涵蓋 Helm 命令的細節,並解釋如何使用 Helm。

三大概念

圖表 是一個 Helm 套件。它包含在 Kubernetes 叢集中運行應用程式、工具或服務所需的所有資源定義。您可以將其視為 Homebrew 公式、Apt dpkg 或 Yum RPM 檔案的 Kubernetes 等效物。

倉庫 是收集和共享圖表的地方。它就像 Perl 的 CPAN 存檔Fedora 套件資料庫,但適用於 Kubernetes 套件。

發佈 是在 Kubernetes 叢集中運行的圖表的實例。一個圖表通常可以安裝到同一個叢集中很多次。每次安裝時,都會建立一個新的發佈。以 MySQL 圖表為例。如果您想在叢集中運行兩個資料庫,則可以安裝該圖表兩次。每個資料庫都將擁有自己的發佈,而每個發佈都將擁有自己的發佈名稱

考慮到這些概念,我們現在可以這樣解釋 Helm

Helm 將圖表安裝到 Kubernetes 中,為每次安裝建立一個新的發佈。若要尋找新的圖表,您可以搜尋 Helm 圖表倉庫

「helm search」:尋找圖表

Helm 附帶一個功能強大的搜尋命令。它可以用於搜尋兩種不同類型的來源

  • helm search hub 搜尋 Artifact Hub,它列出了來自數十個不同倉庫的 Helm 圖表。
  • helm search repo 搜尋您已添加到本地 Helm 用戶端(使用 helm repo add)的倉庫。此搜尋是在本地資料上執行的,不需要公開網路連線。

您可以透過執行 helm search hub 來尋找公開可用的圖表

$ helm search hub wordpress
URL                                                 CHART VERSION APP VERSION DESCRIPTION
https://hub.helm.sh/charts/bitnami/wordpress        7.6.7         5.2.4       Web publishing platform for building blogs and ...
https://hub.helm.sh/charts/presslabs/wordpress-...  v0.6.3        v0.6.3      Presslabs WordPress Operator Helm Chart
https://hub.helm.sh/charts/presslabs/wordpress-...  v0.7.1        v0.7.1      A Helm chart for deploying a WordPress site on ...

以上搜尋 Artifact Hub 上所有 wordpress 圖表。

如果沒有篩選條件,helm search hub 會顯示所有可用的圖表。

使用 helm search repo,您可以找到已添加的倉庫中圖表的名稱

$ helm repo add brigade https://brigadecore.github.io/charts
"brigade" has been added to your repositories
$ helm search repo brigade
NAME                          CHART VERSION APP VERSION DESCRIPTION
brigade/brigade               1.3.2         v1.2.1      Brigade provides event-driven scripting of Kube...
brigade/brigade-github-app    0.4.1         v0.2.1      The Brigade GitHub App, an advanced gateway for...
brigade/brigade-github-oauth  0.2.0         v0.20.0     The legacy OAuth GitHub Gateway for Brigade
brigade/brigade-k8s-gateway   0.1.0                     A Helm chart for Kubernetes
brigade/brigade-project       1.0.0         v1.0.0      Create a Brigade project
brigade/kashti                0.4.0         v0.4.0      A Helm chart for Kubernetes

Helm 搜尋使用模糊字串匹配演算法,因此您可以輸入單字或片語的一部分

$ helm search repo kash
NAME            CHART VERSION APP VERSION DESCRIPTION
brigade/kashti  0.4.0         v0.4.0      A Helm chart for Kubernetes

搜尋是尋找可用套件的好方法。找到要安裝的套件後,可以使用 helm install 來安裝它。

「helm install」:安裝套件

若要安裝新的套件,請使用 helm install 命令。最簡單的情況下,它需要兩個參數:您選擇的發佈名稱,以及您要安裝的圖表的名稱。

$ helm install happy-panda bitnami/wordpress
NAME: happy-panda
LAST DEPLOYED: Tue Jan 26 10:27:17 2021
NAMESPACE: default
STATUS: deployed
REVISION: 1
NOTES:
** Please be patient while the chart is being deployed **

Your WordPress site can be accessed through the following DNS name from within your cluster:

    happy-panda-wordpress.default.svc.cluster.local (port 80)

To access your WordPress site from outside the cluster follow the steps below:

1. Get the WordPress URL by running these commands:

  NOTE: It may take a few minutes for the LoadBalancer IP to be available.
        Watch the status with: 'kubectl get svc --namespace default -w happy-panda-wordpress'

   export SERVICE_IP=$(kubectl get svc --namespace default happy-panda-wordpress --template "{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}")
   echo "WordPress URL: http://$SERVICE_IP/"
   echo "WordPress Admin URL: http://$SERVICE_IP/admin"

2. Open a browser and access WordPress using the obtained URL.

3. Login with the following credentials below to see your blog:

  echo Username: user
  echo Password: $(kubectl get secret --namespace default happy-panda-wordpress -o jsonpath="{.data.wordpress-password}" | base64 --decode)

現在已安裝 wordpress 圖表。請注意,安裝圖表會建立新的發佈物件。上面的發佈名為 happy-panda。(如果您希望 Helm 為您產生名稱,請省略發佈名稱並使用 --generate-name。)

在安裝過程中,helm 用戶端將印出有關建立了哪些資源、發佈的狀態,以及是否有您可以或應該執行的其他配置步驟的有用資訊。

Helm 按以下順序安裝資源

  • 命名空間
  • 網路政策
  • 資源配額
  • 限制範圍
  • Pod 安全性政策
  • Pod 中斷預算
  • 服務帳戶
  • 密鑰
  • 密鑰列表
  • 設定檔映射
  • 儲存類別
  • 永久性磁碟區
  • 永久性磁碟區宣告
  • 自訂資源定義
  • 叢集角色
  • 叢集角色列表
  • 叢集角色綁定
  • 叢集角色綁定列表
  • 角色
  • 角色列表
  • 角色綁定
  • 角色綁定列表
  • 服務
  • 守護程式集
  • Pod
  • 複製控制器
  • 複本集
  • 部署
  • 水平 Pod 自動調整器
  • 狀態集
  • 作業
  • 排程作業
  • 入口
  • API 服務

Helm 在所有資源都運行之前不會退出。許多圖表需要大小超過 600MB 的 Docker 映像,並且可能需要很長時間才能安裝到叢集中。

若要追蹤發佈的狀態或重新讀取配置資訊,可以使用 helm status

$ helm status happy-panda
NAME: happy-panda
LAST DEPLOYED: Tue Jan 26 10:27:17 2021
NAMESPACE: default
STATUS: deployed
REVISION: 1
NOTES:
** Please be patient while the chart is being deployed **

Your WordPress site can be accessed through the following DNS name from within your cluster:

    happy-panda-wordpress.default.svc.cluster.local (port 80)

To access your WordPress site from outside the cluster follow the steps below:

1. Get the WordPress URL by running these commands:

  NOTE: It may take a few minutes for the LoadBalancer IP to be available.
        Watch the status with: 'kubectl get svc --namespace default -w happy-panda-wordpress'

   export SERVICE_IP=$(kubectl get svc --namespace default happy-panda-wordpress --template "{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}")
   echo "WordPress URL: http://$SERVICE_IP/"
   echo "WordPress Admin URL: http://$SERVICE_IP/admin"

2. Open a browser and access WordPress using the obtained URL.

3. Login with the following credentials below to see your blog:

  echo Username: user
  echo Password: $(kubectl get secret --namespace default happy-panda-wordpress -o jsonpath="{.data.wordpress-password}" | base64 --decode)

以上顯示了您發佈的目前狀態。

在安裝之前自訂圖表

使用我們這裡的方式安裝只會使用此圖表的預設配置選項。很多時候,您會希望自訂圖表以使用您偏好的配置。

若要查看圖表上有哪些選項是可配置的,請使用 helm show values

$ helm show values bitnami/wordpress
## Global Docker image parameters
## Please, note that this will override the image parameters, including dependencies, configured to use the global value
## Current available global Docker image parameters: imageRegistry and imagePullSecrets
##
# global:
#   imageRegistry: myRegistryName
#   imagePullSecrets:
#     - myRegistryKeySecretName
#   storageClass: myStorageClass

## Bitnami WordPress image version
## ref: https://hub.docker.com/r/bitnami/wordpress/tags/
##
image:
  registry: docker.io
  repository: bitnami/wordpress
  tag: 5.6.0-debian-10-r35
  [..]

然後,您可以在 YAML 格式的檔案中覆寫任何這些設定,並在安裝過程中傳遞該檔案。

$ echo '{mariadb.auth.database: user0db, mariadb.auth.username: user0}' > values.yaml
$ helm install -f values.yaml bitnami/wordpress --generate-name

以上將建立一個預設的 MariaDB 使用者,其名稱為 user0,並授予該使用者對新建立的 user0db 資料庫的訪問權限,但將接受該圖表的所有其他預設值。

在安裝過程中,有兩種方法可以傳遞配置資料

  • --values(或 -f):指定包含覆寫的 YAML 檔案。這可以指定多次,最右邊的檔案將優先
  • --set:在命令列上指定覆寫。

如果兩者都使用,--set 值將合併到 --values 中,並具有更高的優先級。使用 --set 指定的覆寫將保留在密鑰中。可以使用 helm get values <發佈名稱> 查看給定發佈的已 --set 的值。透過在指定 --reset-values 的情況下運行 helm upgrade,可以清除已 --set 的值。

--set 的格式和限制

--set 選項採用零個或多個名稱/值對。最簡單的情況下,它的用法如下:--set 名稱=值。它的 YAML 等效項是

name: value

多個值以 , 字元分隔。所以 --set a=b,c=d 變為

a: b
c: d

支援更複雜的表達式。例如,--set outer.inner=value 會轉換為

outer:
  inner: value

列表可以使用 {} 將值括起來表示。例如,--set name={a, b, c} 轉換為

name:
  - a
  - b
  - c

某些名稱/鍵可以設定為 null 或空陣列 []。例如,--set name=[],a=null 轉換為

name:
  - a
  - b
  - c
a: b

name: []
a: null

從 Helm 2.5.0 開始,可以使用陣列索引語法訪問列表項目。例如,--set servers[0].port=80 變為

servers:
  - port: 80

可以透過這種方式設定多個值。行 --set servers[0].port=80,servers[0].host=example 變為

servers:
  - port: 80
    host: example

有時您需要在 --set 行中使用特殊字元。您可以使用反斜線來轉義這些字元;--set name=value1\,value2 將變為

name: "value1,value2"

同樣地,您也可以轉義點序列,這在圖表使用 toYaml 函數來解析註釋、標籤和節點選擇器時可能會派上用場。--set nodeSelector."kubernetes\.io/role"=master 的語法變為

nodeSelector:
  kubernetes.io/role: master

使用 --set 可能難以表達深度巢狀的資料結構。鼓勵圖表設計者在設計 values.yaml 檔案的格式時考慮 --set 的用法(閱讀更多關於 值檔案 的資訊)。

更多安裝方法

helm install 命令可以從多個來源安裝

  • 圖表儲存庫(如上所示)
  • 本地圖表檔案(helm install foo foo-0.1.1.tgz
  • 已解壓縮的圖表目錄(helm install foo path/to/foo
  • 完整的 URL(helm install foo https://example.com/charts/foo-1.2.3.tgz

「helm upgrade」和「helm rollback」:升級版本以及從失敗中恢復

當圖表的 新版本發佈時,或者當您想變更版本的配置時,可以使用 helm upgrade 命令。

升級會取得現有的版本並根據您提供的資訊進行升級。由於 Kubernetes 圖表可能很大且很複雜,因此 Helm 會嘗試執行侵入性最小的升級。它只會更新自上次版本以來已變更的內容。

$ helm upgrade -f panda.yaml happy-panda bitnami/wordpress

在上述情況下,happy-panda 版本會使用相同的圖表進行升級,但使用新的 YAML 檔案

mariadb.auth.username: user1

我們可以使用 helm get values 來查看新的設定是否已生效。

$ helm get values happy-panda
mariadb:
  auth:
    username: user1

helm get 命令是用於查看叢集中版本的實用工具。如上所示,它顯示了我們從 panda.yaml 取得的新值已部署到叢集中。

現在,如果在版本發佈期間發生任何問題,可以使用 helm rollback [版本] [修訂版本號碼] 輕鬆地回復到先前的版本。

$ helm rollback happy-panda 1

上述操作會將 happy-panda 回復到其第一個版本。版本號碼是遞增的修訂版本號碼。每次安裝、升級或回復時,修訂版本號碼都會遞增 1。第一個修訂版本號碼始終為 1。我們可以使用 helm history [版本] 來查看特定版本的修訂版本號碼。

安裝/升級/回復的實用選項

還有其他幾個實用的選項,您可以在安裝/升級/回復期間指定這些選項來自訂 Helm 的行為。請注意,這不是 cli 旗標的完整清單。若要查看所有旗標的說明,請執行 helm <命令> --help

  • --timeout:等待 Kubernetes 命令完成的 Go 持續時間 值。預設值為 5m0s
  • --wait:在將版本標記為成功之前,會先等待所有 Pod 處於就緒狀態、PVC 已繫結、部署具有處於就緒狀態的最小 Pod 數量(Desired 減去 maxUnavailable)以及服務具有 IP 位址(以及 Ingress,如果為 LoadBalancer)。它會等待 --timeout 值所指定的時間。如果達到逾時,則版本將標記為 FAILED。注意:在部署的 replicas 設定為 1 且 maxUnavailable 未設定為 0 作為滾動更新策略的一部分的情況下,--wait 會在滿足就緒狀態的最小 Pod 條件時傳回就緒狀態。
  • --no-hooks:這會略過執行命令的鉤子
  • --recreate-pods(僅適用於 upgraderollback):此旗標將導致重新建立所有 Pod(屬於部署的 Pod 除外)。(在 Helm 3 中已棄用)

「helm uninstall」:解除安裝版本

當您要從叢集中解除安裝版本時,請使用 helm uninstall 命令

$ helm uninstall happy-panda

這會從叢集中移除該版本。您可以使用 helm list 命令查看所有當前已部署的版本

$ helm list
NAME            VERSION UPDATED                         STATUS          CHART
inky-cat        1       Wed Sep 28 12:59:46 2016        DEPLOYED        alpine-0.1.0

從上面的輸出中,我們可以看到 happy-panda 版本已解除安裝。

在舊版的 Helm 中,當版本被刪除時,其刪除記錄會被保留。在 Helm 3 中,刪除操作也會移除版本記錄。如果您想保留刪除版本記錄,請使用 helm uninstall --keep-history。使用 helm list --uninstalled 只會顯示使用 --keep-history 旗標解除安裝的版本。

helm list --all 旗標將顯示 Helm 已保留的所有版本記錄,包括失敗或已刪除項目的記錄(如果已指定 --keep-history

$  helm list --all
NAME            VERSION UPDATED                         STATUS          CHART
happy-panda     2       Wed Sep 28 12:47:54 2016        UNINSTALLED     wordpress-10.4.5.6.0
inky-cat        1       Wed Sep 28 12:59:46 2016        DEPLOYED        alpine-0.1.0
kindred-angelf  2       Tue Sep 27 16:16:10 2016        UNINSTALLED     alpine-0.1.0

請注意,由於版本現在預設會被刪除,因此無法回復已解除安裝的資源。

「helm repo」:使用儲存庫

Helm 3 不再隨附預設的圖表儲存庫。helm repo 命令群組提供了用於新增、列出和移除儲存庫的命令。

您可以使用 helm repo list 查看已配置的儲存庫

$ helm repo list
NAME            URL
stable          https://charts.helm.sh/stable
mumoshu         https://mumoshu.github.io/charts

可以使用 helm repo add 新增新的儲存庫

$ helm repo add dev https://example.com/dev-charts

由於圖表儲存庫經常變更,因此您可以隨時執行 helm repo update 來確保您的 Helm 用戶端是最新的。

可以使用 helm repo remove 移除儲存庫。

建立您自己的圖表

圖表開發指南說明了如何開發您自己的圖表。但是,您可以使用 helm create 命令快速入門

$ helm create deis-workflow
Creating deis-workflow

現在 ./deis-workflow 中有一個圖表。您可以編輯它並建立您自己的範本。

在編輯圖表時,您可以執行 helm lint 來驗證其格式是否正確。

當您要將圖表打包以進行發佈時,可以執行 helm package 命令

$ helm package deis-workflow
deis-workflow-0.1.0.tgz

現在,可以使用 helm install 輕鬆安裝該圖表

$ helm install deis-workflow ./deis-workflow-0.1.0.tgz
...

已打包的圖表可以載入到圖表儲存庫中。如需詳細資訊,請參閱Helm 圖表儲存庫的說明文件。

結論

本章涵蓋了 helm 用戶端的基本使用模式,包括搜尋、安裝、升級和解除安裝。它還涵蓋了實用的工具命令,例如 helm statushelm gethelm repo

如需有關這些命令的詳細資訊,請參閱 Helm 的內建說明:helm help

下一章中,我們將探討開發圖表的過程。