K8S Helm應(yīng)用部署與依賴治理實戰(zhàn)教程
一、引言
在 Kubernetes 應(yīng)用部署實踐中,開發(fā)者常面臨三大核心挑戰(zhàn):
1. 環(huán)境配置漂移
開發(fā)、測試、生產(chǎn)環(huán)境需維護(hù)多套高度相似的 Kubernetes 資源聲明文件(YAML)。同步修改時易出現(xiàn)人工遺漏與配置失準(zhǔn)。
2.版本回退失控
組件升級后因兼容性問題需快速回滾時,缺乏原子化的版本快照與變更追蹤機(jī)制。
3.依賴治理低效
應(yīng)用依賴的中間件(如 Redis/MySQL)需人工管理啟動順序與版本耦合,維護(hù)成本高且易引發(fā)環(huán)境不一致。
Helm作為 Kubernetes 的包管理工具,通過以下機(jī)制實現(xiàn)應(yīng)用部署的標(biāo)準(zhǔn)化治理:
• 聲明式模板與參數(shù)解耦
將 Kubernetes 資源抽象為可復(fù)用的 Chart 模板,通過 Values 文件實現(xiàn)多環(huán)境配置動態(tài)注入。
• 版本控制與發(fā)布追蹤
基于 Release 記錄每次部署的全量狀態(tài),支持原子化回滾至任意歷史版本。
• 依賴聲明與生命周期編排
通過子 Chart 聲明式定義組件依賴關(guān)系,實現(xiàn)版本鎖定與啟動順序自動編排。
二、Helm 的核心機(jī)制解析
2.1 Helm 架構(gòu)與核心要素
Helm 是 Kubernetes 的包管理器,其核心邏輯可以類比為:將一組 Kubernetes 資源模板(Chart)+ 一組參數(shù)配置(Values),組合生成標(biāo)準(zhǔn)的資源清單,然后交由 Kubernetes 創(chuàng)建或更新對象。
Helm 核心概念

Chart 項目結(jié)構(gòu)
一個典型的 Chart 項目結(jié)構(gòu)如下:
myapp-chart/ # 主chart,負(fù)責(zé)部署應(yīng)用
├── Chart.yaml # 元數(shù)據(jù):名稱、版本、依賴聲明
├── values.yaml # 默認(rèn)參數(shù)配置
├── charts/ # 子Chart的存放目錄(用于依賴管理)
└── templates/ # 資源模板目錄
├── deployment.yaml
├── service.yaml
└── _helpers.tpl # 模板輔助函數(shù)Helm 工作流程
1.模板渲染:解析模板文件(Go Template 語法),將 values.yaml中的參數(shù)動態(tài)注入,生成標(biāo)準(zhǔn) manifest YAML 文件。
2.依賴處理:讀取 Chart.yaml中的依賴配置,遞歸拉取子 Chart,構(gòu)建完整依賴樹。
3.資源部署:通過 Kubernetes API 與集群通信,創(chuàng)建或更新資源,并記錄為一個新的 Release。
每一次 install或 upgrade操作,都會生成一條 Release 記錄,支持隨時回滾。
2.2 Helm 的標(biāo)準(zhǔn)化設(shè)計范式
1.模板抽象機(jī)制
Helm 使用 Go Template 模板語法將參數(shù)與資源分離,實現(xiàn)資源模板的復(fù)用和定制。
(1) 動態(tài)變量注入
通過 .Values.xxx引用配置項:
# templates/deployment.yaml
spec:
replicas: {{ .Values.replicaCount }}
image: {{ .Values.image.repository }}:{{ .Values.image.tag }}(2) 條件渲染控制
支持按條件渲染資源(如是否啟用 Ingress):
{{- if .Values.ingress.enabled }}
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: {{ .Chart.Name }}
{{- end }}2.多環(huán)境配置策略
為了適配開發(fā)、測試、生產(chǎn)等不同環(huán)境,Helm 支持靈活的參數(shù)覆蓋機(jī)制。
(1) 配置文件疊加
可以使用多個 -f參數(shù)指定多個配置文件,實現(xiàn)層級覆蓋:
helm install myapp ./chart \ -f values-base.yaml \ -f values-prod.yaml
例如,values-base.yaml設(shè)置通用配置,values-prod.yaml只需覆蓋部分生產(chǎn)環(huán)境特有參數(shù)。
最終生效的配置 = values-base.yaml被values-prod.yaml覆蓋后的結(jié)果。
(2) 參數(shù)優(yōu)先級規(guī)則
Helm 的參數(shù)解析優(yōu)先級如下(從高到低):
命令行 --set > 指定的 values 文件 > 默認(rèn) values.yaml
可臨時通過命令行 --set key=value快速覆蓋任何配置項,適用于調(diào)試或自動化腳本場景。
3.Chart 版本管理體系
(1) Chart 版本號(version)
用于控制模板自身的版本,遵循語義化版本規(guī)范(SemVer):
# Chart.yaml version: 2.1.5 # 模板版本(每次結(jié)構(gòu)變更需更新) appVersion: "3.8.0" # 被部署應(yīng)用的版本(非必需同步)
(2) Release 回滾機(jī)制
每次部署會生成新的 Release,可通過命令回退到任意版本:
helm history myapp -n prod # 查看歷史記錄 helm rollback myapp 2 # 回滾到第 2 個版本
2.3 依賴治理機(jī)制解析
在實際項目中,很多應(yīng)用依賴數(shù)據(jù)庫、緩存等第三方組件。Helm 提供了完整的依賴管理方案。
1.子 Chart 管理
(1) 依賴聲明
在主 Chart 的 Chart.yaml中聲明依賴:
# Chart.yaml
dependencies:
- name: mysql
version: "9.8.0"
repository: "https://charts.bitnami.com/bitnami"
condition: mysql.enabled # 可通過配置控制啟動(2) 下載依賴
使用如下命令更新并下載 mysql 子 Chart 到 charts/目錄下:
helm dependency update ./chart
2.版本約束策略

