Helm 从入门到精通:Kubernetes 应用打包与自动化部署实战指南
一、Helm 是什么
Helm 是 Kubernetes 的 包管理工具,类似于 Linux 的 apt 或 yum。
它用于将一组 Kubernetes YAML 文件打包成一个可重用、可版本化的“Chart”,实现一键安装、升级与回滚操作。
一句话概括:
Helm = Kubernetes 的应用管理器。
二、Helm 的核心功能
| 功能 | 描述 |
|---|---|
| 应用打包(Chart) | 将多个 YAML 文件封装为一个可重用包 |
| 版本管理 | 管理应用不同版本并支持快速回滚 |
| 参数化部署 | 通过 values.yaml 自定义配置 |
| 依赖管理 | 支持多 Chart 嵌套与依赖 |
| 模板化渲染 | 使用 Go 模板动态生成 YAML |
| 远程仓库管理 | 类似于 Docker Hub 的 Chart 仓库 |
| CI/CD 集成 | 可与 Jenkins、GitLab、ArgoCD 自动部署结合 |
三、Helm 的架构
+-------------------------------------------------------+ | Helm CLI | +-------------------------------------------------------+ | Charts (应用包定义) | +-------------------------------------------------------+ | Tiller / Kubernetes API Server | +-------------------------------------------------------+ | Kubernetes Cluster | +-------------------------------------------------------+
Helm 3 版本后已移除 Tiller,更安全、更简洁,直接通过 Kubernetes API 操作集群。
四、安装与配置
1. 安装 Helm
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
2. 验证版本
helm version
输出:
version.BuildInfo{Version:"v3.15.0", GitCommit:"...", GoVersion:"go1.22"}
五、添加与管理仓库
添加官方仓库:
helm repo add stable https://charts.helm.sh/stable helm repo update
查看仓库列表:
helm repo list
搜索可用 Chart:
helm search repo mysql
六、安装与卸载应用
安装 MySQL:
helm install mydb bitnami/mysql
查看部署状态:
helm list kubectl get pods
卸载:
helm uninstall mydb
七、Chart 的基本结构
mychart/ ├── Chart.yaml # Chart 元信息 ├── values.yaml # 默认配置 ├── templates/ # 模板文件 │ ├── deployment.yaml │ ├── service.yaml │ ├── _helpers.tpl ├── charts/ # 子依赖 Chart └── README.md
八、创建自定义 Chart
创建:
helm create myapp
目录结构自动生成。
修改 values.yaml:
replicaCount: 2 image: repository: nginx tag: "1.25" service: type: NodePort port: 80
安装:
helm install webapp ./myapp
验证:
kubectl get svc,pods
九、模板语法基础
Helm 使用 Go Template 语法动态渲染 Kubernetes 配置文件。
示例 deployment.yaml:
apiVersion: apps/v1 kind: Deployment metadata: name: {{ .Release.Name }}-deploy spec: replicas: {{ .Values.replicaCount }} selector: matchLabels: app: {{ .Chart.Name }} template: metadata: labels: app: {{ .Chart.Name }} spec: containers: - name: {{ .Chart.Name }} image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" ports: - containerPort: 80
Helm 会自动替换模板中的变量。
十、模板函数与管道
Helm 模板可使用 Go 的函数与管道:
{{ default "latest" .Values.image.tag }} {{ upper .Chart.Name }} {{ toYaml .Values | indent 4 }}
支持条件逻辑:
{{- if .Values.service.enabled }} apiVersion: v1 kind: Service ... {{- end }}
十一、values.yaml 参数化部署
可通过命令行自定义参数:
helm install webapp ./myapp --set image.tag=1.26 --set replicaCount=3
或使用独立文件:
prod-values.yaml:
replicaCount: 5 image: tag: "stable"
执行:
helm install webapp ./myapp -f prod-values.yaml
参考案例:www.rzrsh.cn
十二、Chart 依赖管理
在 Chart.yaml 中定义依赖:
dependencies: - name: redis version: "17.3.0" repository: "https://charts.bitnami.com/bitnami"
下载依赖:
helm dependency update
安装时会自动部署 Redis。
十三、升级与回滚
升级:
helm upgrade webapp ./myapp --set image.tag=1.27
查看版本历史:
helm history webapp
回滚:
helm rollback webapp 1
十四、模板调试与渲染预览
helm template ./myapp
可输出渲染后的 YAML,不实际部署。
验证渲染:
helm lint ./myapp
十五、Helm Hooks(钩子机制)
钩子用于在部署生命周期执行特定任务。
示例:
job-cleanup.yaml:
apiVersion: batch/v1 kind: Job metadata: name: cleanup annotations: "helm.sh/hook": pre-delete spec: template: spec: containers: - name: cleaner image: alpine command: ["sh", "-c", "echo 清理旧数据"] restartPolicy: Never
在卸载前执行。
十六、Chart 打包与分发
打包:
helm package ./myapp
生成:
myapp-0.1.0.tgz
上传到仓库或自建服务器。
添加自定义仓库:
helm repo index .
部署时直接安装:
helm install myapp myrepo/myapp
十七、Helm 与 CI/CD 集成
GitLab CI 示例
stages: - deploy deploy: stage: deploy image: alpine/helm:3.15.0 script: - helm upgrade --install webapp ./chart --values values-prod.yaml
Jenkins Pipeline
stage('Deploy') { steps { sh 'helm upgrade --install webapp ./chart' } }
十八、Helm 与 ArgoCD 自动化部署
Helm Chart 可直接作为 ArgoCD 应用模板。
ArgoCD 自动同步 Git 仓库的 Chart 版本,实现 GitOps 模式。
apiVersion: argoproj.io/v1alpha1 kind: Application metadata: name: webapp spec: source: repoURL: 'https://github.com/company/helm-charts' path: myapp targetRevision: HEAD destination: server: 'https://kubernetes.default.svc' namespace: production
十九、Helm 安全与最佳实践
-
不要在 Chart 中直接写入密码,使用 Secret 管理。
-
将所有环境变量参数化至
values.yaml。 -
使用
.helmignore忽略临时文件。 -
Chart 版本与应用版本分开管理。
-
发布前使用
helm lint校验。 -
对生产环境启用签名验证:
helm package --sign --key "devops-key" --keyring ~/.gnupg/pubring.gpg helm verify myapp-0.1.0.tgz
二十、企业级实战场景
| 场景 | 实践方案 |
|---|---|
| 多环境部署 | 开发、测试、生产共用一套 Chart |
| 微服务管理 | 每个服务独立 Chart,支持版本独立升级 |
| 自动化运维 | Helm + Jenkins 实现自动部署与回滚 |
| 云原生应用发布 | 使用 Helm Charts 管理 Kubernetes 资源 |
| 分布式系统打包 | 如 ELK、Prometheus、Kafka 一键部署 |
| GitOps 流程 | Helm + ArgoCD 自动同步 Git 配置 |
| 混合云支持 | Helm Chart 统一管理多集群配置 |
| 安全可追溯部署 | 签名验证、Chart 版本控制与审计日志 |
更多推荐
所有评论(0)