使用 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
(僅適用於upgrade
和rollback
):此旗標將導致重新建立所有 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 status
、helm get
和 helm repo
。
如需有關這些命令的詳細資訊,請參閱 Helm 的內建說明:helm help
。
在下一章中,我們將探討開發圖表的過程。