Herm详解
Helm 是 Kubernetes 的包管理工具,类似 Linux 中的 apt
或 yum
,用于简化 Kubernetes 应用的部署、升级、回滚和管理。
核心概念:
-
Chart(图表):一个 Helm 包,包含 Kubernetes 资源清单(Deployment、Service 等)的模板文件和配置文件,用于定义一个完整的应用。结构类似:
plaintext
my-chart/ ├── Chart.yaml # Chart 元数据(名称、版本等) ├── values.yaml # 默认配置值(可被用户覆盖) ├── templates/ # 资源模板文件(使用 Go 模板语法) │ ├── deployment.yaml │ ├── service.yaml │ └── ingress.yaml └── charts/ # 依赖的子 Chart
-
Release(发布):Chart 部署到 Kubernetes 集群后的实例。同一个 Chart 可以部署多次,生成多个独立的 Release(如
myapp-prod
、myapp-test
)。 -
Repository(仓库):存储和共享 Chart 的地方(类似 Docker Hub),官方仓库为 Artifact Hub。
二、Helm 的作用
- 简化部署:将复杂的 Kubernetes 资源(Deployment、Service、Ingress 等)打包成一个 Chart,一键部署。
- 配置分离:通过
values.yaml
分离固定模板和可变配置(如环境变量、副本数),支持多环境复用。 - 版本管理:跟踪 Release 的版本,支持一键升级和回滚。
- 依赖管理:自动处理应用依赖的其他服务(如数据库)。
三、具体应用实例:用 Helm 部署一个 Nginx 应用
下面通过一个完整流程,演示如何使用 Helm 创建、配置、部署和管理一个 Nginx 应用。
步骤 1:安装 Helm
- 参考 官方文档 安装 Helm 客户端(
helm
命令)。 - 验证安装:
bash
helm version # 输出客户端和服务端(Tiller,Helm 3 已移除 Tiller)版本
步骤 2:创建自定义 Chart
我们创建一个名为 my-nginx-chart
的 Chart,用于部署 Nginx。
bash
# 创建 Chart 骨架
helm create my-nginx-chart
cd my-nginx-chart
生成的目录结构如下(核心文件):
plaintext
my-nginx-chart/
├── Chart.yaml # 元数据(名称、版本等)
├── values.yaml # 默认配置
└── templates/ # 资源模板├── deployment.yaml # 部署 Nginx 的 Deployment 模板├── service.yaml # 暴露服务的 Service 模板└── ingress.yaml # 外部访问的 Ingress 模板(默认未启用)
步骤 3:配置 Chart
修改默认配置,自定义 Nginx 的部署参数。
-
修改
values.yaml
(核心配置):该文件定义了可定制的参数,如镜像版本、副本数、端口等:yaml
# values.yaml replicaCount: 2 # 部署 2 个 Nginx 副本image:repository: nginx # 镜像名称tag: "1.23" # 镜像版本(而非 latest,更稳定)pullPolicy: IfNotPresent # 镜像拉取策略service:type: ClusterIP # 服务类型(集群内部访问)port: 80 # 服务端口ingress:enabled: true # 启用 Ingress(外部访问)className: nginx # 使用 nginx 控制器hosts:- host: nginx.example.com # 访问域名(需在本地 hosts 绑定集群 IP)paths:- path: /pathType: Prefixannotations:# 配置 Nginx 代理超时(可选)nginx.ingress.kubernetes.io/proxy-read-timeout: "300"
-
查看模板文件(无需修改,了解即可):
templates/deployment.yaml
中使用 Go 模板语法引用values.yaml
的配置,例如:yaml
# templates/deployment.yaml(片段) spec:replicas: {{ .Values.replicaCount }} # 引用副本数template:spec:containers:- name: {{ .Chart.Name }}image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" # 引用镜像
步骤 4:部署 Release
将 Chart 部署到 Kubernetes 集群,生成一个名为 my-nginx-release
的 Release。
bash
# 部署前检查模板渲染结果(可选,验证配置是否正确)
helm template my-nginx-release ./my-nginx-chart --dry-run# 部署 Release(指定命名空间,不存在则自动创建)
helm install my-nginx-release ./my-nginx-chart -n nginx-demo --create-namespace
输出类似:
plaintext
NAME: my-nginx-release
LAST DEPLOYED: Tue Oct 21 10:00:00 2025
NAMESPACE: nginx-demo
STATUS: deployed
REVISION: 1
TEST SUITE: None
步骤 5:验证部署
bash
# 查看 Release 状态
helm list -n nginx-demo# 查看 Kubernetes 资源(Deployment、Service、Ingress)
kubectl get all -n nginx-demo
kubectl get ingress -n nginx-demo
此时,Nginx 已部署成功:
- 2 个 Pod 运行 Nginx 1.23 版本;
- Service 暴露 80 端口,供集群内部访问;
- Ingress 绑定域名
nginx.example.com
,外部可通过该域名访问(需确保集群有 Nginx Ingress 控制器,且域名解析到集群入口 IP)。
步骤 6:升级 Release
如果需要修改配置(如增加副本数),无需重新部署,直接升级即可。
bash
# 方式 1:直接修改 values 并升级(临时生效)
helm upgrade my-nginx-release ./my-nginx-chart -n nginx-demo --set replicaCount=3# 方式 2:通过自定义 values 文件升级(推荐,持久化配置)
# 创建 custom-values.yaml,覆盖默认配置
echo "replicaCount: 3" > custom-values.yaml
helm upgrade my-nginx-release ./my-nginx-chart -n nginx-demo -f custom-values.yaml
验证升级结果:
bash
kubectl get deployment -n nginx-demo # 查看副本数是否变为 3
步骤 7:回滚 Release
如果升级后出现问题,可回滚到历史版本。
bash
# 查看 Release 历史版本
helm history my-nginx-release -n nginx-demo# 回滚到版本 1(初始部署版本)
helm rollback my-nginx-release 1 -n nginx-demo
步骤 8:卸载 Release
bash
helm uninstall my-nginx-release -n nginx-demo
四、使用公共仓库的 Chart(快速部署)
除了自定义 Chart,还可以直接使用官方仓库中的 Chart(如 MySQL、Redis 等)。
例如,部署官方 MySQL:
bash
# 添加官方仓库
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update # 拉取仓库最新信息# 部署 MySQL(设置 root 密码)
helm install my-mysql bitnami/mysql -n mysql-demo --create-namespace \--set auth.rootPassword=myrootpass