介紹
Helm 是一個針對 Kubernetes 的套件管理器,允許開發人員和運營人員更容易地在 Kubernetes 叢集上配置和部署應用程序。
Helm 套件稱為 charts,它們包含部署和配置特定應用程序的資源定義模板,用戶只需進行最少的努力即可。通過模板化,您可以通過傳遞變量定義來管理圖表、其設置和行為,而無需修改實際的圖表。自定義資源定義以及對已部署定義的修改,Helm 都會自動管理。一個已部署的圖表,以及可能的自定義,被稱為 release。
在本教程中,您將設置 Helm 3 並學習如何安裝、升級、回滾和管理 charts 和 releases。您還將學習如何創建和打包自己的 charts,以及設置 chart 存儲庫,這些存儲庫包含可以立即安裝的 charts。
先決條件
-
啟用基於角色的訪問控制(RBAC)的 Kubernetes 叢集。有關版本的進一步信息,請查看 Helm releases 頁面。
-
在您的本地机器上安装了
kubectl
命令行工具,并配置为连接到您的集群。您可以在官方文档中了解更多关于安装kubectl
的信息。您可以使用以下命令测试您的连接:
如果您没有收到错误信息,则表示您已连接到集群。如果您使用
kubectl
访问多个集群,请确保通过运行以下命令验证您已选择正确的集群上下文:输出将列出可用的配置:
输出CURRENT NAME CLUSTER AUTHINFO NAMESPACE * do-fra1-helm3-example do-fra1-helm3-example do-fra1-helm3-example-admin在这里,星号(
*
)表示我们已连接到do-fra1-helm3-example
集群。要切换集群,请运行:
當您連接到正確的叢集時,請繼續進行步驟 1,開始安裝 Helm。
步驟 1 — 安裝 Helm 3
在此部分中,您將使用官方提供的 shell 腳本 安裝 Helm 3。
首先,通過運行以下命令進入 /tmp
,您將在此處存儲安裝腳本:
使用以下命令下載該腳本:
您可以在文本編輯器中檢查 get_helm.sh
以確保其安全性。
通過設置其權限使其可執行:
最後,運行以下命令來安裝 Helm 3:
您將收到類似以下的輸出:
OutputDownloading https://get.helm.sh/helm-v3.5.2-linux-amd64.tar.gz
Verifying checksum... Done.
Preparing to install helm into /usr/local/bin
helm installed into /usr/local/bin/helm
您已在您的機器上安裝了 Helm 3。您現在將了解有關圖表存儲庫以及如何使用它們的信息。
步驟 2 — 設置圖表存儲庫
Helm 圖表存儲在任何人都可以託管的圖表存儲庫中。默認情況下,Helm 3 不會預先配置任何存儲庫。之前的 Helm 版本包括一個中央的經過精心策劃的圖表存儲庫;但是,Helm 3 的設計有意發展成圖表開發人員管理自己的存儲庫,從而允許更多的自由和更快的發布。這意味著對於您想要使用的每個圖表,您都需要確保將主機存儲庫添加到您的 Helm 安裝中。
為了幫助您找到合適的存儲庫,您可以使用 ArtifactHub.io,這是一個由 CNCF 管理的開源網站,該網站列出了 Helm 圖表及其存儲庫。它還跟蹤其他 CNCF 項目使用的流行和有用的圖表,因此它不同於之前版本的 Helm 使用的 stable
存儲庫。對於常見的項目,例如 Nginx 輸入或監控工具,這是一個很好的來源。
您可以通過首頁搜索您想要安裝的圖表。搜索 nginx
將顯示所有與其相關的索引圖表。
你將安裝由Kubernetes團隊管理的社區版。在搜索結果中搜索ingress-nginx
以找到它。選擇它以訪問其頁面。
每個圖表應該有一個詳細描述它的功能的描述,以及將其存儲庫添加到您的安裝中並安裝圖表的命令。如果沒有,您仍然可以通過按頁面右側的安裝按鈕來獲取必要的命令。
您可以點擊命令旁邊的藍色按鈕來複製它。為第一個命令這樣做,然後運行它:
要將存儲庫添加到Helm中,您運行helm repo add
。它接受的參數是存儲庫的名稱和位置。
輸出將是:
Output"ingress-nginx" has been added to your repositories
當您添加新的存儲庫時,您需要通知Helm它包含的內容,方法是運行:
您將收到以下輸出,顯示更新成功:
OutputHang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "ingress-nginx" chart repository
Update Complete. ⎈Happy Helming!⎈
在此步驟中,您已經了解了ArtifactHub及其提供的功能。您還將新的存儲庫添加到了Helm安裝中。在下一步中,您將安裝Helm圖表。
步驟3 — 安裝Helm圖表
在前一節中,您已經添加了ingress-nginx
圖表的存儲庫。現在,您將把它安裝到您的集群中。
每個圖表都有配置變數,您可以設置這些變數以修改其行為。這些變數存儲在名為 values.yaml
的文件中,該文件是圖表的一部分。除非您已將圖表下載到您的計算機上,否則您將不得不運行以下命令來查看它:
要顯示 ingress-nginx
的可用變數,請將chart_name
替換為:
輸出將顯示 ingress-nginx
的 values.yaml
的內容,並且可能會很長。
要安裝圖表,您可以使用 helm install
:
A release is a deployed instance of the chart, and here you’re calling it ingress-nginx
.
此命令將使用變量的默認值將圖表安裝到您的集群中。如果您希望修改其中一些變量,則可以使用--set
傳入新的變量值:
您可以對所需的變量重複使用--set
。由於我們現在不會自定義它,請按原樣安裝運行:
輸出將類似於以下內容:
OutputNAME: ingress-nginx
LAST DEPLOYED: Wed Feb 24 10:12:37 2021
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
The ingress-nginx controller has been installed.
It may take a few minutes for the LoadBalancer IP to be available.
You can watch the status by running 'kubectl --namespace default get services -o wide -w ingress-nginx-controller'
...
請注意, NAME
對應於您指定的發布名稱。 Helm還列出了一般信息,例如發布狀態和部署的命名空間。 NOTES
部分在圖表之間有所不同,通常包含快速入門指南或警告使用圖表資源時可能遇到的一些常見問題。這裡指出正在創建負載平衡器,並且可能需要一些時間才能完成。
要檢查已部署的圖表,請使用 helm list
:
您將發現目前只有 ingress-nginx
已部署的圖表:
OutputNAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
ingress-nginx default 1 2021-02-24 10:12:37.281049711 +0000 UTC deployed ingress-nginx-3.23.0 0.44.0
您可以通过运行以下命令在集群中找到它的服务:
输出类似于:
OutputNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-controller LoadBalancer 10.245.211.81 46.101.68.67 80:30704/TCP,443:30700/TCP 7m19s
ingress-nginx-controller-admission ClusterIP 10.245.50.17 <none> 443/TCP 7m19s
kubernetes ClusterIP 10.245.0.1 <none> 443/TCP 83m
现在,您已经将一个版本部署到了您的集群中,您可以在部署期间修改其配置。
步骤 4 —— 升级发布
一旦发布部署完成,您就无需完全拆除并重新部署,当您需要更改其配置时。您可以使用 helm upgrade
命令来升级发布到图表的新版本,或者设置新的设置。
ingress-nginx
图表公开了控制部署的控制器 pod 数量的 controller.replicaCount
变量。默认情况下,它设置为一个,您可以通过列出可用的 pod 进行验证:
您会发现只有一个:
OutputNAME READY STATUS RESTARTS AGE
ingress-nginx-controller-7fc74cf778-kjtst 1/1 Running 0 12m
如果您希望部署更多的冗余(例如,三个),您可以通过运行以下命令upgrade
发布并将该变量设置为 3
:
您还可以传入 --reuse-values
,这指示 Helm 基于已部署的发布来进行更改,保留先前的配置。
在输出中,Helm 将增加修订版本以表示发布已经升级:
OutputNAME: ingress-nginx
LAST DEPLOYED: Wed Feb 24 12:07:54 2021
NAMESPACE: default
STATUS: deployed
REVISION: 2
TEST SUITE: None
NOTES:
...
您可以通过运行以下命令列出可用的 pod:
您将会发现列出了三个 pod,而不是一个:
OutputNAME READY STATUS RESTARTS AGE
ingress-nginx-controller-7fc74cf778-4hk9g 1/1 Running 0 18s
ingress-nginx-controller-7fc74cf778-kjtst 1/1 Running 0 22m
ingress-nginx-controller-7fc74cf778-wz595 1/1 Running 0 18s
接下來,您將會撤銷更改並完全刪除發布。
步驟 5 — 撤銷和刪除發布
當您 升級
一個發布時,其修訂版本號會遞增。在內部,Helm 存儲所有發布的修訂版本,允許您根據需要返回到先前的修訂版本。
要將 pod 的數量恢復為一個,您可以再次運行 helm 升級
並手動設置數量,因為這是一個小的更改。但是,當處理具有許多變量的較大的圖表時,手動回滾是不可行的,應該自動化。
要回滾發布,請使用 helm 回滾
:
您可以使用它來還原您對 ingress-nginx
所做的更改,回滾到修訂版本 1
:
您將收到以下輸出,指示操作成功:
OutputRollback was a success! Happy Helming!
您可以通過列出發布來檢查當前的修訂版本:
您將發現修訂版本現在是 3
,而不是 1
:
OutputNAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
ingress-nginx default 3 2021-02-24 12:43:21.523664768 +0000 UTC deployed ingress-nginx-3.23.0 0.44.0
Helm 將每個更改(包括回滾)都視為對發布的新修訂。您可以通過運行以下命令檢查修訂版本 3
是否等於第一個:
您將發現只有一個:
OutputNAME READY STATUS RESTARTS AGE
ingress-nginx-controller-7fc74cf778-kjtst 1/1 Running 0 41m
要刪除一個發布及其所有修訂版本,您可以使用 helm 刪除
:
由於您將不再需要它,請執行以下命令刪除 ingress-nginx
:
輸出將是:
Outputrelease "ingress-nginx" uninstalled
您可以列出發布版本以檢查是否沒有:
輸出表將沒有行:
OutputNAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
現在發布已刪除,您可以將其名稱重新用於未來的部署。
步驟 6 —(可選)創建自定義圖表
在此可選步驟中,您將學習如何創建自定義圖表,將資源定義放在何處以及如何封裝以供進一步分發。
您將創建一個名為 example-chart
的新圖表。執行以下命令來創建它:
這將創建一個名為 example-chart
的新目錄,其中包含以下文件和結構:
charts/
templates/
├─ tests/
│ ├─ test-connection.yaml
├─ deployment.yaml
├─ hpa.yaml
├─ ingress.yaml
├─ NOTES.txt
├─ service.yaml
├─ serviceaccount.yaml
├─ _helpers.tpl
Chart.yaml
values.yaml
您的圖表將在目標集群上安裝的資源定義位於 templates
目錄中。Helm 創建的默認資源定義作為起點部署了一個 Nginx Ingress 控制器。儘管它們的文件擴展名是 YAML,但它們使用 Go 的模板語法來保持可通過暴露的變量進行定制,您可以傳遞這些變量。您可以運行以下命令來驗證 service.yaml
的內容:
您將發現它包含雙大括號括起來的產生值的模板指令:
被引用的變數對用戶是可見的並且在values.yaml
中被定義。部署後Helm顯示的NOTES
文本被存儲在NOTES.txt
中,同時也被模板化了。包括名稱、版本和被部署軟件版本等圖表元數據在內,都在Chart.yaml
中被指定:
要檢查Helm將會部署的內容,你可以在指向圖表目錄的情況下傳遞--dry-run
和--debug
給helm install
:
輸出將會很長並包含所有最終的資源定義,這些將應用到你的集群上。當你在處理你的圖表時,你可以使用helm upgrade
來將新版本推送到Kubernetes上。
當該分享你完成的圖表的時候,你可以運行以下命令將其打包分發:
輸出將會是:
OutputSuccessfully packaged chart and saved it to: .../example-chart-0.1.0.tgz
打包的圖表可以像從添加的存儲庫中的那樣安裝:
在這一步,你創建了一個定制的圖表並部署了它。你還將它打包了,並了解了它的結構。
結論
現在你知道如何使用Helm來安裝和升級部署到你的Kubernetes集群上的軟件。你添加了圖表存儲庫,並了解了它們為何重要以及ArtifactHub如何幫助你找到它們。你還創建了一個新的定制圖表並了解了發布修訂和如何在必要時回滾。
請訪問官方指南了解有關創建自定義圖表的更多信息。