3.命名沖突與依賴隔離
如果多個子 Chart 使用了相同的名稱,可以使用 alias重命名避免沖突:
dependencies:
- name: postgresql
alias: user-db
version: "11.6.12"此時在模板中可通過 .Values.user-db引用該組件的參數(shù)配置。
三 、Helm 多環(huán)境部署管理實戰(zhàn)
3.1 環(huán)境準(zhǔn)備
1.安裝必要工具
Mac/Linux 用戶
# 安裝 Docker 并啟動服務(wù)(容器運(yùn)行時基礎(chǔ)) brew install --cask docker open /Applications/Docker.app # macOS 需手動啟動 Docker Desktop # 安裝 Kubernetes 工具鏈(僅 Helm 相關(guān)) brew install kubectl kind helm # 驗證核心工具版本 echo "?? 關(guān)鍵工具版本:" docker --version # 預(yù)期輸出: Docker version 24.x+ kubectl version --client # 預(yù)期輸出: Client Version: v1.28.x helm version --short # 預(yù)期輸出: v3.12.x
2.創(chuàng)建本地 Kubernetes 集群
# 使用 Kind 快速創(chuàng)建單節(jié)點集群(輕量級) kind create cluster --name helm-lab --image=kindest/node:v1.28.0 # 驗證集群基礎(chǔ)狀態(tài) kubectl cluster-info
3.配置實驗命名空間
# 創(chuàng)建隔離環(huán)境(避免污染 default 命名空間) kubectl create ns helm-demo # 設(shè)置默認(rèn)操作空間(后續(xù)命令自動作用于此空間) kubectl config set-context --current --namespace=helm-demo
4.一鍵環(huán)境驗證
echo " 環(huán)境健康檢查:" kubectl get nodes # 預(yù)期輸出 STATUS=Ready helm list -A # 確認(rèn)無殘留 Helm Release docker ps # 查看 Kind 容器是否運(yùn)行
關(guān)鍵工具說明

