news 2026/5/10 20:11:52

Helm:K8s应用部署的终极利器

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Helm:K8s应用部署的终极利器

一、Helm概述

helm通过打包的方式,支持发布的版本管理和控制,很大程度上简化了Kubernetes应用的部署和管理。

Helm本质就是让k8s的应用管理(Deployment、Service等)可配置,能动态生成。通过动态生成K8S资源清单文(deployment.yaml、service.yaml)。然后kubectl自动调用K8S资源部署。

对于K8s来说,应用资源配置可以定义为K8s API对象,包括Deployment,Namespace,Service, PV(Persistent Volumes)和PVC(PersistentVolumeClaims)等等。通常一个应用的部署会涉及很多资源的共同协作,用户会定义这些API对象到一系列Yaml文件中,然后通过kubectl来逐一进行部署。

那么问题来了,假如我没接触过K8s, 只想部署个应用了解下,不会写Yaml一个个配这些资源对象怎么破?需要去结合K8s文档学习Yaml语法。过了几天我终于学会了,一个个配好了这些资源对象的Yaml文件,并逐一部署在这台机器上。后面想在这台机器上再重复部署几套,另外还有十台环境要配成和这台一样,怎么办?拷贝过去再一一部署出来?这配置管理也太麻烦了,不好用,直接劝退!

先别急!幸好已经有Helm,避免了我们去完成这些繁琐配置和维护过程。它能够把这些零零散散的应用资源文件放在一起进行统一配置,极大方便了开发人员对K8s集群应用的管理。

1.1、Helm 组件及相关术语

Helm是官方提供类似于YUM的包管理,是部署环境的流程封装,Helm有三个重要的概念:chart、release和Repository

  • Helm:Helm 是一个命令行下的客户端工具。主要用于 Kubernetes 应用程序 Chart 的创建、打包、发布以及创建和管理本地和远程的 Chart 仓库。

  • Tiller:Tiller 是 Helm 的服务端,部署在 Kubernetes 集群中。Tiller 用于接收 Helm 的请求,并根据 Chart 生成 Kubernetes 的部署文件( Helm 称为 Release ),然后提交给 Kubernetes 创建应用。Tiller 还提供了 Release 的升级、删除、回滚等一系列功能。

  • Chart:Helm 的软件包,采用 TAR 格式。类似于 APT 的 DEB 包或者 YUM 的 RPM 包,其包含了一组定义 Kubernetes 资源相关的 YAML 文件。Chart有特定的文件目录结构,如果开发者想自定义一个新的 Chart,只需要使用Helm create命令生成一个目录结构即可进行开发。

  • Repoistory:Helm 的软件仓库,Repository 本质上是一个 Web 服务器,该服务器保存了一系列的 Chart 软件包以供用户下载,并且提供了一个该 Repository 的 Chart 包的清单文件以供查询。Helm 可以同时管理多个不同的 Repository, 官方仓库的地址是https://hub.helm.sh。

  • Release:使用 helm install 命令在 Kubernetes 集群中部署的 Chart 称为 Release。

1.2、Helm工作原理

1、Chart Install 过程:

  • Helm从指定的目录或者tgz文件中解析出Chart结构信息

  • Helm将指定的Chart结构和Values信息通过gRPC传递给Tiller

  • Tiller根据Chart和Values生成一个Release

  • Tiller将Release发送给Kubernetes用于生成Release

2、Chart Update过程:

  • Helm从指定的目录或者tgz文件中解析出Chart结构信息

  • Helm将要更新的Release的名称和Chart结构,Values信息传递给Tiller

  • Tiller生成Release并更新指定名称的Release的History

  • Tiller将Release发送给Kubernetes用于更新Release

3、Chart Rollback过程:

  • Helm将要回滚的Release的名称传递给Tiller

  • Tiller根据Release的名称查找History

  • Tiller从History中获取上一个Release

  • Tiller将上一个Release发送给Kubernetes用于替换当前Release

