【云原生】kuberneter中Helm入门到实践
引言
helm是k8s的包管理工具,使用helm,可以使用更为简化和系统化的方式对k8s应用进行部署、升级。
helm是CNCF已毕业的项目,社区也是相当活跃的,在 https://artifacthub.io/ 上,能找到很多现成的helm chart,稍作修改就能用到生产环境中,非常方便。
本文会介绍helm的核心概念,并用一个例子帮助大家更直观的认识helm,大家可以跟着这个例子操作一遍,相信对理解helm会有非常大的作用。
(教程地址:cloud-native-tutorial)
什么是helm
初识helm
helm在希腊语中的意思是:舵;驾驶盘。据说是helm创始人mutt butcher翻遍了航海手册找出来的,目的是为了找一个和kubernetes主题相匹配的词语。
官网地址:https://helm.sh/
官方给出的解释是:Helm is the best way to find, share, and use software built for Kubernetes. 意思是helm是kubernetes中查找、分享、构建应用的最佳方式。
这种说法当然不算夸张,Helm其实是一个Kubernetes应用的包管理工具,用来管理chart(一种预先配置好的安装包资源),有点类似于Ubuntu 的APT和CentOS中的YUM。因此,helm的出现解决了k8s应用管理能力缺失的问题。
另外helm也是dev和ops的桥梁,运维人员在使用helm的时候,一方面不需要理解大量在chart中的各种k8s元素,只需要配置少量的环境变量即可安装;另一方面,helm也给初级运维人员提供了学习的机会,他们可以在chart中学习并理解各种k8s元素,从而能够更快的掌握k8s。
下面列举了helm的一些关键信息
- 2019 年11 月13 日,Helm 3 发布;
- 2020 年4 月30 日,从CNCF 中毕业;
- 目前github上接近有1.9w个Star;
- 最新版本:3.5.0;
- 主要作者:Mutt Butcher,目前在Microsoft,主要关注DevOps领域。

helm与apt对比
在我们接触一个新事物的时候,最好的学习方式就是和我们熟悉的事务来做类比,能够帮助我们快速的掌握其中的核心概念。
由于Mutt Butcher在设计helm的时候,大量参考了apt和homebrew的设计,这里我们用apt来做对比,帮助大家更好的理解helm。

从下表中可以看到,helm和apt之间概念的对比,相信熟悉apt的同学能够很快的对helm有一个初步的认识。

helm总览
对helm有了一个初步的印象之后,我们来对helm做一个总览,包括helm的的核心概念、运行流程、常用命令、chart做一个概要性的了解,这样的话,对我们后续深入helm的学习和实践起一个纲领的作业,避免只见树木、不见森林。
helm三大概念
- chart:chart就是helm package,包含了一个k8s app应用运行起来的所有要素,比如service, deployment, configmap, serviceaccount, rbac, 等,这些要素都是以template文件的形式存在,再结合values文件,最终渲染出能够被k8s执行的yaml文件;
- repository:仓库是charts的集合,方便进行分享和分发。下面是官网仓库和阿里云仓库的地址,大家可以进去看看,感受一下;
- https://artifacthub.io/
- https://developer.aliyun.com/hub
- release:release是helm chart在kubernetes的一个运行实例,你可以用不同的release name多次安装同一个chart,比如:当集群中需要多个redis实例,你可以使用不同的配置文件安装redis chart。
helm运行流程
下面这张图我建议大家多看几遍,可以说掌握了这张图,就掌握了helm的核心。
从下图可以看到,helm的核心运行流程分为以下几步:
- 从chart仓库中获取chart;
- 使用者配置自己的values文件,根据自己的运行环境对values进行修改;
- 默认values文件和使用者values文件会进行一个merge,形成最终的values文件;
- 使用最终的values文件,渲染chart的template,形成可以被kubernetes执行的yaml;
- 调用kube apply提交yaml到kubernetes
在这里,需要注意chart开发者和使用者的界限,正是由于在跨越这个界限的时候,从需要理解大量的配置到只需要理解少量的配置,使得ops的工作变得简便,这也是helm核心的设计哲学。看完整个文章,即使你什么都没记住,只记住了这张图,你也会有很大的收获了。