3.2 場景與目標(biāo)
使用 Helm 實現(xiàn)典型微服務(wù)系統(tǒng)的多環(huán)境部署。該系統(tǒng)包含以下服務(wù)及其依賴:
• frontend:前端服務(wù),負(fù)責(zé)與用戶交互,獨(dú)立部署
• backend:后端服務(wù),負(fù)責(zé)處理業(yè)務(wù)邏輯,依賴 Redis 緩存
• Redis:緩存服務(wù),作為子 Chart 引入
通過 Helm 實現(xiàn)以下目標(biāo):
• 配置標(biāo)準(zhǔn)化:通過父 Chart 統(tǒng)一管理 frontend和 backend的部署模板
• 環(huán)境隔離:使用 values-dev.yaml和 values-prod.yaml管理環(huán)境差異
• 依賴治理:通過子 Chart 管理 Redis 依賴
• 版本控制:支持 Helm 版本回滾
3.3 項目目錄結(jié)構(gòu)
如下為典型 Helm 多環(huán)境部署結(jié)構(gòu)圖
myapp/
├── Chart.yaml # 父 Chart 元數(shù)據(jù)
├── values.yaml # 全局默認(rèn)配置
├── values-dev.yaml # 開發(fā)環(huán)境覆蓋配置
├── values-prod.yaml # 生產(chǎn)環(huán)境覆蓋配置
├── charts/ # 子 Chart 目錄(存放 Redis 依賴)
└── templates/ # 核心模板
├── frontend.yaml # 前端服務(wù)模板
├── backend.yaml # 后端服務(wù)模板
└── _helpers.tpl # 模板函數(shù)庫主要文件說明:
• Chart.yaml:Helm Chart 元數(shù)據(jù),定義應(yīng)用的基本信息。
• values.yaml:通用配置文件,提供默認(rèn)值。
• values-dev.yaml:開發(fā)環(huán)境配置,覆蓋默認(rèn)值。
• values-prod.yaml:生產(chǎn)環(huán)境配置,覆蓋默認(rèn)值。
• charts/:存放子 Chart(如 Redis)的目錄。
• templates/:存放 Kubernetes 資源模板,定義具體的服務(wù)部署配置。
3.4 實戰(zhàn)步驟
步驟 1:創(chuàng)建 Helm Chart
# 初始化 Chart 結(jié)構(gòu) helm create myapp rm -rf myapp/templates/* # 清空默認(rèn)模板(從頭開始)
步驟 2:定義 Chart 元數(shù)據(jù)
# myapp/Chart.yaml
apiVersion: v2 # Helm Chart API 版本(v2 是當(dāng)前穩(wěn)定版)
name: myapp # Chart 名稱(必須全小寫,無空格)
description: 多環(huán)境Web應(yīng)用示例
version: 1.0.0 # Chart 版本(必須遵循 SemVer 規(guī)范)
appVersion: "1.0" # 應(yīng)用本身的版本(字符串類型)
# 定義依賴組件(可包含多個子Chart)
dependencies:
- name: redis # 官方Redis Chart名稱
version: "17.0.0" # 嚴(yán)格指定版本號(避免版本漂移)
repository: "https://charts.bitnami.com/bitnami" # 官方倉庫地址
condition: redis.enabled # 是否啟用此依賴(由values.yaml中的redis.enabled控制)
依賴操作演示
# 執(zhí)行后會在 charts/ 目錄生成 redis-17.0.0.tgz
helm dependency update myapp
# 查看目錄結(jié)構(gòu)
tree myapp/charts/
myapp/charts/
└── redis-17.0.0.tgz # 下載的依賴包(二進(jìn)制格式)步驟 3:編寫模板文件
前端服務(wù)模板
# myapp/templates/frontend.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Chart.Name }}-frontend
labels:
app: frontend
spec:
replicas: {{ .Values.frontend.replicas }}
selector:
matchLabels:
app: frontend
template:
metadata:
labels:
app: frontend
spec:
containers:
- name: frontend
image: "{{ .Values.frontend.image.repository }}:{{ .Values.frontend.image.tag }}"
ports:
- containerPort: 80
env:
- name: REDIS_HOST
value: {{ .Chart.Name }}-redis-master # 引用 Redis 服務(wù)名稱
---
apiVersion: v1
kind: Service
metadata:
name: {{ .Chart.Name }}-frontend
spec:
type: {{ .Values.frontend.service.type }}
ports:
- port: 80
targetPort: 80
selector:
app: frontend后端服務(wù)模板
# myapp/templates/backend.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Chart.Name }}-backend
spec:
replicas: {{ .Values.backend.replicas }}
strategy:
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
template:
spec:
containers:
- name: backend
image: "{{ .Values.backend.image }}"
resources:
requests:
cpu: {{ .Values.backend.resources.requests.cpu }}
---
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: {{ .Chart.Name }}-backend-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: {{ .Chart.Name }}-backend
minReplicas: {{ .Values.backend.hpa.minReplicas }}
maxReplicas: {{ .Values.backend.hpa.maxReplicas }}
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: {{ .Values.backend.hpa.cpuUtilization }}步驟 4:配置參數(shù)文件
默認(rèn)參數(shù)
# myapp/values.yaml
frontend:
replicas: 2
image:
repository: nginx
tag: stable
service:
type: ClusterIP
backend:
image: myapp/backend:v1
replicas: 3
resources:
requests:
cpu: 100m
hpa:
minReplicas: 2
maxReplicas: 5
cpuUtilization: 50
redis:
enabled: true開發(fā)環(huán)境覆蓋
# myapp/values-dev.yaml
frontend:
replicas: 1
service:
type: NodePort # 開發(fā)環(huán)境暴露 NodePort
backend:
hpa:
cpuUtilization: 80 # 開發(fā)環(huán)境提高擴(kuò)縮容閾值
生產(chǎn)環(huán)境覆蓋
# myapp/values-prod.yaml
frontend:
replicas: 3
image:
tag: latest # 生產(chǎn)使用最新鏡像
backend:
replicas: 5
resources:
requests:
cpu: 500m # 生產(chǎn)環(huán)境增加資源步驟 5:安裝部署開發(fā)環(huán)境
helm install myapp ./myapp -n helm-demo \ -f myapp/values.yaml \ -f myapp/values-dev.yaml \ --set backend.image=myapp/backend:dev-latest # 命令行覆蓋鏡像標(biāo)簽
步驟 6:驗證部署
1.驗證 Helm Release 狀態(tài)
helm list -n helm-demo NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION myapp helm-demo 1 2023-08-20 14:30:15.123456 +0800 CST deployed myapp-1.0.0 1.0
關(guān)鍵點驗證
• STATUS = deployed:Release 成功部署
• CHART = myapp-1.0.0:Chart 版本與定義一致
2.驗證 Kubernetes 資源生成
kubectl get all -n helm-demo NAME READY STATUS RESTARTS AGE pod/myapp-frontend-7c5d8f8bdf 1/1 Running 0 2m pod/myapp-backend-5d7d6c8b5f 1/1 Running 0 2m NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/myapp-frontend ClusterIP 10.96.123.45 <none> 80/TCP 2m NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/frontend 1/1 1 1 2m deployment.apps/backend 1/1 1 1 2m NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE horizontalpodautoscaler.autoscaling/myapp-backend-hpa Deployment/backend 0%/50% 2 5 1 2m
關(guān)鍵點驗證
• Pod:所有應(yīng)用容器處于 Running 狀態(tài)
• Service:前端服務(wù)類型為 NodePort(來自 values-dev.yaml覆蓋)。
• HPA:CPU 利用率閾值為 80%(來自dev 覆蓋)。
3.驗證參數(shù)注入效果
檢查前端副本數(shù)(來自 values-dev.yaml覆蓋)
kubectl get deployment myapp-frontend -n helm-demo -o=jsonpath='{.spec.replicas}'
1 # 開發(fā)環(huán)境覆蓋為 1 個副本(默認(rèn)為 2)
檢查后端鏡像標(biāo)簽(命令行動態(tài)覆蓋)
kubectl get deployment myapp-backend -n helm-demo -o=jsonpath='{.spec.template.spec.containers[0].image}'
myapp/backend:dev-latest # 來自 --set 參數(shù)覆蓋4.驗證依賴管理(子 Chart 狀態(tài))
檢查 Redis 子 Chart 啟用情況 helm get values myapp -n helm-demo | grep redis.enabled redis.enabled: true 查看 Redis 服務(wù)狀態(tài) kubectl get svc -n helm-demo | grep redis myapp-redis-master ClusterIP 10.96.234.56 <none> 6379/TCP 2m
關(guān)鍵點驗證
• Redis 服務(wù)名稱包含 myapp前綴(Chart 名稱隔離)
• 端口 6379正常開放(來自子 Chart 默認(rèn)配置)
至此,我們已通過 Helm 實現(xiàn)了一個典型微服務(wù)系統(tǒng)的多環(huán)境部署流程。
注:_helpers.tpl 函數(shù)模版庫 將在下篇講解。
3.5 Helm 實踐小結(jié)
關(guān)鍵經(jīng)驗:
• 配置隔離:使用 values-dev.yaml/ values-prod.yaml實現(xiàn)環(huán)境差異。
• 依賴管理:子 Chart 引入 Redis,實現(xiàn)服務(wù)與數(shù)據(jù)庫的一體化部署。
• 模板復(fù)用:借助 _helpers.tpl統(tǒng)一標(biāo)簽與命名,提升可維護(hù)性。
• 版本控制:每次部署生成獨(dú)立 Release,可回滾、追蹤,保障發(fā)布安全。
注意事項:
• 避免配置文件冗余,保持差異項聚焦。
• 固定依賴版本,防止不兼容風(fēng)險。
• 使用 --namespace保持資源隔離。
• 配置文件建議納入 Git,支持多人協(xié)作與變更追蹤。
四、總結(jié)
4.1 核心重點
Helm 在 Kubernetes 應(yīng)用管理中的價值:
• 標(biāo)準(zhǔn)化封裝:通過 Chart 實現(xiàn)跨環(huán)境部署的統(tǒng)一打包。
• 靈活配置管理:支持多套 Values 實現(xiàn)環(huán)境差異與個性化控制。
• 依賴與復(fù)用機(jī)制:通過子 Chart 管理依賴組件,提升集成效率。
• 版本控制體系:支持版本回滾、差異對比與發(fā)布?xì)v史追蹤,增強(qiáng)發(fā)布安全性。
到此這篇關(guān)于K8S Helm 入門與實戰(zhàn) - 應(yīng)用部署與依賴治理的文章就介紹到這了,更多相關(guān)K8S Helm應(yīng)用部署內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
K8S如何利用Prometheus監(jiān)控pod的實時數(shù)據(jù)指標(biāo)
這篇文章主要給大家介紹了關(guān)于K8S如何利用Prometheus監(jiān)控pod的實時數(shù)據(jù)指標(biāo)的相關(guān)資料,Prometheus是一個開源的服務(wù)監(jiān)控系統(tǒng)和時序數(shù)據(jù)庫,其提供了通用的數(shù)據(jù)模型和快捷數(shù)據(jù)采集、存儲和查詢接口,需要的朋友可以參考下2024-01-01
Kubernetes Dashboard 配置用戶名密碼方式登錄操作流程
為了K8s集群安全,默認(rèn)情況下Dashboard以Token的形式登錄的,那如果我們想以用戶名/密碼的方式登錄該怎么操作呢?其實只需要我們創(chuàng)建用戶并進(jìn)行 ClusterRoleBinding綁定即可,下面給大家分享Kubernetes Dashboard 配置用戶名密碼方式登錄操作流程,感興趣的朋友一起看看吧2024-06-06
kubernetes?Volume存儲卷configMap學(xué)習(xí)筆記
這篇文章主要為大家介紹了kubernetes?Volume存儲卷configMap學(xué)習(xí)筆記,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05
k8s如何使用NFS作為StorageClass提供動態(tài)存儲
本文主要介紹了k8s中的StorageClass,包括其定義、引入的原因、實現(xiàn)方式、定義方法以及回收策略對數(shù)據(jù)的影響等,首先,StorageClass是在K8s集群中創(chuàng)建用于動態(tài)PV的管理,可以鏈接至不同的后端存儲,對存儲的請求可以指向StorageClass2024-09-09
2022最新青龍面板對接機(jī)器人的詳細(xì)過程(傻妞對接onebot(oicq)協(xié)議實現(xiàn)機(jī)器人功能)
這篇文章主要介紹了2022最新青龍面板對接機(jī)器人的詳細(xì)過程(傻妞對接onebot(oicq)協(xié)議實現(xiàn)機(jī)器人功能),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-05-05