二、Helm部署

现在越来越多的公司和团队开始使用Helm这个Kubernetes的包管理器,我们也会使用Helm安装Kubernetes的常用组件。Helm由客户端命令helm工具和服务端tiller组成。

helm的GitHub地址:https://github.com/helm/helm

2.1、安装方式

[root@k8s-master01 ~]# mkdir helm [root@k8s-master01 helm]# wget https://get.helm.sh/helm-v3.14.0-linux-amd64.tar.gz [root@k8s-master01 helm]# tar -zxvf helm-v3.14.0-linux-amd64.tar.gz [root@k8s-master01 helm]# cd linux-amd64/ [root@k8s-master01 linux-amd64]# cp helm /usr/local/bin/ [root@k8s-master01 linux-amd64]# echo "source <(helm completion bash)" >> ~/.bashrc [root@k8s-master01 linux-amd64]# source ~/.bashrc

2.2、chart库配置

做完上述设置后即可使用helm search搜索官方helm hub chart库

helm search hub nginx

添加第三方Chart库

helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts helm repo add bitnami https://charts.bitnami.com/bitnami

查看Chart库

helm repo list

从仓库中查找指定chart的名字

helm search repo nginx

2.3、Helm命令

命令字中文释义作用
completion完成生成特定Shell的自动补全脚本
create创建使用给定的名称创建新图表
dependency依赖管理图表的依赖关系
env环境Helm客户端环境信息
get获取下载已命名发布的扩展信息
help帮助关于任何命令的帮助
history历史获取发布历史记录
install安装安装图表
lint检查检查图表可能存在的问题
list列表列出发布
package打包将图表目录打包成图表存档
plugin插件安装、列出或卸载Helm插件
pull拉取从存储库下载图表,并可选在本地目录中解包
push推送将图表推送到远程存储库
registry注册表登录或注销注册表
repo仓库添加、列出、删除、更新和索引图表存储库
rollback回滚将发布回滚到先前版本
search搜索在图表中搜索关键字
show显示显示图表的信息
status状态显示指定发布的状态
template模板本地渲染模板
test测试运行发布的测试
uninstall卸载卸载发布
upgrade升级升级发布
verify验证验证给定路径的图表已签名并且有效
version版本打印客户端版本信息

三、Helm Chart 详解

3.1、chart目录结构

# 通过helm create命令创建一个新的chart包 [root@k8s-master01 helm]# helm create nginx Creating nginx [root@k8s-master01 nginx]# tree . ├── charts ├── Chart.yaml ├── templates │ ├── deployment.yaml │ ├── _helpers.tpl │ ├── hpa.yaml │ ├── ingress.yaml │ ├── NOTES.txt │ ├── serviceaccount.yaml │ ├── service.yaml │ └── tests │ └── test-connection.yaml └── values.yaml ​ 3 directories, 10 files ####目录结构解析#### nginx/ ├── charts #依赖其他包的charts文件 ├── Chart.yaml # 该chart的描述文件,包括ico地址,版本信息等 ├── templates # #存放k8s模板文件目录 │ ├── deployment.yaml # 创建k8s资源的yaml 模板 │ ├── _helpers.tpl # 下划线开头的文件,可以被其他模板引用 │ ├── hpa.yaml # 弹性扩缩容,配置服务资源CPU 内存 │ ├── ingress.yaml # ingress 配合service域名访问的配置 │ ├── NOTES.txt # 说明文件,helm install之后展示给用户看的内容 │ ├── serviceaccount.yaml # 服务账号配置 │ ├── service.yaml # kubernetes Serivce yaml 模板 │ └── tests # 测试模块 │ └── test-connection.yaml └── values.yaml # 给模板文件使用的变量

3.2、Chart.yaml

