K8S(十三)—— Helm3从入门到实战:简化Kubernetes应用部署与管理

文章目录

  • 前言
  • 一、什么是Helm
    • [1.1 Helm的核心价值](#1.1 Helm的核心价值)
    • [1.2 Helm的三大核心概念](#1.2 Helm的三大核心概念)
  • 二、Helm3与Helm2的核心区别
  • 三、Helm部署实战
    • [3.1 安装Helm客户端(Linux环境)](#3.1 安装Helm客户端(Linux环境))
      • [3.1.1 下载并解压Helm二进制包](#3.1.1 下载并解压Helm二进制包)
      • [3.1.2 验证安装与命令补全](#3.1.2 验证安装与命令补全)
    • [3.2 使用Helm安装官方Chart](#3.2 使用Helm安装官方Chart)
      • [3.2.1 管理Helm仓库](#3.2.1 管理Helm仓库)
      • [3.2.2 搜索与查看Chart信息](#3.2.2 搜索与查看Chart信息)
      • [3.2.3 安装Chart到K8s集群](#3.2.3 安装Chart到K8s集群)
  • 四、Helm自定义模板开发
    • [4.1 理解Chart目录结构](#4.1 理解Chart目录结构)
    • [4.2 创建自定义Nginx Chart](#4.2 创建自定义Nginx Chart)
    • [4.3 修改Chart配置](#4.3 修改Chart配置)
      • [4.3.1 修改Chart元数据(Chart.yaml)](#4.3.1 修改Chart元数据(Chart.yaml))
      • [4.3.2 修改模板变量(values.yaml)](#4.3.2 修改模板变量(values.yaml))
    • [4.4 打包与部署自定义Chart](#4.4 打包与部署自定义Chart)
      • [4.4.1 验证与打包Chart](#4.4.1 验证与打包Chart)
      • [4.4.2 部署自定义Chart](#4.4.2 部署自定义Chart)
      • [4.4.3 部署ingress](#4.4.3 部署ingress)
      • [4.4.3 验证访问](#4.4.3 验证访问)
    • [4.5 修改为通过NodePort访问](#4.5 修改为通过NodePort访问)
    • [4.6 升级与回滚Release](#4.6 升级与回滚Release)
  • 总结

前言

在Kubernetes(K8s)生态中,手动部署应用时需依次创建Deployment、Service、Ingress等资源,步骤繁琐且易出错。随着微服务架构的普及,一个复杂应用可能包含数十个组件,传统部署方式不仅效率低下,还面临版本管理混乱、环境一致性难保障等问题。

Helm 作为K8s官方推荐的包管理器,相当于Linux系统中的YUMAPT,通过"打包"思想将K8s资源清单(YAML文件)封装为可复用的Chart,支持版本控制、一键部署、升级与回滚,极大简化了K8s应用的全生命周期管理。

本文将从Helm基础概念入手,逐步深入到部署实战、自定义模板开发,帮助读者快速掌握Helm3的核心用法。

一、什么是Helm

1.1 Helm的核心价值

Helm的本质是K8s应用配置的"动态生成器"与"流程封装器",核心价值体现在以下三点:

  1. 简化部署:无需手动编写或修改多个YAML文件,通过Chart一键部署完整应用(如MySQL、Nginx、Redis等);
  2. 版本管理:对K8s应用的部署实例(Release)进行版本跟踪,支持一键升级与回滚;
  3. 可复用性: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-1mysql-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版本为例):

bash 复制代码
# 下载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 验证安装与命令补全

bash 复制代码
# 验证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来源),并更新仓库索引:

bash 复制代码
# 添加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信息

bash 复制代码
# 查看 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名称(或自动生成),并可指定部署的命名空间:

bash 复制代码
# 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),查看其目录结构:

bash 复制代码
# 创建工作目录
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 :必备的软件包自描述文件,必须包含 nameversion(Chart 版本)字段
  • 模板文件 (一个或多个 Kubernetes 清单文件):
    • NOTES.txt :Chart 的使用说明,会在用户执行 helm install 时显示
    • deployment.yaml:定义 Deployment 资源的清单文件
    • service.yaml:为 Deployment 创建 Service 的清单文件
    • ingress.yaml:定义 Ingress 对象的清单文件
    • _helpers.tpl:全局模板助手文件,可在整个 Chart 中复用

4.2 创建自定义Nginx Chart

使用helm create命令快速生成一个基础Chart(以Nginx为例):

bash 复制代码
# 创建自定义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.yamlvalues.yaml及模板文件即可。

bash 复制代码
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 }}"
bash 复制代码
cat nginx/values.yaml | grep repository
  repository: nginx
#以上变量值是在 create chart 的时候就自动生成的默认值,你可以根据实际情况进行修改。

4.3 修改Chart配置

4.3.1 修改Chart元数据(Chart.yaml)

定义Chart的名称、版本、应用版本等基础信息:

yaml 复制代码
# 编辑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配置):

yaml 复制代码
# 编辑nginx/values.yaml
vim nginx/values.yaml

# 核心配置修改(关键部分已标注)
replicaCount: 1                 # 部署副本数
image:
  repository: nginx             # 镜像仓库
  pullPolicy: IfNotPresent      # 镜像拉取策略
  tag: "latest"                 # 镜像标签
imagePullSecrets: []
nameOverride: ""
fullnameOverride: ""

serviceAccount:
  create: true
  annotations: {}
  name: ""

podAnnotations: {}

podSecurityContext: {}
  # fsGroup: 2000

securityContext: {}
  # capabilities:
  #   drop:
  #   - ALL
  # readOnlyRootFilesystem: true
  # runAsNonRoot: true
  # runAsUser: 1000

service:
  type: ClusterIP               # Service类型
  port: 80                      # Service端口
ingress:
  enabled: true                 #开启 ingress
  className: ""
  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.local
  
resources:                      # 资源限制(避免占用过多集群资源)
  limits:
    cpu: 100m
    memory: 128Mi
  requests:
    cpu: 100m
    memory: 128Mi

autoscaling:
  enabled: false
  minReplicas: 1
  maxReplicas: 100
  targetCPUUtilizationPercentage: 80
  # targetMemoryUtilizationPercentage: 80

nodeSelector: {}
  
tolerations: []

affinity: {}

4.4 打包与部署自定义Chart

4.4.1 验证与打包Chart

bash 复制代码
# 1. 验证Chart配置(检查依赖、模板语法是否正确)
helm lint nginx

# 2. 打包Chart(生成TAR格式压缩包,如nginx-0.1.0.tgz)
helm package nginx

4.4.2 部署自定义Chart

部署前可通过--dry-run验证配置,避免实际部署出错:

bash 复制代码
# 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

bash 复制代码
# 查看部署状态
kubectl get pod,svc -n ingress-nginx
bash 复制代码
# 查看ingress的域名
kubectl get ingress
bash 复制代码
# 修改/etc/hosts文件进行映射
vim /etc/hosts
.....
192.168.10.15 ww.app.com

4.4.3 验证访问

通过域名:NodePort访问Nginx

bash 复制代码
curl http://www.app.com:32719
# 若返回Nginx默认页面,说明部署成功

4.5 修改为通过NodePort访问

1、编辑 nginx/values.yaml

bash 复制代码
vim nginx/values.yaml
service:
  type: NodePort
  port: 80
  nodePort: 30080

ingress:
  enabled: false

2、修改 templates/service.yaml

bash 复制代码
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: http
      protocol: TCP
      name: http
      nodePort: {{ .Values.service.nodePort }}              #指定 nodePort
  selector:
    {{- include "nginx.selectorLabels" . | nindent 4 }}

4.6 升级与回滚Release

若需修改应用配置,可通过helm upgrade实现,若升级失败可回滚到历史版本:

bash 复制代码
# 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
bash 复制代码
# 验证
kubectl get svc
curl http://192.168.10.15:30080


bash 复制代码
# 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部署、自定义模板开发等实战场景,核心要点总结如下:

  1. 核心优势:Helm3移除Tiller后更安全,通过Chart实现"一次封装,多环境复用",Release支持一键升级与回滚;
  2. 实战重点 :自定义Chart时,核心是修改values.yaml(变量配置)和模板文件(如service.yaml),无需重复编写YAML;

建议读者结合实际需求,尝试自定义Chart并部署到K8s集群,通过"实践-调试-优化"的循环,快速掌握Helm的核心用法。

相关推荐
007php00712 小时前
百度面试题解析:微服务架构、Dubbo、Redis及其一致性问题(一)
redis·百度·docker·微服务·容器·职场和发展·架构
東雪蓮☆12 小时前
K8s 平滑升级
linux·运维·云原生·kubernetes
我狸才不是赔钱货15 小时前
容器:软件世界的标准集装箱
linux·运维·c++·docker·容器
三坛海会大神55517 小时前
k8s(十)Helm详解
云原生·容器·kubernetes
安卓开发者17 小时前
Docker命令大全:从入门到精通
docker·容器·eureka
K_i13418 小时前
Kubernetes流量管理:从Ingress到GatewayAPI演进
云原生·容器·kubernetes
蓝色土耳其love19 小时前
centos 7.9 安装单机版k8s
linux·运维·服务器·kubernetes·centos
七度光阴;21 小时前
Docker入门手册
运维·docker·容器
007php0071 天前
百度面试题解析:Zookeeper、ArrayList、生产者消费者模型及多线程(二)
java·分布式·zookeeper·云原生·职场和发展·eureka·java-zookeeper