如何使用Helm 3套件管理器在Kubernetes集群上安裝軟件

介紹

Helm 是一個針對 Kubernetes 的套件管理器,允許開發人員和運營人員更容易地在 Kubernetes 叢集上配置和部署應用程序。

Helm 套件稱為 charts,它們包含部署和配置特定應用程序的資源定義模板,用戶只需進行最少的努力即可。通過模板化,您可以通過傳遞變量定義來管理圖表、其設置和行為,而無需修改實際的圖表。自定義資源定義以及對已部署定義的修改,Helm 都會自動管理。一個已部署的圖表,以及可能的自定義,被稱為 release

在本教程中,您將設置 Helm 3 並學習如何安裝、升級、回滾和管理 charts 和 releases。您還將學習如何創建和打包自己的 charts,以及設置 chart 存儲庫,這些存儲庫包含可以立即安裝的 charts。

先決條件

  • 啟用基於角色的訪問控制(RBAC)的 Kubernetes 叢集。有關版本的進一步信息,請查看 Helm releases 頁面。

  • 在您的本地机器上安装了 kubectl 命令行工具,并配置为连接到您的集群。您可以在官方文档中了解更多关于安装 kubectl 的信息

    您可以使用以下命令测试您的连接:

    1. kubectl cluster-info

    如果您没有收到错误信息,则表示您已连接到集群。如果您使用 kubectl 访问多个集群,请确保通过运行以下命令验证您已选择正确的集群上下文:

    1. kubectl config get-contexts

    输出将列出可用的配置:

    输出
    CURRENT NAME CLUSTER AUTHINFO NAMESPACE * do-fra1-helm3-example do-fra1-helm3-example do-fra1-helm3-example-admin

    在这里,星号(*)表示我们已连接到 do-fra1-helm3-example 集群。要切换集群,请运行:

    1. kubectl config use-context context-name

當您連接到正確的叢集時,請繼續進行步驟 1,開始安裝 Helm。

步驟 1 — 安裝 Helm 3

在此部分中,您將使用官方提供的 shell 腳本 安裝 Helm 3

首先,通過運行以下命令進入 /tmp,您將在此處存儲安裝腳本:

  1. cd /tmp

使用以下命令下載該腳本:

  1. curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3

您可以在文本編輯器中檢查 get_helm.sh 以確保其安全性。

通過設置其權限使其可執行:

  1. chmod u+x get_helm.sh

最後,運行以下命令來安裝 Helm 3:

  1. ./get_helm.sh

您將收到類似以下的輸出:

Output
Downloading 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以找到它。選擇它以訪問其頁面。

每個圖表應該有一個詳細描述它的功能的描述,以及將其存儲庫添加到您的安裝中並安裝圖表的命令。如果沒有,您仍然可以通過按頁面右側的安裝按鈕來獲取必要的命令。

您可以點擊命令旁邊的藍色按鈕來複製它。為第一個命令這樣做,然後運行它:

  1. helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx

要將存儲庫添加到Helm中,您運行helm repo add。它接受的參數是存儲庫的名稱和位置。

輸出將是:

Output
"ingress-nginx" has been added to your repositories

當您添加新的存儲庫時,您需要通知Helm它包含的內容,方法是運行:

  1. helm repo update

您將收到以下輸出,顯示更新成功:

Output
Hang 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 的文件中,該文件是圖表的一部分。除非您已將圖表下載到您的計算機上,否則您將不得不運行以下命令來查看它:

  1. helm show values chart_name

要顯示 ingress-nginx 的可用變數,請將chart_name替換為:

  1. helm show values ingress-nginx/ingress-nginx

輸出將顯示 ingress-nginx values.yaml 的內容,並且可能會很長。

要安裝圖表,您可以使用 helm install

  1. helm install release_name repository/chart_name

A release is a deployed instance of the chart, and here you’re calling it ingress-nginx.

此命令將使用變量的默認值將圖表安裝到您的集群中。如果您希望修改其中一些變量,則可以使用--set傳入新的變量值:

  1. helm install ingress-nginx/ingress-nginx --set variable_name=variable_value

您可以對所需的變量重複使用--set。由於我們現在不會自定義它,請按原樣安裝運行:

  1. helm install ingress-nginx ingress-nginx/ingress-nginx

輸出將類似於以下內容:

Output
NAME: 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

  1. helm list

您將發現目前只有 ingress-nginx 已部署的圖表:

Output
NAME 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

您可以通过运行以下命令在集群中找到它的服务:

  1. kubectl get services

输出类似于:

Output
NAME 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 进行验证:

  1. kubectl get pods

您会发现只有一个:

Output
NAME READY STATUS RESTARTS AGE ingress-nginx-controller-7fc74cf778-kjtst 1/1 Running 0 12m

如果您希望部署更多的冗余(例如,三个),您可以通过运行以下命令upgrade 发布并将该变量设置为 3

  1. helm upgrade ingress-nginx ingress-nginx/ingress-nginx --set controller.replicaCount=3 --reuse-values

您还可以传入 --reuse-values,这指示 Helm 基于已部署的发布来进行更改,保留先前的配置。

在输出中,Helm 将增加修订版本以表示发布已经升级:

Output
NAME: ingress-nginx LAST DEPLOYED: Wed Feb 24 12:07:54 2021 NAMESPACE: default STATUS: deployed REVISION: 2 TEST SUITE: None NOTES: ...

您可以通过运行以下命令列出可用的 pod:

  1. kubectl get pods

您将会发现列出了三个 pod,而不是一个:

Output
NAME 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 回滾

  1. helm rollback release_name release_revision

您可以使用它來還原您對 ingress-nginx 所做的更改,回滾到修訂版本 1

  1. helm rollback ingress-nginx 1

您將收到以下輸出,指示操作成功:

Output
Rollback was a success! Happy Helming!

您可以通過列出發布來檢查當前的修訂版本:

  1. helm list

您將發現修訂版本現在是 3,而不是 1

Output
NAME 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 是否等於第一個:

  1. kubectl get pods

您將發現只有一個:

Output
NAME READY STATUS RESTARTS AGE ingress-nginx-controller-7fc74cf778-kjtst 1/1 Running 0 41m

要刪除一個發布及其所有修訂版本,您可以使用 helm 刪除

  1. helm delete release_name

由於您將不再需要它,請執行以下命令刪除 ingress-nginx

  1. helm delete ingress-nginx

輸出將是:

Output
release "ingress-nginx" uninstalled

您可以列出發布版本以檢查是否沒有:

  1. helm list

輸出表將沒有行:

Output
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION

現在發布已刪除,您可以將其名稱重新用於未來的部署。

步驟 6 —(可選)創建自定義圖表

在此可選步驟中,您將學習如何創建自定義圖表,將資源定義放在何處以及如何封裝以供進一步分發。

您將創建一個名為 example-chart 的新圖表。執行以下命令來創建它:

  1. helm create example-chart

這將創建一個名為 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 的內容:

  1. cat example-chart/templates/service.yaml

您將發現它包含雙大括號括起來的產生值的模板指令:

Output
apiVersion
: v1 kind: Service metadata: name: {{ include "mychart.fullname" . }} labels: {{- include "mychart.labels" . | nindent 4 }} spec: type: {{ .Values.service.type }} ports: - port: {{ .Values.service.port }} targetPort: http protocol: TCP name: http selector: {{- include "mychart.selectorLabels" . | nindent 4 }}

被引用的變數對用戶是可見的並且在values.yaml中被定義。部署後Helm顯示的NOTES文本被存儲在NOTES.txt中,同時也被模板化了。包括名稱、版本和被部署軟件版本等圖表元數據在內,都在Chart.yaml中被指定:

example-chart/Chart.yaml
apiVersion: v2
name: mychart
description: A Helm chart for Kubernetes

...
type: application

...
version: 0.1.0

...
appVersion: "1.16.0"

要檢查Helm將會部署的內容,你可以在指向圖表目錄的情況下傳遞--dry-run--debughelm install

  1. helm install example-chart --dry-run --debug ./example-chart

輸出將會很長並包含所有最終的資源定義,這些將應用到你的集群上。當你在處理你的圖表時,你可以使用helm upgrade來將新版本推送到Kubernetes上。

當該分享你完成的圖表的時候,你可以運行以下命令將其打包分發:

  1. helm package ./example-chart

輸出將會是:

Output
Successfully packaged chart and saved it to: .../example-chart-0.1.0.tgz

打包的圖表可以像從添加的存儲庫中的那樣安裝:

  1. helm install example-chart example-chart-0.1.0.tgz

在這一步,你創建了一個定制的圖表並部署了它。你還將它打包了,並了解了它的結構。

結論

現在你知道如何使用Helm來安裝和升級部署到你的Kubernetes集群上的軟件。你添加了圖表存儲庫,並了解了它們為何重要以及ArtifactHub如何幫助你找到它們。你還創建了一個新的定制圖表並了解了發布修訂和如何在必要時回滾。

請訪問官方指南了解有關創建自定義圖表的更多信息。

Source:
https://www.digitalocean.com/community/tutorials/how-to-install-software-on-kubernetes-clusters-with-the-helm-3-package-manager