apiVersion: # chart API 版本信息, 通常是 "v1" (必须) name: # chart 的名称 (必须) version: # chart 包的版本 (必须) kubeVersion: # 指定 Kubernetes 版本 (可选) type: # chart类型 (可选) description: # 对项目的描述 (可选) keywords: - # 有关于项目的一些关键字 (可选) home: # 项目 HOME 页面的 URL 地址 (可选) sources: - # 项目源码的 URL 地址 (可选) dependencies: # chart 必要条件列表 (可选) - name: # chart名称 (nginx) version: # chart版本 ("1.2.3") repository: # (可选)仓库URL ("https://example.com/charts") 或别名 ("@repo-name") condition: # (可选) 解析为布尔值的yaml路径,用于启用/禁用chart (e.g. subchart1.enabled ) tags: # (可选) - # 用于一次启用/禁用 一组chart的tag import-values: # (可选) - # ImportValue 保存源值到导入父键的映射。每项可以是字符串或者一对子/父列表项 alias: # (可选) chart中使用的别名。当你要多次添加相同的chart时会很有用 maintainers: # (可选)维护者信息 - name: # 维护者的名称 email: # 维护者的邮件地址 url: # 维护者的个人主页 engine: gotpl # 模板引擎的名称(可选,默认为 gotpl) icon: # (可选)指定 chart 图标的 SVG 或 PNG 图像的 URL appVersion: # 应用程序包含的版本 deprecated: # (可选,使用布尔值)该 chart 是否被废弃 annotations: example: # 按名称输入的批注列表 (可选).
  • 从 v3.3.2,不再允许额外的字段。推荐的方法是在annotations中添加自定义元数据。

  • 每个 chart 都必须有个版本号(version)。版本必须遵循 语义化版本 2 标准。不像经典 Helm, Helm v2 以及后续版本会使用版本号作为发布标记。仓库中的包通过名称加版本号标识。

比如 nginx chart 的版本字段 version: 1.2.3 按照名称被设置为:

nginx-1.2.3.tgz

三、helm部署案例

部署Nginx应用

[root@k8s-master01 nginx-helm]# helm pull bitnami/nginx --version 15.3.5 [root@k8s-master01 nginx-helm]# ls nginx-15.3.5.tgz [root@k8s-master01 nginx-helm]# tar xf nginx-15.3.5.tgz [root@k8s-master01 nginx-helm]# ls nginx nginx-15.3.5.tgz [root@k8s-master01 nginx-helm]# cd nginx [root@k8s-master01 nginx]# vim values.yaml 532 service: 533 ## @param service.type Service type 534 ## 535 type: ClusterIP 536 ## @param service.ports.http Service HTTP port 537 ## @param service.ports.https Service HTTPS port 538 ## 539 ports: 540 http: 80 541 https: 443 ###安装chart### [root@k8s-master01 nginx]# helm install nginx-server . NAME: nginx-server LAST DEPLOYED: Sat Feb 3 15:57:33 2024 NAMESPACE: default STATUS: deployed REVISION: 1 TEST SUITE: None NOTES: CHART NAME: nginx CHART VERSION: 15.3.5 APP VERSION: 1.25.3 ** Please be patient while the chart is being deployed ** NGINX can be accessed through the following DNS name from within your cluster: nginx-server.default.svc.cluster.local (port 80) To access NGINX from outside the cluster, follow the steps below: 1. Get the NGINX URL by running these commands: export SERVICE_PORT=$(kubectl get --namespace default -o jsonpath="{.spec.ports[0].port}" services nginx-server) kubectl port-forward --namespace default svc/nginx-server ${SERVICE_PORT}:${SERVICE_PORT} & echo "http://127.0.0.1:${SERVICE_PORT}" ####查看pod和service### [root@k8s-master01 nginx]# kubectl get deployments.apps NAME READY UP-TO-DATE AVAILABLE AGE nginx-deploy 3/3 3 3 23h nginx-deploy1 3/3 3 3 22h nginx-deploy2 3/3 3 3 22h nginx-server 1/1 1 1 56s [root@k8s-master01 nginx]# kubectl get pod NAME READY STATUS RESTARTS AGE nginx-deploy-5f87d95c-7ph78 1/1 Running 1 (151m ago) 23h nginx-deploy-5f87d95c-dswvq 1/1 Running 1 (151m ago) 23h nginx-deploy-5f87d95c-vk9vg 1/1 Running 1 (151m ago) 23h nginx-deploy1-c8d58b5c7-7dfrd 1/1 Running 1 (151m ago) 22h nginx-deploy1-c8d58b5c7-d2hd7 1/1 Running 1 (151m ago) 22h nginx-deploy1-c8d58b5c7-pfvhn 1/1 Running 1 (151m ago) 22h nginx-deploy2-db98bd9d9-2jl74 1/1 Running 1 (151m ago) 22h nginx-deploy2-db98bd9d9-h67n6 1/1 Running 1 (151m ago) 22h nginx-deploy2-db98bd9d9-wfcmw 1/1 Running 1 (151m ago) 22h nginx-server-ff5765f8-4wbms 1/1 Running 0 2m5s pod-controller-qk5jl 1/1 Running 1 (151m ago) 19h pod-controller-scsxt 1/1 Running 1 (151m ago) 19h [root@k8s-master01 nginx]# kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.10.0.1 <none> 443/TCP 14d nginx-server ClusterIP 10.10.127.16 <none> 80/TCP 2m32s nginx-svc ClusterIP 10.10.83.76 <none> 80/TCP 23h nginx-svc1 LoadBalancer 10.10.168.131 192.168.115.167 80:31261/TCP 22h nginx-svc2 NodePort 10.10.14.245 <none> 80:31110/TCP 22h ####测试访问### [root@k8s-master01 nginx]# curl 10.10.127.16 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> html { color-scheme: light dark; } body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html>

