当前位置: 首页 > news >正文

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系统中的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应用的管理,三者关系可理解为“软件包-仓库-实例”:

概念定义与作用
ChartHelm的软件包(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进行了架构重构,核心差异集中在架构设计权限管理,具体对比如下:

对比维度Helm2Helm3
架构模式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:必备的软件包自描述文件,必须包含 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为例):

# 创建自定义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及模板文件即可。

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

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

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

http://www.dtcms.com/a/499814.html

相关文章:

  • 如何录制视频,用 OBS
  • 网站地址做图标大型公司网站建设
  • 图片下载网站哪个好自己建设博客网站
  • 宝安哪有网站建设网站制作公司优势
  • 数据结构之——线性表的应用
  • Streamlit 交互与人python工智能网站开发基础
  • 湖北省建设厅官方网站文件福建省龙岩市新罗区建设局网站
  • 【点云】pointnet网络梳理
  • 我编译好的opencv库与ros2 humble库里面的opencv库的解决方案
  • 免费seo网站自动推广wordpress电子商务站
  • 不同程序建的网站风格网站名称 备案
  • 鸿蒙 emitter 和 eventHub 的区别
  • Java中Elasticsearch完全指南:从零基础到实战应用
  • 网站开发承包合同网站地图怎么弄
  • 【算法】day7 滑动窗口+二分查找
  • Kylin Linux Advanced Server V10 (Sword)上离线安装Ansible
  • 大学生做的广告短视频网站山东省建设教育集团网站首页
  • LeetCode 面试经典 150_栈_最小栈(54_155_C++_中等)(辅助栈)
  • 西安网站建设服务商十强文明网站建设
  • 互动网站如何做做网站和做程序一样吗
  • mockpuls可以做网站吗湖南招聘信息网官网
  • 【Qt】信号与槽(Signal and Slot)- 简易计算器
  • 2.5 网口
  • 肤契:全域协议版 IV 樱花町的晨光
  • dede 建设网站做个普通的网站多少钱
  • Nivo图表库全面指南:配置与用法详解
  • 典型营销型网站有哪些惠阳住房和城乡建设局网站
  • 算法题——贪心算法
  • 安装WordPress时没生成wp-config.php的解决方法
  • MovieNet(A holistic dataset for movie understanding) :面向电影理解的多模态综合数据集与工具链