K8S(十三)—— Helm3从入门到实战:简化Kubernetes应用部署与管理
文章目录
- 前言
- 一、什么是Helm
- 1.1 Helm的核心价值
- 1.2 Helm的三大核心概念
- 二、Helm3与Helm2的核心区别
- 三、Helm部署实战
- 3.1 安装Helm客户端(Linux环境)
- 3.1.1 下载并解压Helm二进制包
- 3.1.2 验证安装与命令补全
- 3.2 使用Helm安装官方Chart
- 3.2.1 管理Helm仓库
- 3.2.2 搜索与查看Chart信息
- 3.2.3 安装Chart到K8s集群
- 四、Helm自定义模板开发
- 4.1 理解Chart目录结构
- 4.2 创建自定义Nginx Chart
- 4.3 修改Chart配置
- 4.3.1 修改Chart元数据(Chart.yaml)
- 4.3.2 修改模板变量(values.yaml)
- 4.4 打包与部署自定义Chart
- 4.4.1 验证与打包Chart
- 4.4.2 部署自定义Chart
- 4.4.3 部署ingress
- 4.4.3 验证访问
- 4.5 修改为通过NodePort访问
- 4.6 升级与回滚Release
- 总结
前言
在Kubernetes(K8s)生态中,手动部署应用时需依次创建Deployment、Service、Ingress等资源,步骤繁琐且易出错。随着微服务架构的普及,一个复杂应用可能包含数十个组件,传统部署方式不仅效率低下,还面临版本管理混乱、环境一致性难保障等问题。
Helm作为K8s官方推荐的包管理器,相当于Linux系统中的YUM或APT,通过“打包”思想将K8s资源清单(YAML文件)封装为可复用的Chart,支持版本控制、一键部署、升级与回滚,极大简化了K8s应用的全生命周期管理。
本文将从Helm基础概念入手,逐步深入到部署实战、自定义模板开发,帮助读者快速掌握Helm3的核心用法。
一、什么是Helm
1.1 Helm的核心价值
Helm的本质是K8s应用配置的“动态生成器”与“流程封装器”,核心价值体现在以下三点:
- 简化部署:无需手动编写或修改多个YAML文件,通过Chart一键部署完整应用(如MySQL、Nginx、Redis等);
- 版本管理:对K8s应用的部署实例(Release)进行版本跟踪,支持一键升级与回滚;
- 可复用性:Chart可在不同环境、不同团队间共享,确保应用部署的一致性。
1.2 Helm的三大核心概念
Helm通过三个核心概念实现对K8s应用的管理,三者关系可理解为“软件包-仓库-实例”:
概念 | 定义与作用 |
---|---|
Chart | Helm的软件包(TAR格式),包含一组定义K8s资源的YAML模板(如Deployment.yaml、Service.yaml),相当于“安装包”; |
Repository | 存储Chart的Web服务器(如Bitnami、阿里云仓库),提供Chart的查询与下载,支持Helm同时管理多个仓库; |
Release | 基于Chart在K8s集群中部署的实例,一个Chart可部署多次生成多个Release(如部署两个MySQL实例对应两个Release); |
示例:若需在K8s集群中运行两个独立的MySQL数据库,只需两次安装mysql
Chart,每次安装会生成一个独立的Release(如mysql-1
和mysql-2
),各自拥有独立的资源与配置。
总结:Helm 安装 charts 到 Kubernetes 集群中,每次安装都会创建一个新的 release。你可以在 Helm 的 chart repositories 中寻找新的 chart。
二、Helm3与Helm2的核心区别
Helm3是目前的主流版本,相比Helm2进行了架构重构,核心差异集中在架构设计与权限管理,具体对比如下:
对比维度 | Helm2 | Helm3 |
---|---|---|
架构模式 | C/S架构(客户端helm + 服务端Tiller) | 纯客户端架构(移除Tiller) |
权限管理 | Tiller部署在kube-system命名空间,通常拥有集群全权限,存在安全风险 | 直接读取本地kubeconfig 文件,使用预定义的用户权限操作K8s资源,更安全 |
命名空间支持 | Tiller跨命名空间管理资源,权限边界模糊 | 操作默认绑定到指定命名空间,权限更精细 |
关键改进:Helm3移除Tiller后,不仅简化了架构,还解决了Helm2中Tiller的权限过大问题,符合K8s最小权限原则,同时减少了服务端组件的维护成本。
Helm 的官方网站:https://helm.sh/
三、Helm部署实战
3.1 安装Helm客户端(Linux环境)
Helm3仅需安装客户端即可,步骤如下:
3.1.1 下载并解压Helm二进制包
首先从Helm官方GitHub仓库下载对应版本的二进制包(此处以v3.6.0
Linux amd64版本为例):
# 下载Helm客户端二进制包(若链接失效,可访问https://github.com/helm/helm/tags获取最新版本)
wget https://github.com/helm/helm/releases/download/v3.6.0/helm-v3.6.0-linux-amd64.tar.gz# 解压压缩包
tar -zxvf helm-v3.6.0-linux-amd64.tar.gz# 将helm可执行文件移动到系统PATH目录(/usr/local/bin)
mv linux-amd64/helm /usr/local/bin/helm
3.1.2 验证安装与命令补全
# 验证Helm版本(显示客户端版本即安装成功)
helm version
# 示例输出:version.BuildInfo{Version:"v3.6.0", GitCommit:"...", GitTreeState:"clean", GoVersion:"go1.16.3"}# 启用bash命令补全(可选,提升操作效率)
echo "source <(helm completion bash)" >> /etc/profile
source /etc/profile
3.2 使用Helm安装官方Chart
3.2.1 管理Helm仓库
首先添加常用的Chart仓库(提供稳定的Chart来源),并更新仓库索引:
# 添加Bitnami仓库(常用开源应用Chart,如Redis、MySQL)
helm repo add bitnami https://charts.bitnami.com/bitnami# 添加Kubernetes官方早期的stable仓库
helm repo add stable http://mirror.azure.cn/kubernetes/charts# 添加阿里云仓库(国内访问速度快)
helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts# 添加Incubator仓库(孵化中的Chart,可选)
helm repo add incubator https://charts.helm.sh/incubator# 更新仓库索引(确保获取最新的Chart列表)
helm repo update# 查看已添加的仓库
helm repo list# (可选)删除不需要的仓库(如aliyun)
helm repo remove aliyun
3.2.2 搜索与查看Chart信息
# 查看 stable 仓库可用的 charts 列表
helm search repo stable# 搜索仓库中的Chart(如搜索nginx相关Chart)
helm search repo nginx# 查看指定Chart的基本信息(如stable/mysql)
helm show chart stable/mysql# 查看指定Chart的完整信息(含values配置、模板文件等)
helm show all stable/mysql
3.2.3 安装Chart到K8s集群
安装Chart时需指定Release名称(或自动生成),并可指定部署的命名空间:
# 1. 指定Release名称(my-redis),部署到default命名空间
helm install my-redis bitnami/redis -n default# 2. 不指定Release名称,自动生成(适合临时测试),需使用 –generate-name 随机生成一个名字
helm install bitnami/redis --generate-name# 3. 查看所有Release(默认显示当前命名空间,-A显示所有命名空间)
helm ls -A
helm list# 4. 查看指定Release的状态(如my-redis)
helm status my-redis# 5. 卸载指定Release(删除对应的K8s资源)
helm uninstall my-redis
四、Helm自定义模板开发
官方Chart可能无法满足个性化需求,此时可自定义Chart,实现对应用部署的精细化控制。
4.1 理解Chart目录结构
首先拉取一个官方Chart(如stable/mysql
),查看其目录结构:
# 创建工作目录
mkdir -p /opt/helm && cd /opt/helm# 拉取stable/mysql Chart(不安装,仅下载)
helm pull stable/mysql# 解压Chart压缩包
tar xf mysql-1.6.9.tgz# 查看目录结构(需先安装tree工具:yum install -y tree)
tree mysql
解压后的Chart目录结构如下,核心文件已标注作用:
mysql
├── Chart.yaml # Chart元数据(必填,含name、version等)
├── README.md # Chart使用说明
├── templates # K8s资源模板目录(核心)
│ ├── configurationFiles-configmap.yaml
│ ├── deployment.yaml # Deployment资源模板
│ ├── _helpers.tpl # 模板助手(可复用的Go模板函数)
│ ├── initializationFiles-configmap.yaml
│ ├── NOTES.txt # 安装后提示信息(如访问方式)
│ ├── pvc.yaml
│ ├── secrets.yaml # Service资源模板
│ ├── serviceaccount.yaml
│ ├── servicemonitor.yaml
│ ├── service.yaml # Service资源模板
│ ├── ingress.yaml # Ingress资源模板
│ └── tests # 测试模板(验证部署是否成功)
│ ├── test-configmap.yaml
│ └── test.yaml
└── values.yaml # 模板变量配置文件(修改此文件即可自定义部署)
可以看到,一个 chart 包就是一个文件夹的集合,文件夹名称就是 chart 包的名称。
chart 是包含至少两项内容的helm软件包:
- Chart.yaml:必备的软件包自描述文件,必须包含
name
和version
(Chart 版本)字段 - 模板文件(一个或多个 Kubernetes 清单文件):
- NOTES.txt:Chart 的使用说明,会在用户执行
helm install
时显示 - deployment.yaml:定义 Deployment 资源的清单文件
- service.yaml:为 Deployment 创建 Service 的清单文件
- ingress.yaml:定义 Ingress 对象的清单文件
- _helpers.tpl:全局模板助手文件,可在整个 Chart 中复用
- NOTES.txt:Chart 的使用说明,会在用户执行
4.2 创建自定义Nginx Chart
使用helm create
命令快速生成一个基础Chart(以Nginx为例):
# 创建自定义Nginx Chart
helm create nginx# 查看自定义Chart结构
tree nginx
# 示例输出
nginx
├── charts
├── Chart.yaml
├── templates
│ ├── deployment.yaml
│ ├── _helpers.tpl
│ ├── hpa.yaml
│ ├── ingress.yaml
│ ├── NOTES.txt
│ ├── serviceaccount.yaml
│ ├── service.yaml
│ └── tests
│ └── test-connection.yaml
└── values.yaml
生成的nginx
Chart结构与官方Chart一致,后续只需修改Chart.yaml
、values.yaml
及模板文件即可。
cat nginx/templates/deployment.yaml
# templates 目录下的 yaml 文件模板使用 go template 语法,其中的变量默认值定义在 nginx/values.yaml 文件中。因此只需修改 nginx/values.yaml 即可完成 templates 目录下 yaml 文件的配置。
例如 deployment.yaml 中定义的容器镜像:
image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
cat nginx/values.yaml | grep repositoryrepository: nginx
#以上变量值是在 create chart 的时候就自动生成的默认值,你可以根据实际情况进行修改。
4.3 修改Chart配置
4.3.1 修改Chart元数据(Chart.yaml)
定义Chart的名称、版本、应用版本等基础信息:
# 编辑nginx/Chart.yaml
vim nginx/Chart.yaml
apiVersion: v2
name: nginx # Chart名称(自定义)
description: A Helm chart for Kubernetes # Chart描述
type: application # Chart类型(application:应用类;library:库类)
version: 0.1.0 # Chart版本(语义化版本)
appVersion: 1.16.0 # 应用版本(如Nginx版本)
4.3.2 修改模板变量(values.yaml)
values.yaml
中的变量会注入到templates
目录的模板文件中,实现“一次配置,多处复用”。此处修改Nginx的部署参数(如副本数、Service类型、Ingress配置):
# 编辑nginx/values.yaml
vim nginx/values.yaml# 核心配置修改(关键部分已标注)
replicaCount: 1 # 部署副本数
image:repository: nginx # 镜像仓库pullPolicy: IfNotPresent # 镜像拉取策略tag: "latest" # 镜像标签
imagePullSecrets: []
nameOverride: ""
fullnameOverride: ""serviceAccount:create: trueannotations: {}name: ""podAnnotations: {}podSecurityContext: {}# fsGroup: 2000securityContext: {}# capabilities:# drop:# - ALL# readOnlyRootFilesystem: true# runAsNonRoot: true# runAsUser: 1000service:type: ClusterIP # Service类型port: 80 # Service端口
ingress:enabled: true #开启 ingressclassName: ""annotations: {}# kubernetes.io/ingress.class: nginx# kubernetes.io/tls-acme: "true"hosts:- host: www.app.com #指定ingress域名paths:- path: /pathType: Prefix #指定ingress路径类型tls: []# - secretName: chart-example-tls# hosts:# - chart-example.localresources: # 资源限制(避免占用过多集群资源)limits:cpu: 100mmemory: 128Mirequests:cpu: 100mmemory: 128Miautoscaling:enabled: falseminReplicas: 1maxReplicas: 100targetCPUUtilizationPercentage: 80# targetMemoryUtilizationPercentage: 80nodeSelector: {}tolerations: []affinity: {}
4.4 打包与部署自定义Chart
4.4.1 验证与打包Chart
# 1. 验证Chart配置(检查依赖、模板语法是否正确)
helm lint nginx# 2. 打包Chart(生成TAR格式压缩包,如nginx-0.1.0.tgz)
helm package nginx
4.4.2 部署自定义Chart
部署前可通过--dry-run
验证配置,避免实际部署出错:
# 1. dry-run验证(仅模拟部署,不创建资源)
helm install nginx ./nginx --dry-run --debug -n default# 2. 实际部署自定义Chart(Release名称为nginx,部署到default命名空间)
helm install nginx ./nginx -n default
或者
helm install nginx ./nginx-0.1.0.tgz# (可选)可根据不同的配置来 install,默认是 values.yaml
helm install nginx ./nginx -f ./nginx/values-prod.yaml# 3. 查看部署结果
helm ls -n default
kubectl get pod,svc -n default
4.4.3 部署ingress
参考 3.3 方式三:Deployment + Service(type=NodePort):https://blog.csdn.net/qq_41978931/article/details/153388695?spm=1011.2415.3001.5331
# 查看部署状态
kubectl get pod,svc -n ingress-nginx
# 查看ingress的域名
kubectl get ingress
# 修改/etc/hosts文件进行映射
vim /etc/hosts
.....
192.168.10.15 ww.app.com
4.4.3 验证访问
通过域名:NodePort
访问Nginx
curl http://www.app.com:32719
# 若返回Nginx默认页面,说明部署成功
4.5 修改为通过NodePort访问
1、编辑 nginx/values.yaml
vim nginx/values.yaml
service:type: NodePortport: 80nodePort: 30080ingress:enabled: false
2、修改 templates/service.yaml
vim nginx/templates/service.yaml
apiVersion: v1
kind: Service
metadata:name: {{ include "nginx.fullname" . }}labels:{{- include "nginx.labels" . | nindent 4 }}
spec:type: {{ .Values.service.type }}ports:- port: {{ .Values.service.port }}targetPort: httpprotocol: TCPname: httpnodePort: {{ .Values.service.nodePort }} #指定 nodePortselector:{{- include "nginx.selectorLabels" . | nindent 4 }}
4.6 升级与回滚Release
若需修改应用配置,可通过helm upgrade
实现,若升级失败可回滚到历史版本:
# 1. 升级Release,release版本+1
helm upgrade nginx ./nginx
# 示例输出
Release "nginx" has been upgraded. Happy Helming!
NAME: nginx
LAST DEPLOYED: Sat Oct 18 20:00:32 2025
NAMESPACE: default
STATUS: deployed
REVISION: 2
NOTES:
1. Get the application URL by running these commands:export NODE_PORT=$(kubectl get --namespace default -o jsonpath="{.spec.ports[0].nodePort}" services nginx)export NODE_IP=$(kubectl get nodes --namespace default -o jsonpath="{.items[0].status.addresses[0].address}")echo http://$NODE_IP:$NODE_PORT
# 验证
kubectl get svc
curl http://192.168.10.15:30080
# 2. 查看Release历史版本
helm history nginx -n default# 3. 回滚到指定版本(如回滚到版本1)
helm rollback nginx 1 -n default# 4. 再次查看历史,确认回滚成功
helm history nginx -n default
通常情况下,在配置好 templates 目录下的 kubernetes 清单文件后,后续维护一般只需要修改 Chart.yaml 和 values.yaml 即可。
在命令行使用
--set
指定参数来部署(install,upgrade)release
注意:该参数值会覆盖 values.yaml 中的配置。更多预定义变量参数请参考 Helm 官方文档:https://helm.sh/
例如:helm upgrade nginx nginx --set image.tag=‘1.20’
总结
Helm作为K8s生态的“包管理器”,通过Chart封装、Release版本管理、仓库共享三大核心能力,彻底解决了K8s应用部署繁琐、版本混乱的问题。本文从基础概念入手,逐步覆盖了Helm3部署、自定义模板开发等实战场景,核心要点总结如下:
- 核心优势:Helm3移除Tiller后更安全,通过Chart实现“一次封装,多环境复用”,Release支持一键升级与回滚;
- 实战重点:自定义Chart时,核心是修改
values.yaml
(变量配置)和模板文件(如service.yaml
),无需重复编写YAML;
建议读者结合实际需求,尝试自定义Chart并部署到K8s集群,通过“实践-调试-优化”的循环,快速掌握Helm的核心用法。