在管理Kubernetes集群里的應用時,Helm能幫上大忙,它把應用的部署、升級和管理變得簡單多了,有如是Kubernetes的 “應用商店”。
Helm的三個重要概念
三大概念最直接的理解:Helm 安裝 charts 到 Kubernetes 集群中,每次安裝都會創建一個新的 release。你可以在 Helm 的 chart repositories 中尋找新的 chart。接下來分個介紹。
Chart
Chart是Helm里特別關鍵的東西,它其實就是個提前配置好的軟件包,包含在Kubernetes集群部署某個應用要用的所有資源。你可以把它想成是一份詳細的 “應用搭建指南”,能幫你在Kubernetes集群里把應用搭起來。Chart主要包含以下幾個重要部分:
- Chart.yaml:這個文件記錄著Chart的基本信息,比如Chart的名字、版本號、對它的描述,還有它依賴哪些其他的Chart等。就好比產品說明書的封面,讓你對這個Chart有個初步的了解。例如,在一個部署WordPress應用的Chart里,
Chart.yaml
會寫明這是WordPress的Chart,版本是多少,以及簡單介紹它能做什么。 - templates目錄:這里面放著各種Kubernetes資源的模板文件,像
deployment.yaml
用來規定應用的部署方式,比如要部署多少個副本;service.yaml
負責把應用服務對外展示,讓外部能訪問到應用;還有configmap.yaml
可以存一些配置信息,像是數據庫連接字符串等。這些模板就像是搭建應用的各個零件圖紙,告訴Kubernetes該怎么創建和配置這些資源。比如說deployment.yaml
模板里,會定義使用個Docker鏡像來運行應用,以及應用運行所需的資源限制等。 - values.yaml:部署應用的時候,你能通過它靈活地改各種參數。比如在部署一個Web應用的Chart時,你能在
values.yaml
文件里輕松修改數據庫連接字符串,把它改成你實際要用的數據庫地址;還能調整應用副本數量,根據業務量來決定部署多少個實例;以及設置資源請求和限制,比如給應用分配多少CPU和內存。通過修改values.yaml
里的參數,能讓應用適應不同的運行環境。比如在測試環境,你可能把副本數量設為1,方便調試;在生產環境,根據業務量把副本數調高,保證應用的性能。
Repository
Repository就是存Helm圖表(Chart)的地方,就跟一個大軟件倉庫似的,里面放著各種各樣的Chart。Helm官方有公共倉庫,咱們自己也能搭私有倉庫。倉庫里,每個Chart都按特定的目錄結構存著。我們通過helm repo
相關的命令和倉庫打交道。比如,用helm repo add
命令添加倉庫,把遠程倉庫地址和一個好記的別名連起來,后面用著方便;helm repo update
命令是把遠程倉庫的最新信息同步到本地,這樣就能拿到最新版的Chart;helm repo list
能列出現在已經配置好的所有倉庫信息,方便我們查看和管理。有了倉庫,大家分享和重復使用Chart就方便多了,大大提高了部署應用的效率。
Release
當我們用Helm把一個Chart裝到Kubernetes集群里的時候,每裝一次,就會生成一個Release。Release其實就是Chart在Kubernetes集群里的一個具體實例,它記著Chart在某個時間點的部署狀態、配置信息,還有相關的元數據。每個Release都有個獨一無二的名字,方便我們管理和追蹤。比如說,你裝了個叫my - nginx
的Release,它對應的就是nginx
Chart在集群里的一次部署。通過Release,我們能很方便地對應用進行升級、回滾、卸載這些操作,而且這些操作都是根據Release記錄的信息來進行的。
Helm的常用操作
1. 倉庫操作
添加倉庫
用helm repo add
這個命令來添加倉庫。比如說:
helm repo add stable https://charts.helm.sh/stable
這里,stable
是我們給倉庫起的別名,最緊要好記;https://charts.helm.sh/stable
就是官方穩定倉庫的地址。如果是私有倉庫需要認證,添加的時候帶上用戶名和密碼參數:
helm repo add --username myuser --password mypass private_repo https://my_private_repo.com
列出倉庫
運行helm repo list
就能看到已經添加的倉庫列表:
helm repo list
結果會顯示倉庫別名和對應的URL,讓我們清楚現在都配置了哪些倉庫,方便后面管理和使用。
在官方倉庫搜索
helm search hub
這個命令能在官方倉庫找Chart。比如說,你想找和nginx
有關的Chart,就這么做:
helm search hub nginx
Helm會在官方倉庫里找名字或者描述里有nginx
的Chart,然后把相關信息列出來,像Chart名字、版本、描述啥的,這樣我們就能很快找到想要的應用。
在自己配置的倉庫搜索
要是想在自己配的倉庫里找Chart,就用helm search repo
命令。假設倉庫別名是myrepo
,找和nginx
相關的Chart:
helm search repo myrepo/nginx
這樣就能在指定倉庫里精準找到特定的Chart,提高搜索效率。
刪除倉庫
要是不用某個倉庫了,用helm repo remove
命令刪掉。比如說刪別名是stable
的倉庫:
helm repo remove stable
執行完,這個倉庫的相關信息就從本地配置里沒了,清理掉沒用的倉庫配置。
2. 安裝操作
下載圖表
用helm pull
命令下載Chart。默認下,下載的是最新版本,比如:
helm pull stable/nginx
要是想指定版本下載,加個--version
參數:
helm pull stable/nginx --version 1.2
下載下來的Chart是個壓縮包,解壓后能看到里面的文件結構,有Kubernetes資源模板文件、values.yaml
文件等,方便我們在安裝前研究,或者用來離線安裝。
安裝倉庫里的Chart
用helm install
命令把Chart裝到Kubernetes集群里。比如說,裝stable
倉庫的nginx
Chart,給Release起名叫my - nginx
:
helm install my - nginx stable/nginx
安裝的時候,Helm會從指定倉庫把Chart下載下來,然后按照Chart里的定義,在集群里創建對應的Kubernetes資源。
使用自定義的values.yaml文件
安裝的時候,能通過-f
參數指定自定義的values.yaml
文件,用自己的配置把默認配置換掉。比如:
helm install my - nginx stable/nginx - f myvalues.yaml
在myvalues.yaml
文件里,我們能根據實際需要改各種參數,像調整副本數量、改服務端口,讓應用更符合實際運行環境。
升級版本或者修改配置
應用更新了,或者需求變了,就得升級已經安裝的Release。拿my - nginx
來說,假設要升級到stable/nginx
圖表的新版本,還想把副本數改成4:
helm upgrade my - nginx stable/nginx --set replicaCount = 4
升級的時候,Helm對原配置的處理機制是這樣的:它會先讀取當前Release的配置信息,這些信息存儲在values.yaml
文件以及Release的元數據中 。對于那些在新版本Chart里依然存在且未發生重大變更的配置項,Helm會保留原有的配置值。例如,如果原配置里設置了image.repository
為nginx:1.18
,在新版本Chart里該配置項的結構和用途未變,那么升級時這個配置值會被繼續沿用,實現平滑轉移 。
但如果新版本Chart引入了新的配置項,Helm會按照以下規則處理:若用戶在升級命令中沒有顯式指定新配置項的值,Helm會嘗試使用新版本Chart中values.yaml
文件里定義的默認值。比如新版本stable/nginx
圖表新增了一個extraEnvVars
配置項用于設置額外的環境變量,而用戶升級時沒有通過--set
或-f
參數指定其值,那么Helm會采用新版本values.yaml
里為extraEnvVars
設置的默認值。若用戶在升級命令中通過--set
或-f
參數指定了新配置項的值,Helm則會使用用戶指定的值。例如用戶執行helm upgrade my - nginx stable/nginx --set extraEnvVars[0].name=TEST_VAR --set extraEnvVars[0].value=test
,那么Helm會按照用戶指定的內容,為應用配置新的環境變量。
在更新資源時,Helm會盡量用滾動更新的辦法,保證服務一直能用。比如說對于Deployment資源,Helm會一個一個把舊的Pod換成新配置的Pod,同時盯著整個更新過程,一有問題,馬上能回滾到上一個版本。
卸載
用helm uninstall
命令卸載Release。比如說卸載叫my - nginx
的Release:
helm uninstall my - nginx
Helm會把這個Release對應的所有Kubernetes資源都刪掉,像Deployment、Service這些。不過要注意,如果Chart創建了PVC(PersistentVolumeClaim)這種持久化資源,默認情況下,Helm不會刪這些資源,得我們自己手動清理,不然就浪費資源了。
預安裝檢查
在安裝或者升級Release之前,可以用--dry - run
和--debug
參數做個預安裝檢查。比如:
helm install my - redis stable/redis --dry - run --debug
--dry - run
能讓Helm模擬安裝過程,但不會真的創建資源,這樣能提前發現潛在問題,像模板渲染錯誤、資源沖突這些;--debug
參數會輸出詳細的調試信息,方便我們找到問題、解決問題,保證正式安裝或者升級能順順利利的。
3. 創建chart
創建一個基礎框架
用helm create
命令生成Chart的基礎結構。比如說創建一個叫my - nginx
的Chart:
helm create my - nginx
這個命令會在當前目錄生成一個my - nginx
文件夾,里面有Chart的基本文件和目錄結構。像Chart.yaml
(存圖表的基本信息,比如名字、版本、描述)、templates
目錄(放Kubernetes資源模板文件,像deployment.yaml
、service.yaml
)、values.yaml
(用來配置圖表參數)。我們可以根據實際需要,修改這些文件,做出符合項目要求的Chart。
打包成壓縮包
自定義圖表做好了之后,用helm package
命令把它打成壓縮包,方便分享或者部署。在my - nginx
圖表目錄下運行:
helm package my - nginx
命令會在當前目錄生成my - nginx - 0.1.0.tgz
(版本號在Chart.yaml
里定好的)壓縮包,這個壓縮包就是打包好的Chart,后面能用來上傳或者分發。
上傳壓縮包
要是有自己的私有Helm倉庫,用helm push
命令上傳打包好的圖表。假設私有倉庫地址是https://my_private_repo.com
,用戶名是myuser
,密碼是mypass
,上傳my - nginx - 0.1.0.tgz
:
helm push my - nginx - 0.1.0.tgz --username myuser --password mypass https://my_private_repo.com
上傳之后,這個Chart就能在私有倉庫里,供其他用戶使用了。
4. 查看操作
Release列表
運行helm list
能看到集群里已經安裝的Release列表:
helm list
結果會顯示Release的名字、在哪個命名空間、版本號、更新時間、狀態,還有對應的Chart名字和應用版本等信息,讓我們全面了解現在集群里都部署了哪些應用。
升級Release
升級Release的操作前面講過了,用helm upgrade
命令。比如說把my - nginx
升級到stable/nginx
的新版本,還改改配置:
helm upgrade my-nginx stable/nginx --set replicaCount = 4
升級的時候,Helm會根據現在Release的狀態和配置,再結合新版本Chart的變化,巧妙地決定怎么更新Kubernetes資源。要是有新資源,Helm就創建;要是已有資源的配置變了,Helm會按照資源類型的更新規則去更新。比如說對于Deployment資源,會用滾動更新的方式,一個一個把舊Pod換成新的,保證服務一直能用。同時,Helm會記錄升級過程中的狀態和事件,方便我們跟蹤和排查問題。
查看Release配置
用helm get values
命令查看Release的配置參數。比如說查看叫my - nginx
的Release配置:
helm get values my - nginx
結果會顯示這個Release現在用的配置參數,和values.yaml
文件里的配置是對應的,方便我們檢查配置對不對,了解現在的運行配置情況。
獲取Release詳細信息
運行helm status
命令能拿到Release的詳細信息,像配置、狀態、事件這些。比如說查看my - nginx
的詳細信息:
helm status my - nginx
輸出的內容有Release現在的狀態(比如deployed
表示已經成功部署)、資源狀態(像Deployment的副本數、Pod的運行狀態)、配置參數,還有相關的NOTES信息(一般是Chart作者給的一些使用說明),能幫我們排查問題,更深入了解部署情況。
5. 回滾操作
查看Release歷史版本
用helm history
命令查看Release的歷史版本信息。比如說查看my - nginx
的歷史版本:
helm history my-nginx
結果會顯示每個版本的修訂號、更新時間、狀態、對應的Chart版本,還有操作描述(比如安裝、升級)。通過看歷史版本,我們能知道Release都有哪些變化,為回滾操作提供依據。
回滾Release
要是升級之后出問題了,需要回滾到之前的某個版本,就用helm rollback
命令。比如說把my - nginx
回滾到版本1:
helm rollback my-nginx 1
回滾的時候,Helm會根據歷史記錄,把Release對應的Kubernetes資源變回指定版本的狀態。它會重新用舊版本Chart的配置,改資源的參數,像Deployment的鏡像版本、副本數量,讓它們和目標版本一樣。同時,Helm也會像升級操作那樣,采用合理的資源更新策略,保證回滾過程中服務穩定、連續。要是回滾過程出問題了,Helm會試著恢復,盡量讓系統保持一致。
6. 名稱空間
-n namespace
直接在以上的命令后面加上這個,就能在具體的namespace里面運行這些命令,比如:
helm list -n mynamespce
helm history alias -n mynamespace
掌握了Helm這些核心概念和常用操作,在管理Kubernetes集群里的應用時,我們就能更高效地部署、升級、維護應用,充分發揮Kubernetes的優勢,提高開發運維效率。要是在使用Helm的時候遇到問題,或者對上面這些操作有不明白的地方,比如在特定場景下怎么調整配置,隨時來交流。