有了Kubernetes,為啥還需要Helm?
隨著容器技術(shù)的興起,Kubernetes(簡稱K8s)已經(jīng)成為部署、管理和擴(kuò)展容器化應(yīng)用的事實(shí)標(biāo)準(zhǔn)。然而,在實(shí)際使用過程中,直接通過YAML文件管理復(fù)雜的Kubernetes應(yīng)用程序變得越來越困難。為了解決這一問題,Helm應(yīng)運(yùn)而生。本次將介紹為什么在擁有K8s之后仍然需要Helm,并簡要介紹下Helm。
一、什么是Helm?
Helm是Kubernetes的一個包管理器,它允許開發(fā)者定義、安裝和升級最復(fù)雜Kubernetes應(yīng)用程序。Helm使用一種稱為Charts的打包格式來描述一組相關(guān)的Kubernetes資源。這使得團(tuán)隊(duì)能夠更容易地共享和重用他們的Kubernetes配置。
二、有了K8s,為何還需要Helm?
我們直接先給出一幅對比圖:
圖片
1、簡化部署過程
(1)簡化復(fù)雜的YAML文件:對于大型項(xiàng)目來說,維護(hù)成百上千個相互關(guān)聯(lián)的YAML文件是一項(xiàng)艱巨的任務(wù)。Helm通過模板化這些文件并將其組織成易于理解和管理的charts來解決這個問題。
(2)參數(shù)化配置:Helm支持通過values文件或命令行參數(shù)動態(tài)改變chart中的值,從而讓同一個chart可以適應(yīng)不同環(huán)境的需求。
2、提高可移植性和復(fù)用性
(1)易于分享和重用:一旦創(chuàng)建了一個chart,就可以很容易地與其他人共享,或者在不同的環(huán)境中重復(fù)使用。
(2)版本控制:Helm提供了對charts進(jìn)行版本管理的能力,這意味著你可以輕松回滾到之前的版本,或者嘗試新功能而不影響生產(chǎn)環(huán)境。
3、便于團(tuán)隊(duì)協(xié)作
(1)促進(jìn)團(tuán)隊(duì)合作:通過標(biāo)準(zhǔn)化的應(yīng)用程序部署流程,團(tuán)隊(duì)成員之間可以統(tǒng)一使用Helm協(xié)作部署。
(2)集成CI/CD管道:Helm非常適合集成到持續(xù)集成/持續(xù)交付(CI/CD)工作流中,實(shí)現(xiàn)自動化測試、構(gòu)建及部署。
三、Helm快速入門
1、Helm整體架構(gòu)
2、Helm核心概念
Helm有三個核心概念:chart、repository和release。
(1)Chart 代表著 Helm 包。它包含在 Kubernetes 集群內(nèi)部運(yùn)行應(yīng)用程序,工具或服務(wù)所需的所有資源定義。你可以把它看作是 Homebrew formula,Apt dpkg,或 Yum RPM 在Kubernetes 中的等價物。
(2)Repository(倉庫) 是用來存放和共享 charts 的地方。它就像 Fedora 的 軟件包倉庫,只不過它是供 Kubernetes 包所使用的。
(3)Release 是運(yùn)行在 Kubernetes 集群中的 chart 的實(shí)例。一個 chart 通??梢栽谕粋€集群中安裝多次。每一次安裝都會創(chuàng)建一個新的 release。以 MySQL chart為例,如果你想在你的集群中運(yùn)行兩個數(shù)據(jù)庫,你可以安裝該chart兩次。每一個數(shù)據(jù)庫都會擁有它自己的 release 和 release name。
3、Helm安裝與使用
從以下命令中,我們可以看到Helm的安裝和使用過程非常簡單。
(1)安裝Helm客戶端
$ curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
$ chmod 700 get_helm.sh
$ ./get_helm.sh
#macOS安裝
brew install helm
(2)創(chuàng)建自己的Chart
$ helm create mychart
mychart結(jié)構(gòu)如下:
mychart/
Chart.yaml # 包含了chart信息的YAML文件
LICENSE # 可選: 包含chart許可證的純文本文件
README.md # 可選: 可讀的README文件
values.yaml # chart 默認(rèn)的配置值
values.schema.json # 可選: 一個使用JSON結(jié)構(gòu)的values.yaml文件
charts/ # 包含chart依賴的其他chart
crds/ # 自定義資源的定義
templates/ # 模板目錄, 當(dāng)和values 結(jié)合時,可生成有效的Kubernetes manifest文件
templates/NOTES.txt # 可選: 包含簡要使用說明的純文本文件
Chart.yaml文件是chart必需的。包含了以下字段:
apiVersion: chart API 版本 (必需)
name: chart名稱 (必需)
version: 語義化2 版本(必需)
kubeVersion: 兼容Kubernetes版本的語義化版本(可選)
description: 一句話對這個項(xiàng)目的描述(可選)
type: chart類型 (可選)
keywords:
- 關(guān)于項(xiàng)目的一組關(guān)鍵字(可選)
home: 項(xiàng)目home頁面的URL (可選)
sources:
- 項(xiàng)目源碼的URL列表(可選)
dependencies: # chart 必要條件列表 (可選)
- name: chart名稱 (nginx)
version: chart版本 ("1.2.3")
repository: (可選)倉庫URL ("https://example.com/charts") 或別名 ("@repo-name")
condition: (可選) 解析為布爾值的yaml路徑,用于啟用/禁用chart (e.g. subchart1.enabled )
tags: # (可選)
- 用于一次啟用/禁用 一組chart的tag
import-values: # (可選)
- ImportValue 保存源值到導(dǎo)入父鍵的映射。每項(xiàng)可以是字符串或者一對子/父列表項(xiàng)
alias: (可選) chart中使用的別名。當(dāng)你要多次添加相同的chart時會很有用
maintainers: # (可選)
- name: 維護(hù)者名字 (每個維護(hù)者都需要)
email: 維護(hù)者郵箱 (每個維護(hù)者可選)
url: 維護(hù)者URL (每個維護(hù)者可選)
icon: 用做icon的SVG或PNG圖片URL (可選)
appVersion: 包含的應(yīng)用版本(可選)。不需要是語義化,建議使用引號
deprecated: 不被推薦的chart (可選,布爾值)
annotations:
example: 按名稱輸入的批注列表 (可選).
(3) 部署并查看Chart
# 安裝chart
$ helm install mychart ./mychart
# 查看已安裝的chart
$ helm list
# 查看chart的依賴
$ helm dependency list mychart
# 查看Chart的歷史
$ helm history mychart
(4) 升級或卸載Chart
$ helm upgrade mychart ./mychart
$ helm uninstall mychart
四、結(jié)語
雖然Kubernetes本身已經(jīng)非常強(qiáng)大,但隨著容器化應(yīng)用規(guī)模的擴(kuò)大以及復(fù)雜度的增加,直接通過YAML文件來管理這些應(yīng)用變得愈發(fā)困難。Helm作為Kubernetes的一個包管理器,不僅簡化了部署流程,還極大地提高了配置的可維護(hù)性與復(fù)用性,使得開發(fā)團(tuán)隊(duì)能夠更高效地協(xié)作,并且輕松應(yīng)對多環(huán)境下的持續(xù)集成/持續(xù)交付(CI/CD)需求。
此外,Helm的強(qiáng)大之處不僅僅體現(xiàn)在其對于單個應(yīng)用或服務(wù)的打包能力上,它還能幫助用戶構(gòu)建復(fù)雜的微服務(wù)架構(gòu)。通過定義清晰的服務(wù)依賴關(guān)系,并利用版本控制系統(tǒng)來跟蹤每次變更,Helm讓整個系統(tǒng)的演進(jìn)過程更加透明可控。這對于需要頻繁更新和迭代的大中型企業(yè)級項(xiàng)目尤為重要。
值得注意的是,盡管Helm提供了許多便利功能,但在實(shí)際使用過程中也需要注意一些潛在問題。例如,不恰當(dāng)?shù)腸hart設(shè)計(jì)可能會導(dǎo)致資源過度消耗;而缺乏足夠的安全性考量,則可能使系統(tǒng)面臨不必要的風(fēng)險(xiǎn)。因此,在享受Helm帶來便捷的同時,開發(fā)者們也需要不斷學(xué)習(xí)最佳實(shí)踐,確保自己的Kubernetes集群被高效安全地管理。
參考: https://helm.sh/docs/