helm常用命令
在helm的时候,你可以使用第三方开发的chart,也可以自己开发chart,以下是两种情况下使用的常见命令。更为详细的命令,可以安装好helm之后,使用helm help来查看,或查看官方文档。
使用第三方开发的chart
部署前
- repo: add, list, remove, update, and index chart repositories
- search: search for a keyword in charts
部署后
- install: install a chart
- list: list releases
- status: display the status of the named release
- upgrade: upgrade a release
- rollback: roll back a release to a previous revision
- uninstall: uninstall a release
自己开发chart
- lint: examine a chart for possible issues
- package: package a chart directory into a chart archive
- push: push helm chart to chartmuseum
- chart push: push helm chart to OCI repository
chart
chart可以说是helm里面最重要的概念了,关于chart也有很多内容需要掌握,在这里做一个列举。
- chart开发:主要是指利用模板技术开发一个chart,会在后面做详细介绍;
- chart hooks:在chart的生命周期中,提供一些hooks,方便进行一些前置或后置操作
- 在chart安装前,创建应用需要的Secret
- 在chart安装前,备份数据库
- 在chart卸载后,做一些清理工作
- chart test:当你install了一个chart后,如何知道这个release是否运行正常呢?chart test提供了一种测试的方式,来验证你的应用是否正常运行,比如:
- 校验mysql应用能够正常连接并接受请求
- 校验services能够正常做load balance
- library chart:一种以library形式存在的chart,可以在application chart之间进行共享避免重复逻辑;类似于编程语言中的public library;
- chart校验:基于PKI、GnuPG等技术,对helm package进行签名,保证传输或发布过程中的安全性;
- OCI(Open Container Initiative,容器发型规范)支持:helm 3引入(EXPERIMENTAL),能够将chart推送到支持OCI的仓库中,比如harbor, nexus,等,比如,将chart保存到harbor中:
- 保存chart:helm chart save kubeedge/ some-harbor-repo/kubeedge-cloud-chart:1.0.0
- 登录repo:helm registry login https://some-harbor-repo
- 推送chart:helm chart push some-harbor-repo/kubeedge-cloud-chart:1.0.0
- 高级特性
- post rendering: 提供在helm install之前对manifests进行操作、配置的一种机制;一般结合kustomize使用。比如:
- 在install时插入sidecar,从而为deployment增加功能
- 不修改原chart的情况下,更改manifests的配置
- post rendering: 提供在helm install之前对manifests进行操作、配置的一种机制;一般结合kustomize使用。比如:
这可能不是非常好理解,这里举一个例子,假设我需要对一个第三方的chart做少量的修改,以满足我的部署要求,那么我可以fork一份这个chart,然后在上面做修改,但是这样我需要一些额外的维护工作,当这个chart升级之后,我还需要做merge的工作,十分不便。
因此post rendering提供了一种机制,你只需要使用post rendering+kustomize编写的一个脚本,就可以在install前,对原始chart的内容做一些定制化的修改,避免了额外的维护工作。如下图所示。(kustomize是一个开源的配置工具,可以方便的对现有的k8s app配置做一些定制化的修改,官网地址:https://kustomize.io/)

- go sdk:helm提供了golang sdk,方便在go语言中使用;
- storage backend:指定release信息的存储类型,默认是secret;可以指定configmap、secret和postgreSQL;下图显示helm的版本信息存放在secret中的情况。

- helm plugin:支持以插件的形式拓展helm的功能。
helm demo
下面我们一起用一个demo来对helm有一个更为直观的了解。在这个demo中,我们的目标是部署一个redis集群,包括以下几个步骤:
- 安装helm
- 使用helm install单节点redis
- 使用helm upgrade升级到master-slave
- 使用helm rollback,回滚到单节点模式
步骤1:安装helm(通过apt)
以下是通过apt安装helm的命令,其他的安装方式可参考官网:
curl https://baltocdn.com/helm/signing.asc | sudo apt-key add –
sudo apt-get install apt-transport-https --yes
echo "deb https://baltocdn.com/helm/stable/debian/ all main" | sudo tee /etc/apt/sources.list.d/helm-stable-debian.list
sudo apt-get update
sudo apt-get install helm=3.4.2-1
步骤2:添加仓库并找到redis chart
- 添加仓库:helm repo add stable https://charts.helm.sh/stable
- 查看已经添加的仓库:helm repo list
- 搜索仓库有哪些chart:helm search repo stable
- 更新仓库列表到本地:helm repo update
- 搜索redis:helm search repo redis
- 查看redis chart详情:helm show chart stable/redis
- 查看redis values(values:相当于chart的配置文件):helm show values stable/redis
步骤3:install/upgrade/rollback/uninstall
- 建立单master的配置文件,名为only-master.values
## Cluster settings
cluster: enabled: false## Redis pod Security Context
securityContext: enabled: false## Use password authentication
usePassword: true ## Redis password (both master and slave)
password: "admin"## Redis Master parameters
master: persistence: enabled: false
然后--dry-run一下,看看生成出来的yaml文件是否存在问题:
helm install redis-demo stable/redis -f ./only-master.values --dry-run
如果没有问题,则进行实际的安装
helm install redis-demo stable/redis -f ./only-master.values
安装成功之后,可以登录redis进行操作,做进一步的校验:
redis-cli -h `kubectl get svc redis-demo-master -o=jsonpath="{.spec.clusterIP}"` -a admin
set name zhangsan
get name
info replication
# 可以看到这时候没有slave连接
- 建立master-slave配置文件,名为master-slave.values
## Cluster settings
cluster: enabled: true slaveCount: 1securityContext: enabled: false## Use password authentication
usePassword: true
password: "admin"## Mount secrets as files instead of environment variables
usePasswordFile: false## Redis Master parameters
master: persistence: enabled: false## Redis Slave properties
slave: persistence: enabled: false
--dry-run一下,看看生成出来的yaml文件是否存在问题;由于在系统中已经有redis-demo的release,因此使用upgrade来进行升级:
helm upgrade redis-demo stable/redis -f ./master-slave.values --dry-run helm upgrade redis-demo stable/redis -f ./master-slave.values
检查slave是否安装成功,以及是否同步成功
redis-cli -h `kubectl get svc redis-demo-slave -o=jsonpath="{.spec.clusterIP}"` -a admin
get name
- 最后,回滚至单master模式
- 查看部署历史:helm history redis-demo
- 回滚到对应的单master版本:helm rollback redis-demo REVISION
- 再连接slave已经不成功了:
redis-cli -h `kubectl get svc redis-demo-slave -o=jsonpath="{.spec.clusterIP}"` -a admin
- 只有master能连接:
redis-cli -hkubectl get svc redis-demo-master -o=jsonpath="{.spec.clusterIP}"` -a admin
# 输入命令测试一下
get age
- 卸载redis-demo
helm uninstall redis-demo
chart详解
总体结构
下图是wordpress的helm chart目录结构,每个元素的解释如下:

- Chart.yaml: chart的信息,包括chart的版本信息、描述信息、依赖关系,等
- LICENSE: (可选)chart的LICENSE信息
- README.md: (可选)chart的说明文件
- values.yaml: chart的默认配置信息
- values.schema.json: (可选) values配置信息的元信息(字段类型、字段描述、字段之间的依赖等),格式json
- charts: 依赖的其他chart
- crds: Custom Resource Definitions
- templates: 部署模板,结合values.yaml会渲染出kubernetes yaml文件
- templates/NOTES.txt: (可选)安装说明
Chart.yaml
Chart.yaml相当于chart的说明书,说明了这个chart的功能、版本、依赖关系、关键字等信息。
下图是redis的Chart.yaml

- apiVersion: chart api version, 目前helm 3固定为v2
- name: chart名字
- description: chart描述
- type:
- application: 可部署的chart
- library: 不可部署,可在不同chart间共享公用逻辑
- version: chart的版本
- appVersion: chart内应用的版本,比如redis的版本
- kubeVersion: 兼容的k8s版本
- keywords: 关键词,在helm search中用到
- dependencies: 依赖的chart
- mantainers: chart的开发人员
- icon: chart图标,会在hub中展示
template
template存放chart中的主要内容,主要以模板的形式存在,template中可以使用变量、控制语句、函数等,功能非常丰富。

chart hub & chart repo
- chart hub:可以理解为chart仓库的汇总,官方地址:https://artifacthub.io/
- chart repo:chart仓库,存放具体的chart
- 示例:https://charts.bitnami.com/bitnami
- 开源的仓库:harbor (https://goharbor.io/)(利用helm OCI的支持)
- helm官方提供的仓库:chartmuseum - https://github.com/helm/chartmuseum
- chart repo UI:https://github.com/helm/monocular
helm CICD
可以使用helm来构建CICD pipeline,下面是一个CICD的示例:

可以看到,整个CICD分为3个步骤,当然这只是一个例子,开发者可以根据实际的需要对这个步骤进行调整:
- stage1:开发人员编码、自测通过后,提交feature分支,并触发pipeline构建,并分别产生具有相同tag的docker image和helm chart,并部署helm chart
- stage2:reviewer review代码,测试通过后merge到release分支,修改版本号,并产生new tag的docker image和helm chart,并部署到集群
- stage3:测试、产品、客户,在staging上验证通过后,直接把helm chart部署到生产环境
从helm v2 到 v3 都有哪些变化
从下图中看到,最大的变化就是移出了tiller,主要原因是k8s早已支持了RBAC,不再需要tiller这么一个“多余”的组件来做权限管理了,另外的几个修改如下图所示,要了解细节,请参考官方的文档。

相关文章:
【云原生】kuberneter中Helm入门到实践
引言 helm是k8s的包管理工具,使用helm,可以使用更为简化和系统化的方式对k8s应用进行部署、升级。 helm是CNCF已毕业的项目,社区也是相当活跃的,在 https://artifacthub.io/ 上,能找到很多现成的helm chartÿ…...
编译鸿蒙codelabs安装时报错
学习鸿蒙ArkTS时编译codelabs样例代码,发现编译完成报错。目前鸿蒙的资料比较少,且官方文档路径很深,遂记录下来,以资来者。 error: failed to start ability. Error while Launching activity修改module.json5中的exported为tru…...
设计模式
本文主要介绍设计模式的主要设计原则和常用设计模式。 一、UML画图 1.类图 2.时序图 二、设计模式原则 1.单一职责原则 就是一个方法、一个类只做一件事; 2.开闭原则 就是软件的设计应该对拓展开放,对修改关闭,这在java中体现最明显的就…...
用gdal库读取tif影像并填充边缘,并根据窗口大小滑动裁剪裁剪(包含gdal转PIL)
相关文章 PIL,OPENCV之间的转换关系_pil cvtcolor(image)_番茄就要炒鸡蛋的博客-CSDN博客 python GDAL和PIL图像转换_gdal.readasarray和pil_llc的足迹的博客-CSDN博客 一、原始数据 二、分别读取数据 1、gdal读取的array 2、pil读取的array 三、 gdal转pil image …...
sqlserver数据库导出到mysql
爱到分才显珍贵,很多人都不懂珍惜拥有,只到失去才看到,其实那最熟悉的才最珍贵的。 这里只介绍一种方式,有很多的方式。 1.使用Navicat 安装 下载 2.工具 数据传输 3.选择源和目标 然后开始 4.最好导入前备份一下库...
【抓包工具】whistle抓包工具分享
一、使用场景 抓包请求转发 二、基础篇 官网:http://wproxy.org/whistle/ github: https://github.com/avwo/whistle 简介: whistle(读音[ˈwɪsəl],拼音[wēisǒu])基于Node实现的跨平台web调试代理工具,类似的工具有Window…...
docker可视化工具Portainer
1:Portainer简介 Portainer是一个docker可视化管理工具,可以非常方便地管理docker镜像容器。官网地址:https://www.portainer.io/ 注:现在Portainer有BE(收费)和CE(免费)版本,安装的…...
售后服务管理系统哪家好?云部署的售后服务软件有什么优势?
如今,越来越多的企业开始利用数字化系统来监控他们建造、操作或维护的高科技设备的技术属性。然而,仍然有很多公司依赖于孤立的低技术解决方案,比如使用Excel电子表格和手动流程来管理工作。当然,对于一家公司来说,寻找…...
laravel-admin之 解决上传图片不显示 $form->image(‘image‘); 及 $grid->column(‘image‘);
参考 https://blog.csdn.net/u013164285/article/details/106017464 $grid->column(‘image’)->image(‘http://wuyan.cn’, 100, 100); // //设置服务器和宽高 图片上传的域名 上传的图片不显示 在 这里设置了图片的上传路径 在这里设置 域名 就可以回显图片...
运营商三要素 API:构建安全高效的身份验证系统
当今数字化的世界中,身份验证是各行各业中至关重要的一环。为了保护用户的隐私和数据安全,企业需要寻求一种既安全可靠又高效便捷的身份验证方式。运营商三要素 API 应运而生,为构建安全高效的身份验证系统提供了有力的解决方案。 运营商三要…...
使用 BERT 进行文本分类 (01/3)
摄影:Max Chen on Unsplash 一、说明 这是使用 BERT 语言模型的一系列文本分类演示的第一部分。以文本的分类作为例,演示它们的调用过程。 二、什么是伯特? BERT 代表 来自变压器的双向编码器表示。 首先,转换器是一种深度学习模…...
layui第三方组件cron的使用
1. 首先上代码 <!DOCTYPE html> <html><head><meta charset"utf-8" /><title>cron表达式生成</title><meta name"renderer" content"webkit" /><meta http-equiv"X-UA-Compatible" con…...
Linux 信号的基本概念
信号的基本概念 1. 信号的概念 信号是Linux系统响应某些条件产生的一些事件。接收到信号的进程会相应地采取一些行动。 2. 信号的生成 信号是由于某些错误条件而生成的,如内存段冲突、浮点处理器错误或非法指令等。信号的生成其实就是一种软件层次的中断&#x…...
神经网络基础-神经网络补充概念-31-参数与超参数
概念 参数(Parameters): 参数是模型内部学习的变量,它们通过训练过程自动调整以最小化损失函数。在神经网络中,参数通常是连接权重(weights)和偏置(biases),…...
C# Linq源码分析之Take (二)
概要 本文主要分析Linq中Take带Range参数的重载方法的源码。对于其中的一些关于Range或序列的新概念,不再赘述,请参看C# Linq源码分析之Take (一) 源码分析 基于Range参数的Take重载方法,主要分成两部分实现&#x…...
FPGA控制RGB灯WS2812B
文章目录 FPGA控制RGB灯WS2812B1、简介1.1水一水1.2程序完成目标1.3项目工程结构 2、代码3、仿真代码4、结果展示 FPGA控制RGB灯WS2812B 1、简介 1.1水一水 最近在学习WS2812B手册,是一个简单的协议编写,做的时间也算是比较久,相对做出了一…...
【Linux】【驱动】应用层和驱动层传输数据
【Linux】【驱动】应用层和驱动层传输数据 绪论1.如果我在应用层使用系统0 对设备节点进行打开,关闭,读写等操作会发生什么呢? 2 我们的应用层和内核层是不能直接进行数据传输的3 驱动部分的代码4 应用代码5 编译以及运行代码 绪论 Linux一切皆文件! 文…...
【第二阶段】kotlin函数引用
针对上篇传入函数参数我们也可以重新定义一个函数,然后在main中调用时传入函数对象 lambda属于函数类型的对象,需要把普通函数变成函数类型的对象(函数引用),使用“::” /*** You can edit, ru…...
sip网络号角喇叭 sip音柱 POE供电广播音箱 ip网络防水对讲终端 sip网络功放
SV-7042TP网络号角喇叭 一、描述 SV-7042TP是我司的一款SIP网络号角喇叭,具有10/100M以太网接口,内置有一个高品质扬声器,将网络音源通过自带的功放和喇叭输出播放,可达到功率30W。SV-7042TP作为SIP系统的播放终端,可…...
【网络】传输层——TCP(滑动窗口流量控制拥塞控制延迟应答捎带应答)
🐱作者:一只大喵咪1201 🐱专栏:《网络》 🔥格言:你只管努力,剩下的交给时间! 上篇文章对TCP可靠性机制讲解了一部分,这篇文章接着继续讲解。 🎨滑动窗口 在…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...
Java 二维码
Java 二维码 **技术:**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...
Linux部署私有文件管理系统MinIO
最近需要用到一个文件管理服务,但是又不想花钱,所以就想着自己搭建一个,刚好我们用的一个开源框架已经集成了MinIO,所以就选了这个 我这边对文件服务性能要求不是太高,单机版就可以 安装非常简单,几个命令就…...
客户案例 | 短视频点播企业海外视频加速与成本优化:MediaPackage+Cloudfront 技术重构实践
01技术背景与业务挑战 某短视频点播企业深耕国内用户市场,但其后台应用系统部署于东南亚印尼 IDC 机房。 随着业务规模扩大,传统架构已较难满足当前企业发展的需求,企业面临着三重挑战: ① 业务:国内用户访问海外服…...
rm视觉学习1-自瞄部分
首先先感谢中南大学的开源,提供了很全面的思路,减少了很多基础性的开发研究 我看的阅读的是中南大学FYT战队开源视觉代码 链接:https://github.com/CSU-FYT-Vision/FYT2024_vision.git 1.框架: 代码框架结构:readme有…...
CSS 工具对比:UnoCSS vs Tailwind CSS,谁是你的菜?
在现代前端开发中,Utility-First (功能优先) CSS 框架已经成为主流。其中,Tailwind CSS 无疑是市场的领导者和标杆。然而,一个名为 UnoCSS 的新星正以其惊人的性能和极致的灵活性迅速崛起。 这篇文章将深入探讨这两款工具的核心理念、技术差…...
EEG-fNIRS联合成像在跨频率耦合研究中的创新应用
摘要 神经影像技术对医学科学产生了深远的影响,推动了许多神经系统疾病研究的进展并改善了其诊断方法。在此背景下,基于神经血管耦合现象的多模态神经影像方法,通过融合各自优势来提供有关大脑皮层神经活动的互补信息。在这里,本研…...
Linux中INADDR_ANY详解
在Linux网络编程中,INADDR_ANY 是一个特殊的IPv4地址常量(定义在 <netinet/in.h> 头文件中),用于表示绑定到所有可用网络接口的地址。它是服务器程序中的常见用法,允许套接字监听所有本地IP地址上的连接请求。 关…...

