Helm 详解:Kubernetes 应用部署与管理利器
·
目录
一、Helm 核心概念
Helm 是 Kubernetes 官方提供的包管理器,类比 Linux 系统的 YUM/Apt,核心作用是简化 K8s 应用的部署、版本管理和生命周期维护。在无 Helm 时,需手动依次部署 Deployment、Service 等资源,步骤繁琐且难以规模化管理;Helm 通过打包机制将 K8s 资源配置动态化,支持版本控制,大幅降低复杂应用(尤其是微服务)的部署难度。
1. 核心定义
Helm 本质是 K8s 应用管理的 “流程封装工具”,通过模板化方式动态生成 Deployment.yaml、Service.yaml 等资源清单,再自动调用 Kubectl 执行部署,实现应用配置的可复用与可配置。
2. 三大核心概念
| 概念 | 说明 |
|---|---|
| Chart | Helm 的软件包(TAR 格式),包含一组 K8s 资源 YAML 模板及配置文件,类比 RPM/DEB 包 |
| Repository | Helm 软件仓库(Web 服务器),存储各类 Chart 包及清单文件,支持多仓库同时管理 |
| Release | Chart 部署到 K8s 集群后的实例,一个 Chart 可多次安装生成多个 Release(如两个 MySQL 实例对应两个 Release) |
3. Helm3 与 Helm2 核心区别
- Helm2:C/S 架构,包含客户端(helm)和服务端(Tiller,部署在 kube-system 命名空间),Tiller 通常拥有集群全权限,存在安全风险。
- Helm3:移除 Tiller,客户端直接读取本地 kubeconfig 文件,基于预定义权限操作 K8s 资源,更安全且架构更简洁。
官方网站:https://helm.sh/
二、Helm 部署与基础使用
1. 安装 Helm 客户端
# 1. 下载二进制包(从 https://github.com/helm/helm/tags 选择对应版本)
tar -zxvf helm-v3.6.0-linux-amd64.tar.gz
# 2. 移动二进制文件到系统路径
mv linux-amd64/helm /usr/local/bin/
# 3. 验证安装
helm version
# 4. 启用命令补全(可选)
source <(helm completion bash)
2. 仓库管理(Chart 来源配置)
# 1. 添加常用公开仓库
helm repo add bitnami https://charts.bitnami.com/bitnami # 常用应用仓库
helm repo add stable http://mirror.azure.cn/kubernetes/charts # 稳定版仓库
helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts # 阿里云仓库
helm repo add incubator https://charts.helm.sh/incubator # 孵化版仓库
# 2. 更新仓库索引(获取最新 Chart 列表)
helm repo update
# 3. 查看已添加仓库
helm repo list
# 4. 搜索仓库中的 Chart(如搜索 stable 仓库的 Chart)
helm search repo stable
# 5. 删除无用仓库(如删除 incubator)
helm repo remove incubator
3. Chart 部署与 Release 管理
# 1. 查看 Chart 详情(如查看 stable/mysql 的信息)
helm show chart stable/mysql # 查看基本信息
helm show all stable/mysql # 查看完整信息(含配置、模板)
# 2. 安装 Chart(创建 Release)
helm install my-redis bitnami/redis -n default # 指定 Release 名:my-redis,部署到 default 命名空间
helm install bitnami/redis --generate-name # 不指定名称,随机生成 Release 名
helm install my-redis bitnami/redis -n default --version 18.19.3 #直接指定版本
# 3. 查看 Release 列表
helm ls # 或 helm list
# 4. 查看指定 Release 状态
helm status my-redis
# 5. 卸载 Release(删除对应 K8s 资源)
helm uninstall my-redis
helm install my-redis bitnami/redis -n default --version 18.19.3 --set persistence.nabled=false --set master.persistence.enabled=false --set replica.persistence.enabled=false --set master.resources.requests.cpu=10m --set master.resources.requests.memory=64Mi --set replica.resources.requests.cpu=10m --set replica.resources.requests.memory=64Mi --set master.tolerations[0].key=node-role.kubernetes.io/master --set master.tolerations[0].operator=Exists --set master.tolerations[0].effect=NoSchedule --set replica.tolerations[0].key=node-role.kubernetes.io/master --set replica.tolerations[0].operator=Exists --set replica.tolerations[0].effect=NoSchedule
这段命令是使用 Helm 在 Kubernetes 集群中安装 Bitnami Redis Chart 的完整配置,通过多个参数自定义了 Redis 的部署方式。以下是逐部分解析:
1. 基础命令与核心参数
helm install my-redis bitnami/redis -n default --version 18.19.3
helm install:Helm 的安装命令,用于将 Chart 部署到 Kubernetes。
my-redis:自定义的 Release 名称(部署实例的唯一标识)。
bitnami/redis:指定安装的 Chart 来源(Bitnami 仓库中的 Redis Chart)。
-n default:指定部署的 Kubernetes 命名空间(此处为 default 命名空间)。
--version 18.19.3:指定 Chart 的 版本号(确保部署的 Redis 版本固定,避免自动升级)。
2. 持久化存储配置(禁用持久卷)
--set persistence.enabled=false \
--set master.persistence.enabled=false \
--set replica.persistence.enabled=false
禁用持久化:默认情况下,Redis 会使用持久卷(PersistentVolume)存储数据,确保重启后数据不丢失。
此处通过 persistence.enabled=false 全局禁用持久化,同时显式禁用 master(主节点)和 replica(从节点)的持久化配置,适用于 测试环境(无需长期保存数据,节省存储资源)。
3. 资源请求限制(资源配额)
--set master.resources.requests.cpu=10m \
--set master.resources.requests.memory=64Mi \
--set replica.resources.requests.cpu=10m \
--set replica.resources.requests.memory=64Mi
资源请求(Requests):为 Redis 主从节点设置最低资源需求,避免节点资源不足时被驱逐:
cpu=10m:请求 0.01 核心 CPU(1 CPU = 1000m)。
memory=64Mi:请求 64 MB 内存。
适用于 资源受限的环境(如开发/测试集群),避免 Redis 占用过多资源。
4. 容忍污点(Tolerations)配置
--set master.tolerations[0].key=node-role.kubernetes.io/master \
--set master.tolerations[0].operator=Exists \
--set master.tolerations[0].effect=NoSchedule \
--set replica.tolerations[0].key=node-role.kubernetes.io/master \
--set replica.tolerations[0].operator=Exists \
--set replica.tolerations[0].effect=NoSchedule
容忍 Master 节点污点:Kubernetes 集群中,master 节点默认带有 node-role.kubernetes.io/master 污点(Taint),阻止普通 Pod 调度到该节点(避免影响控制平面)。
此处通过 tolerations 配置让 Redis 的 主节点和从节点 能够容忍该污点,允许调度到 master 节点上(适用于 单节点集群 或资源紧张的环境)。
key=node-role.kubernetes.io/master:匹配污点的键。
operator=Exists:只要污点存在即容忍(无需检查值)。
effect=NoSchedule:容忍 "禁止调度" 类型的污点。
总结:整体作用
这条命令的最终效果是:
在 Kubernetes 的 default 命名空间中,以 非持久化、低资源占用 的方式部署 Bitnami Redis 18.19.3 版本,并允许 Redis 主从节点调度到集群的 master 节点上。
适用场景:开发、测试环境的临时 Redis 实例,无需数据持久化,且集群资源有限(需利用 master 节点资源)。
三、Helm 自定义 Chart 与部署
除了使用仓库中的 Chart,可自定义 Chart 适配业务需求,核心是通过 values.yaml 配置模板变量,实现资源动态生成。
1. Chart 目录结构
一个标准 Chart 包含以下核心文件 / 目录(以 MySQL 为例):
mysql/
├── Chart.yaml # Chart 元信息(名称、版本、应用版本等,必填)
├── values.yaml # 模板变量默认值(核心配置文件)
├── templates/ # K8s 资源模板目录
│ ├── deployment.yaml # Deployment 模板
│ ├── service.yaml # Service 模板
│ ├── ingress.yaml # Ingress 模板(可选)
│ ├── _helpers.tpl # 模板助手(可复用语法片段)
│ ├── NOTES.txt # 安装后提示信息
│ └── tests/ # 测试模板(可选)
└── README.md # 说明文档(可选)
2. 自定义 Chart 步骤
(1)创建基础 Chart
# 创建名为 nginx 的 Chart
helm create nginx
# 查看目录结构
tree nginx
(2)修改 Chart 配置
-
修改元信息(Chart.yaml):
apiVersion: v2 name: nginx # Chart 名称 description: 自定义 Nginx Chart type: application # 类型:application(应用)或 library(库) version: 0.1.0 # Chart 版本(需遵循语义化版本) appVersion: 1.16.0 # 应用版本(如 Nginx 版本) -
修改配置变量(values.yaml):核心配置文件,模板中的变量默认读取此处值,示例配置:
replicaCount: 1 # 副本数 image: repository: nginx # 镜像仓库 pullPolicy: IfNotPresent # 镜像拉取策略 tag: "latest" # 镜像标签 service: type: ClusterIP # 服务类型(后续可改为 NodePort) port: 80 # 服务端口 ingress: enabled: true # 启用 Ingress hosts: - host: www.app.com # 自定义域名 paths: - path: / pathType: Prefix # 路径匹配类型 resources: # 资源限制 limits: cpu: 100m memory: 128Mi requests: cpu: 100m memory: 128Mi -
修改模板文件(可选):若需自定义资源细节(如 Service 新增 NodePort),可修改
templates/service.yaml:apiVersion: v1 kind: Service metadata: name: {{ include "nginx.fullname" . }} # 引用模板助手生成名称 spec: type: {{ .Values.service.type }} ports: - port: {{ .Values.service.port }} targetPort: http protocol: TCP name: http nodePort: {{ .Values.service.nodePort }} # 新增 NodePort 配置(需在 values.yaml 中定义) selector: {{- include "nginx.selectorLabels" . | nindent 4 }}
(3)验证与打包 Chart
bash
# 1. 检查 Chart 配置合法性(依赖、模板语法)
helm lint nginx
# 2. 打包 Chart(生成 TAR 包:nginx-0.1.0.tgz)
helm package nginx
(4)部署自定义 Chart
# 1. 模拟部署(验证配置,不实际创建资源)
helm install nginx ./nginx --dry-run --debug
# 2. 实际部署(部署到 default 命名空间)
helm install nginx ./nginx -n default
# 或通过打包后的 TAR 包部署
helm install nginx ./nginx-0.1.0.tgz
# 3. 自定义配置部署(通过 -f 指定自定义 values 文件,覆盖默认配置)
helm install nginx ./nginx -f ./nginx/values-prod.yaml
3. Release 升级与回滚
# 1. 升级 Release(修改配置后执行,如修改 Service 为 NodePort)
helm upgrade nginx nginx # 格式:helm upgrade <Release名> <Chart路径>
# 2. 命令行临时指定参数升级(覆盖 values.yaml 中的值,如修改镜像标签)
helm upgrade nginx nginx --set image.tag='1.15'
# 3. 查看 Release 历史版本
helm history nginx
# 4. 回滚到指定版本(如回滚到版本 1)
helm rollback nginx 1
四、扩展:Helm 私有仓库(Harbor)
可通过 Harbor 搭建 Helm 私有仓库,存储自定义 Chart 供团队共享使用。
1. 准备工作
- 安装 Harbor(需启用 Chart 仓库功能),配置 Harbor 地址、管理员密码(如
192.168.10.19,密码Harbor12345)。 - 安装 Helm Push 插件(用于推送 Chart 到 Harbor):
# 在线安装 helm plugin install https://github.com/chartmuseum/helm-push # 离线安装(下载插件包后解压) mkdir ~/.local/share/helm/plugins/helm-push tar -zxvf helm-push_0.8.1_linux_amd64.tar.gz -C ~/.local/share/helm/plugins/helm-push
2. 配置 Harbor 仓库并推送 Chart
# 1. 登录 Harbor Web 界面,创建公开项目(如 chart_repo)
# 2. 添加 Harbor 作为 Helm 仓库(格式:http://<Harbor地址>/chartrepo/<项目名>)
helm repo add harbor http://192.168.10.19/chartrepo/chart_repo --username=admin --password=Harbor12345
# 3. 推送自定义 Chart 到 Harbor
helm push nginx harbor # 格式:helm push <Chart路径> <仓库名>
# 4. 验证推送结果(通过 Harbor Web 界面查看 chart_repo 项目中的 Chart)更多推荐
所有评论(0)