Helm 作為 Kubernetes 體系的包管理工具,已經(jīng)逐漸成為了應(yīng)用分發(fā)標(biāo)準(zhǔn),在 .NET 開發(fā)中,可以理解為與 NuGet 包類似?;仡欀拔恼轮械慕榻B,Kubernetes 中單個服務(wù)的部署有時會涉及到多種資源類型,如:Deployemet、Service、Ingress、PVC、ConfigMap、Secret 等,而通過 Helm 可以把服務(wù)相關(guān)資源打包到一個 chart 中,以 chart 為單位,進(jìn)行版本管理,簡化 Kubernetes 部署應(yīng)用的版本控制、打包、發(fā)布、刪除、更新等操作。
以下是 Helm 3 的架構(gòu)圖,通過 Helm Client 創(chuàng)建 chart ,然后把基于 chart 將相關(guān)資源在 Kubernetes 中創(chuàng)建,同時 chart 可被保存到 chart 倉庫,進(jìn)行 chart 包管理與共享。

Helm 安裝與配置
Helm 3 的安裝參考文檔 Installing Helm 簡單幾步即可完成,我這里采用的是 Binary Releases 方式。安裝完成后需添加 chart 倉庫源,有了 chart 倉庫源才能進(jìn)行搜索與安裝。下面先添加 azure 和 aliyun 的倉庫源:
helm repo add stable http://mirror.azure.cn/kubernetes/charts
helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
helm repo update
經(jīng)過以上配置,就可以通過 helm search repo xxxx 搜索相關(guān) chart 包進(jìn)行安裝使用(和 docker search 類似)。如:

搭建 repo
這里將使用 harbor 來保存 Helm chart,下載最新 harbor-offline-installer 的 release 版本,解壓后對 harbor.yml 進(jìn)行相關(guān)修改,主要調(diào)整配置如下(如果不使用 https ,需要注釋配置文件中 https 相關(guān)字段):
hostname: 192.168.124.9 # 訪問地址
http:
port: 8888 # 端口
chart:
absolute_url: enabled
首次安裝,執(zhí)行以下命令(之后停止或啟動執(zhí)行 ./docker-compose start|stop):
./install.sh --with-clair --with-chartmuseum
安裝成功后,訪問 http://192.168.124.9:8888,創(chuàng)建名為 charts 的項目作為接下來使用的 chart 倉庫。

在 Helm 中添加自建的 repo http://192.168.124.9:8888/chartrepo/charts,因為 charts 項目是私有級別,所以在添加時需要傳入用戶名和密碼,如下:
helm repo add harbor http://192.168.124.9:8888/chartrepo/charts --username=admin --password=Harbor12345
helm repo update
創(chuàng)建 Chart
執(zhí)行命令 helm create k8sdemo 創(chuàng)建名為 k8sdemo 的 chart,會生成一批文件,文件結(jié)構(gòu)如下圖,可以看出有些文件是我們比較熟悉的,如:deployement.yaml、ingress.yaml、service.yaml:
├── charts
├── Chart.yaml
├── templates
│ ├── deployment.yaml
│ ├── _helpers.tpl
│ ├── hpa.yaml
│ ├── ingress.yaml
│ ├── NOTES.txt
│ ├── serviceaccount.yaml
│ ├── service.yaml
│ └── tests
│ └── test-connection.yaml
└── values.yaml
- charts:存放該 chart 依賴的所有子 chart;
- Chart.yaml:基本信息定義,如:名稱、版本、描述等;
-
templates:存放模板文件,
_helpers.tpl定義變量,NOTES.txt注釋文件,yaml 文件則是各資源類型定義模板,tests下是相關(guān)的測試模板; -
values.yaml:定義模板中需要使用的常量,如果需要對常量進(jìn)行二次處理,則需要在
_helpers.tpl通過變量實現(xiàn),如:
{{- define "k8sdemo.name" -}}
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
{{- end }}
在 templates 文件夾下的模板文件中包含大量的常量、變量的引用,具體語法就不詳細(xì)介紹了,基本多看兩眼都能理解
k8sdemo chart 創(chuàng)建主要包含以下 3 個文件的調(diào)整:
values.yaml 主要修改內(nèi)容如下,創(chuàng)建 3 個 Pod,鏡像使用beckjin/k8sdemo:1.0.0 版本,以 NodePort 的方式提供服務(wù),對外端口為 31000,其他可保持默認(rèn):
replicaCount: 3
image:
repository: beckjin/k8sdemo
pullPolicy: IfNotPresent
tag: "1.0.0"
service:
type: NodePort
port: 80
nodePort: 31000
templates/deployment.yaml 主要修改健康檢查的配置,默認(rèn)是 / 路由,這里改成 /weatherforecast,如下:
livenessProbe:
httpGet:
path: /weatherforecast
port: http
readinessProbe:
httpGet:
path: /weatherforecast
port: http
templates/service.yaml 主要修改 nodePort 字段,引用常量 Values.service.nodePort,如下:
spec:
type: {{ .Values.service.type }}
ports:
- port: {{ .Values.service.port }}
targetPort: http
nodePort: {{ .Values.service.nodePort }}
protocol: TCP
name: http
其他的幾個模板文件暫無需調(diào)整,可通過查看每個 yaml 文件的具體代碼,像 hpa.yaml、ingress.yaml、serviceaccount.yaml 都是含開關(guān)控制的,默認(rèn)不啟用。最后可以通過 helm lint k8sdemo/ 進(jìn)行語法檢查,如果沒問題就可以直接打包成 chart 使用了。
推送到 repo
chart 的推送這里將使用 helm-push 插件來完成,它的作用是將創(chuàng)建出來的 chart 包推送到遠(yuǎn)端的 chart 倉庫。由于網(wǎng)絡(luò)上的問題,建議直接下載對應(yīng)系統(tǒng)版本的 release 包,上傳至 Helm 的插件目錄,Linux 下為:/root/.local/share/helm/plugins/ 。
└── helm-push
├── bin
│ └── helmpush
├── helm-push_0.8.1_linux_amd64.tar.gz
├── LICENSE
└── plugin.yaml
將 k8sdemo 文件夾進(jìn)行打包,生成 k8sdemo-1.0.0.tgz
helm package k8sdemo/
推送到 harbor
helm push k8sdemo-1.0.0.tgz harbor
推送成功后在 charts 項目的 Helm Charts 下會有出現(xiàn)對應(yīng)的 chart 包:

安裝 Chart
在進(jìn)行安裝使用前,需要先進(jìn)行 helm repo update 操作,不然獲取不到最新的內(nèi)容,另外可執(zhí)行命令 helm search repo k8sdemo 查看結(jié)果:

執(zhí)行命令 helm install k8sdemo harbor/k8sdemo 進(jìn)行安裝,最終會輸出如下內(nèi)容,這部分信息其實是在 NOTES.txt 中定義的。我們可以根據(jù)提示信息執(zhí)行命令,獲取服務(wù)訪問地址,當(dāng)然也可以直接通過 kubectl get services 查看。

升級
如果 chart 需要升級,可修改 Chart.yaml 中的 version 字段,重新打包并推送,然后 helm repo update 更新 chart 倉庫,最后執(zhí)行 helm upgrade k8sdemo harbor/k8sdemo 進(jìn)行升級。

回滾
通過 helm history k8sdemo 查看歷史版本,然后執(zhí)行 helm rollback k8sdemo 版本號 即可回滾到之前的版本。