四、升级与回滚

修改配置文件

[root@k8s-master01 nginx]# vim values.yaml 123 replicaCount: 3 124 ## @param revisionHistoryLimit The number of old history to retain to allow rollback 125 ##

升级

[root@k8s-master01 nginx]# helm upgrade nginx-server .

查看升级结果

[root@k8s-master01 nginx]# kubectl get pod [root@k8s-master01 nginx]# kubectl get pod NAME READY STATUS RESTARTS AGE nginx-deploy-5f87d95c-7ph78 1/1 Running 1 (166m ago) 23h nginx-deploy-5f87d95c-dswvq 1/1 Running 1 (166m ago) 23h nginx-deploy-5f87d95c-vk9vg 1/1 Running 1 (166m ago) 23h nginx-deploy1-c8d58b5c7-7dfrd 1/1 Running 1 (166m ago) 23h nginx-deploy1-c8d58b5c7-d2hd7 1/1 Running 1 (166m ago) 23h nginx-deploy1-c8d58b5c7-pfvhn 1/1 Running 1 (166m ago) 23h nginx-deploy2-db98bd9d9-2jl74 1/1 Running 1 (166m ago) 22h nginx-deploy2-db98bd9d9-h67n6 1/1 Running 1 (166m ago) 22h nginx-deploy2-db98bd9d9-wfcmw 1/1 Running 1 (166m ago) 22h nginx-server-ff5765f8-4p6sh 1/1 Running 0 31s nginx-server-ff5765f8-4wbms 1/1 Running 0 16m nginx-server-ff5765f8-lnkkg 1/1 Running 0 31s

查看记录

[root@k8s-master01 nginx]# helm history nginx-server REVISION UPDATED STATUS CHART APP VERSION DESCRIPTION 1 Sat Feb 3 15:57:33 2024 superseded nginx-15.3.5 1.25.3 Install complete 2 Sat Feb 3 16:13:44 2024 deployed nginx-15.3.5 1.25.3 Upgrade complete

回滚

[root@k8s-master01 nginx]# helm rollback nginx-server 1

验证回滚

[root@k8s-master01 nginx]# kubectl get pod NAME READY STATUS RESTARTS AGE nginx-deploy-5f87d95c-7ph78 1/1 Running 1 (170m ago) 23h nginx-deploy-5f87d95c-dswvq 1/1 Running 1 (170m ago) 23h nginx-deploy-5f87d95c-vk9vg 1/1 Running 1 (170m ago) 23h nginx-deploy1-c8d58b5c7-7dfrd 1/1 Running 1 (170m ago) 23h nginx-deploy1-c8d58b5c7-d2hd7 1/1 Running 1 (170m ago) 23h nginx-deploy1-c8d58b5c7-pfvhn 1/1 Running 1 (170m ago) 23h nginx-deploy2-db98bd9d9-2jl74 1/1 Running 1 (170m ago) 22h nginx-deploy2-db98bd9d9-h67n6 1/1 Running 1 (170m ago) 22h nginx-deploy2-db98bd9d9-wfcmw 1/1 Running 1 (170m ago) 22h nginx-server-ff5765f8-lnkkg 1/1 Running 0 4m44s

御载

[root@k8s-master01 nginx]# helm uninstall nginx-server
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/10 13:11:58

黑马点评前125节课遇到的问题及解决方案(在看网课过程中会有很多老师运行成功但我们失败并且老师还不没有讲到的情况,本文致力于解决这个问题,记录了本人在做这个项目的时候遇到的所有问题)

写在前面的话 在看网课过程中会有很多老师运行成功但我们失败并且老师还不没有讲到的情况&#xff0c;本文致力于解决这个问题&#xff0c;记录了本人在做这个项目的时候遇到的所有问题&#xff0c;希望可以帮助到大家。、 可以直接在根据目录或者导航栏找到自己的遇到问题的…

作者头像 李华
网站建设 2026/5/9 2:12:01

32、深入掌握 Bash 条件测试与流程控制

深入掌握 Bash 条件测试与流程控制 1. 使用 test 命令 在 Bash 脚本中,与 if 语句搭配最频繁使用的命令当属 test 。 test 命令可进行各类检查与比较,它有两种等价形式: - test expression - [ expression ] 其中, expression 是一个可被评估为真或假的表…

作者头像 李华
网站建设 2026/5/9 2:55:04

YashanDB数据库的核心优势与应用场景分析

YashanDB是一种新兴的数据库解决方案&#xff0c;具有多种核心优势和应用场景。以下是对其核心优势及应用场景的分析&#xff1a;核心优势1. 高性能- YashanDB采用高效的数据存储和检索机制&#xff0c;能够在处理大规模数据时保持优异的性能&#xff0c;适合对实时性要求较高的…

作者头像 李华
网站建设 2026/5/9 1:59:27

YashanDB数据库的缓存机制及性能提升策略探究

YashanDB数据库的缓存机制及性能提升策略是一个重要的话题&#xff0c;尤其是在面对现代应用对高性能和低延迟的需求时。以下是关于YashanDB的一些缓存机制及其性能提升策略的探讨。一、缓存机制1. 内存缓存&#xff1a;- YashanDB可能使用内存作为主要的数据缓存层&#xff0c…

作者头像 李华
网站建设 2026/5/10 13:28:36

20、Swerve详细设计解析

Swerve详细设计解析 1. 连接与I/O操作 在进行网络连接操作时,连接对象可能会持续一段时间,并且可能会有进一步向连接写入数据的尝试。因此,所有的I/O函数在执行之前都会检查套接字是否仍然打开,以及是否没有出现中止条件。 当向套接字发送数据时,存在部分写入的风险。为…

作者头像 李华
网站建设 2026/5/9 2:42:13

21、节点系统的详细设计与实现

节点系统的详细设计与实现 在节点系统的设计中,存在诸多关键的技术点和实现细节,下面将详细介绍节点系统的设计与实现,包括通用节点和目录节点处理程序等方面。 1. 节点创建的依赖处理 在节点创建过程中,为了避免模块之间的循环依赖问题,采用了将工厂的创建函数传递给目…

作者头像 李华