Helm包管理
Helm包管理
目录
[toc]
本节实战
实战名称 |
---|
💘 实验:helm安装应用-2022.4.4(测试成功) |
💘 实验:helm定制charts包-2022.4.4(测试成功) |
💘 实验:helm升级和回滚-2022.4.4(测试成功) |
1、什么是Helm
Helm 可以帮助我们管理 Kubernetes 应用程序 - Helm Charts 可以定义、安装和升级复杂的 Kubernetes 应用程序,Charts 包很容易创建、版本管理、分享和分布。Helm 对于 Kubernetes 来说就相当于 yum 对于 Centos 来说,如果没有 yum 的话,我们在 Centos 下面要安装一些应用程序是极度麻烦的,同样的,对于越来越复杂的 Kubernetes 应用程序来说,如果单纯依靠我们去手动维护应用程序的 YAML 资源清单文件来说,成本也是巨大的。接下来我们就来了解了 Helm 的使用方法。
charts包,你就可以把它理解为一个安装包!(例如windows里面的exe应用程序。)
helm官网:
https:2、k8s集群:3台centos7.61810虚机,1个master节点,2个node节点k8sversion:v1.22.2containerd:3、helmv3.7.2
实验软件(无)
更新仓库
首先从仓库中将可用的 charts 信息同步到本地,可以确保我们获取到最新的 charts 列表:
[root@master1 ~]#helm repo updateHangtightwhilewegrabthelatestfromyourchartrepositories......Successfullygotanupdatefromthe"stable"chartrepositoryUpdateComplete.⎈HappyHelming!⎈
- 安装一个mysql应用
比如我们现在安装一个 mysql
应用:
[root@master1 ~]#helm install stable/mysql --generate-nameWARNING:ThischartisdeprecatedNAME:mysql-1649031212LASTDEPLOYED:MonApr408:13:372022NAMESPACE:defaultSTATUS:deployedREVISION:1NOTES:MySQLcanbeaccessedviaport3306onthefollowingDNSnamefromwithinyourcluster:mysql-1649031212.default.svc.cluster.localTogetyourrootpasswordrun:MYSQL_ROOT_PASSWORD=$(kubectlgetsecret--namespacedefaultmysql-1649031212-ojsonpath="{.data.mysql-root-password}"|base64--decode;echo)Toconnecttoyourdatabase:1.RunanUbuntupodthatyoucanuseasaclient:kubectlrun-i--ttyubuntu--image=ubuntu:16.04--restart=Never--bash-il2.Installthemysqlclient:$apt-getupdate&&apt-getinstallmysql-client-y3.Connectusingthemysqlcli,thenprovideyourpassword:$mysql-hmysql-1649031212-pToconnecttoyourdatabasedirectlyfromoutsidetheK8scluster:MYSQL_HOST=127.0.0.1MYSQL_PORT=3306# Execute the following command to route the connection:kubectlport-forwardsvc/mysql-16490312123306mysql-h${MYSQL_HOST} -P${MYSQL_PORT}-uroot-p${MYSQL_ROOT_PASSWORD}
我们可以看到 stable/mysql
这个 chart 已经安装成功了,我们将安装成功的这个应用叫做一个 release
,由于我们在安装的时候指定了--generate-name
参数,所以生成的 release 名称是随机生成的,名为 mysql-1649031212
。
- 查看release安装后对应的k8s资源状态
我们可以用下面的命令来查看 release 安装以后对应的 Kubernetes 资源的状态:
[root@master1 ~]#kubectl get all -l release=mysql-1649031212NAMEREADYSTATUSRESTARTSAGEpod/mysql-1649031212-9df8c986b-8tj8z1/1Running02m3sNAMETYPECLUSTER-IPEXTERNAL-IPPORT(S) AGEservice/mysql-1649031212ClusterIP10.105.125.254<none>3306/TCP2m4sNAMEREADYUP-TO-DATEAVAILABLEAGEdeployment.apps/mysql-16490312121/1112m4sNAMEDESIREDCURRENTREADYAGEreplicaset.apps/mysql-1649031212-9df8c986b1112m3s[root@master1 ~]#kubectl get pvcNAMESTATUSVOLUMECAPACITYACCESSMODESSTORAGECLASSAGEmysql-1649031212Boundpvc-83c54562-5984-47f2-b1ab-c49c1dd25d538GiRWOnfs-client2m32s
- 查看chart包的特性
我们也可以 helm show chart
命令来了解 MySQL 这个 chart 包的一些特性:
[root@master1 ~]#helm show chart stable/mysqlapiVersion:v1appVersion:5.7.30deprecated:truedescription:DEPRECATED-Fast,reliable,scalable,andeasytouseopen-sourcerelationaldatabasesystem.home:https:icon:https:keywords:-mysql-database-sqlname:mysqlsources:-https:-https:version:1.6.9
如果想要了解更多信息,可以用 helm show all
命令:
➜helmshowallstable/mysql#可以看一些定制特性!......
需要注意的是无论什么时候安装 chart,都会创建一个新的 release,所以一个 chart 包是可以多次安装到同一个集群中的,每个都可以独立管理和升级。
- 查看已经安装的release
同样我们也可以用 Helm 很容易查看到已经安装的 release:
[root@master1 ~]#helm lsNAMENAMESPACEREVISIONUPDATEDSTATUSCHARTAPPVERSIONmysql-1649031212default12022-04-0408:13:37.857671626+0800CSTdeployedmysql-1.6.95.7.30
- 删除release
如果需要删除这个 release,也很简单,只需要使用 helm uninstall
命令即可:
[root@master1 ~]#helm uninstall mysql-1649031212 -ndefaultrelease"mysql-1649031212"uninstalled[root@master1 ~]#kubectl get all -l release=mysql-1649031212Noresourcesfoundindefaultnamespace.[root@master1 ~]#helm status mysql-1649031212Error:release:notfound
uninstall
命令会从 Kubernetes 中删除 release,也会删除与 release 相关的所有 Kubernetes 资源以及 release 历史记录。
也可以在删除的时候使用 --keep-history
参数,则会保留 release 的历史记录,可以获取该 release 的状态就是 UNINSTALLED
,而不是找不到 release了:
➜helmuninstallmysql-1575619811--keep-historyrelease"mysql-1575619811"uninstalled➜helmstatusmysql-1575619811helmstatusmysql-1575619811NAME:mysql-1575619811LASTDEPLOYED:FriDec616:47:142019NAMESPACE:defaultSTATUS:uninstalled...➜helmls-aNAMENAMESPACEREVISIONUPDATEDSTATUSCHARTAPPVERSIONmysql-1575619811default12019-12-0616:47:14.415214+0800CSTuninstalledmysql-1.5.05.7.27
因为 Helm 会在删除 release 后跟踪你的 release,所以你可以审查历史甚至取消删除 release
(使用 helm rollback
命令)。
实验结束。😘
3、helm定制charts包
对于一般使用者来说,就是定制values,定制chart的话,就是要定制template了。
==💘 实验:helm定制charts包-2022.4.4(测试成功)==
- 实验环境
1、win10,vmwrokstation虚机;2、k8s集群:3台centos7.61810虚机,1个master节点,2个node节点k8sversion:v1.22.2containerd:3、helmv3.7.2
- 实验软件(无)
上面我们都是直接使用的 helm install
命令安装的 chart 包,这种情况下只会使用 chart 的默认配置选项,但是更多的时候,是各种各样的需求,所以我们希望根据自己的需求来定制 chart 包的配置参数。
一般情况,charts包会有相关文档来说明如何使用的,但有的没的话,就可以使用如下命令来查看!
1.查看一个 chart 包的所有可配置的参数选项
- 我们可以使用
helm show values
命令来查看一个 chart 包的所有可配置的参数选项:
[root@master1 ~]#helm show values stable/mysql## mysql image version## ref:https:##image:"mysql"imageTag:"5.7.30"strategy:type:Recreate#mysql的滚动更新升级策略可能会有一些问题!busybox:image:"busybox"tag:"1.32"testFramework:enabled:trueimage:"bats/bats"tag:"1.2.1"imagePullPolicy:IfNotPresentsecurityContext:{}## Specify password for root user#### Default:random 10 character string# mysqlRootPassword:testing## Create a database user### mysqlUser:## Default:random 10 character string# mysqlPassword:## Allow unauthenticated access,uncomment to enable### mysqlAllowEmptyPassword:true## Create a database### mysqlDatabase:## Specify an imagePullPolicy (Required)## It's recommended to change this to 'Always'if the image tag is 'latest'## ref:http:##imagePullPolicy:IfNotPresent……
2.定制yaml文件用来覆盖原来的数据
- 上面我们看到的所有参数都是可以用自己的数据来覆盖的,可以在安装的时候通过 YAML 格式的文件来传递这些参数:
# 01-config.yamlmysqlUser:user0mysqlPassword:user0pwdmysqlDatabase:user0dbpersistence:enabled:false
3.安装
[root@master1 ~]#helm install mysql stable/mysql -f 01-config.yamlWARNING:ThischartisdeprecatedNAME:mysqlLASTDEPLOYED:MonApr410:32:282022NAMESPACE:defaultSTATUS:deployedREVISION:1NOTES:MySQLcanbeaccessedviaport3306onthefollowingDNSnamefromwithinyourcluster:mysql.default.svc.cluster.local......
4.查看
- release 安装成功后,可以查看对应的 Pod 信息:
[root@master1 ~]#kubectl get all -l release=mysqlNAMEREADYSTATUSRESTARTSAGEpod/mysql-94d45966d-v75mj1/1Running019sNAMETYPECLUSTER-IPEXTERNAL-IPPORT(S) AGEservice/mysqlClusterIP10.107.72.252<none>3306/TCP19sNAMEREADYUP-TO-DATEAVAILABLEAGEdeployment.apps/mysql1/11119sNAMEDESIREDCURRENTREADYAGEreplicaset.apps/mysql-94d45966d11119s#这里可以看到,没有使用pvc了,因为我们前面将persistence设置为false了;[root@master1 ~]#kubectl get pvc[root@master1 ~]#➜kubectldescribepodmysql-ddd798f48-gnrzd......Environment:MYSQL_ROOT_PASSWORD:<settothekey'mysql-root-password'insecret'mysql'>Optional:falseMYSQL_PASSWORD:<settothekey'mysql-password'insecret'mysql'>Optional:falseMYSQL_USER:user0MYSQL_DATABASE:user0db......
可以看到环境变量 MYSQL_USER=user0,MYSQL_DATABASE=user0db
的值和我们上面配置的值是一致的。
两种传递配置数据的方法
注意:以下2种方法只是覆盖默认values.yaml文件的内容,有的覆盖,没的话,以values.yaml里面的内容为主!
🍀 在安装过程中,有两种方法可以传递配置数据:
--values(或者 -f)
:指定一个 YAML 文件来覆盖 values 值,可以指定多个值,最后边的文件优先-f,--values strings specify values in a YAML file or a URL (can specify multiple)
--set
:在命令行上指定覆盖的配置
如果同时使用这两个参数,--values(-f)
将被合并到具有更高优先级的 --set
;使用 --set
指定的值将持久化在 ConfigMap 中;
对于给定的 release,可以使用 helm get values <release-name>
来查看已经设置的值;已设置的值也通过允许 helm upgrade
并指定 --reset
值来清除。
🚩 --set选项
--setstringArraysetvaluesonthecommandline(can specifymultipleorseparatevalueswithcommas:key1=val1,key2=val2)
--set
选项接收零个或多个 name/value 对,最简单的用法就是--set name=value
,相当于 YAML 文件中的:
name:value
- 多个值之间用字符串“,”隔开,用法就是
--set a=b,c=d
,相当于 YAML 文件中的:
a:bc:d
- 也支持更加复杂的表达式,例如
--set outer.inner=value
,对应 YAML:
outer:inner:value
- 对于列表数组可以用
{}
来包裹,比如--set name={a,b,c}
,对应 YAML:
name:- a- b- c
- 从 Helm 2.5.0 开始,就可以使用数组索引语法来访问列表中某个项,比如
--set servers[0].port=80
,对应的 YAML 为:
servers:- port:80
- 也可以这样设置多个值,比如
--set servers[0].port=80,servers[0].host=example
,对应的 YAML 为:
servers- port:80host:example
- 有时候你可能需要在
--set
选项中使用特殊的字符,这个时候可以使用反斜杠来转义字符,比如--set name=value1\,value2
,对应的 YAML 为:
name:"value1,value2"
- 类似的,你还可以转义
.
,当 chart 模板中使用toYaml
函数来解析 annotations、labels 以及 node selectors 之类的时候,这非常有用,比如--set nodeSelector."kubernetes\.io/role"=master
,对应的 YAML 文件:
nodeSelector:kubernetes.io/role:master
深度嵌套的数据结构可能很难使用
--set
来表示,所以一般推荐还是使用 YAML 文件来进行覆盖,当然在设计 chart 模板的时候也可以结合考虑到--set
这种用法,尽可能的提供更好的支持。
使用helm最佳姿势
1、先把charts包下载下来
[root@master ~]#helm fetch stable/mysql[root@master ~]#ll -h mysql-1.6.9.tgz -rw-r--r--1rootroot12KMar2422:28mysql-1.6.9.tgz[root@master ~]#helm fetch --untar stable/mysql ##--untar表示直接解压[root@master ~]#ll -d mysqldrwxr-xr-x3rootroot96Mar2422:28mysql[root@master ~]#ls mysqlChart.yamlREADME.mdtemplatesvalues.yaml
2、使用helm template
命令直接渲染
$helmtemplatemysqlstable/mysql>mysql.yaml# helm template mysql ./mysql >mysql.yaml# helm template mysql ./mysql -f mysql/values.prod.yaml >mysql.yaml$catmysql.yaml
3、小测试
$vimmysql/values.prod.yaml$自定义values内容到mysql/values.prod.yaml里:$helmtemplatemysql./mysql-fmysql/values.prod.yaml>mysql.yaml
4、helm升级和回滚
==💘 实验:helm升级和回滚-2022.4.4(测试成功)==
- 实验环境
1、win10,vmwrokstation虚机;2、k8s集群:3台centos7.61810虚机,1个master节点,2个node节点k8sversion:v1.22.2containerd:3、helmv3.7.2
- 实验软件(无)
1.升级
当新版本的 chart 包发布的时候,或者当你要更改 release 的配置的时候,你可以使用 helm upgrade
命令来操作。升级需要一个现有的 release,并根据提供的信息对其进行升级。因为 Kubernetes charts 可能很大而且很复杂,Helm 会尝试以最小的侵入性进行升级,它只会更新自上一版本以来发生的变化:
- 首先,我们来将上面那个
01-config.yaml
文件修改下
[root@master1 ~]#vim 01-config.yaml mysqlUser:user0mysqlPassword:user0pwdmysqlDatabase:user0dbmysqlRootPassword:passw0rd#我们这里 `mysql` 这个 release 用相同的 chart 包进行升级,但是新增了一个配置项:persistence:enabled:false
- 查看下当前release环境
[root@master1 ~]#helm ls NAMENAMESPACEREVISIONUPDATEDSTATUSCHARTAPPVERSIONmysqldefault12022-04-0410:32:28.96570004+0800CSTdeployedmysql-1.6.95.7.30[root@master1 ~]#helm get values mysqlUSER-SUPPLIEDVALUES:mysqlDatabase:user0dbmysqlPassword:user0pwdmysqlUser:user0persistence:enabled:false
- 升级
[root@master1 ~]#helm upgrade mysql stable/mysql -f 01-config.yaml WARNING:ThischartisdeprecatedRelease"mysql"hasbeenupgraded.HappyHelming!NAME:mysqlLASTDEPLOYED:MonApr412:51:422022NAMESPACE:defaultSTATUS:deployedREVISION:2NOTES:MySQLcanbeaccessedviaport3306onthefollowingDNSnamefromwithinyourcluster:mysql.default.svc.cluster.local...
- 验证
我们可以使用 helm get values
来查看新设置是否生效:
[root@master1 ~]#helm get values mysql
helm get
命令是查看集群中 release 的非常有用的命令,正如我们在上面看到的,它显示了 01-config.yaml
中的新配置值被部署到了集群中,现在如果某个版本在发布期间没有按计划进行,那么可以使用 helm rollback [RELEASE] [REVISION]
命令很容易回滚到之前的版本:
[root@master1 ~]#helm history mysqlREVISIONUPDATEDSTATUSCHARTAPPVERSIONDESCRIPTION1MonApr410:32:282022supersededmysql-1.6.95.7.30Installcomplete2MonApr412:51:422022deployedmysql-1.6.95.7.30Upgradecomplete
2.回滚
[root@master1 ~]#helm rollback mysql 1Rollbackwasasuccess!HappyHelming!
- 验证
[root@master1 ~]#helm lsNAMENAMESPACEREVISIONUPDATEDSTATUSCHARTAPPVERSIONmysqldefault32022-04-0412:54:28.584028226+0800CSTdeployedmysql-1.6.95.7.30[root@master1 ~]#helm get values mysqlUSER-SUPPLIEDVALUES:mysqlDatabase:user0dbmysqlPassword:user0pwdmysqlUser:user0persistence:enabled:false[root@master1 ~]#helm history mysqlREVISIONUPDATEDSTATUSCHARTAPPVERSIONDESCRIPTION1MonApr410:32:282022supersededmysql-1.6.95.7.30Installcomplete2MonApr412:51:422022supersededmysql-1.6.95.7.30Upgradecomplete3MonApr412:54:282022deployedmysql-1.6.95.7.30Rollbackto1
可以看到 values 配置已经回滚到之前的版本了。上面的命令回滚到了 release 的第一个版本,每次进行安装、升级或回滚时,修订号都会加 1,第一个修订号始终为1,我们可以使用 helm history [RELEASE]
来查看某个版本的修订号。
注意:这里和k8s的滚动升级一样,版本号都是会增加的!
测试结束。😘
==其它选项==
除此之外我们还可以指定一些有用的选项来定制 install/upgrade/rollback 的一些行为,要查看完整的参数标志,我们可以运行 helm <command>--help
来查看,这里我们介绍几个有用的参数:
--timeout
:等待 Kubernetes 命令完成的时间,默认是 300(5分钟)--wait
:等待直到所有 Pods 都处于就绪状态、PVCs 已经绑定、Deployments 具有处于就绪状态的最小 Pods 数量(期望值减去 maxUnavailable)以及 Service 有一个 IP 地址,然后才标记 release 为成功状态。它将等待与--timeout
值一样长的时间,如果达到超时,则 release 将标记为失败。注意:在 Deployment 将副本设置为 1 并且作为滚动更新策略的一部分,maxUnavailable 未设置为0的情况下,--wait
将返回就绪状态,因为它已满足就绪状态下的最小 Pod 数量--no-hooks
:将会跳过命令的运行 hooks--recreate-pods
:仅适用于 upgrade 和 rollback,这个标志将导致重新创建所有的 Pods。(Helm3 中启用了)
关于我
我的博客主旨:
- 排版美观,语言精炼;
- 文档即手册,步骤明细,拒绝埋坑,提供源码;
- 本人实战文档都是亲测成功的,各位小伙伴在实际操作过程中如有什么疑问,可随时联系本人帮您解决问题,让我们一起进步!
🍀 微信二维码 x2675263825 (舍得), qq:2675263825。
🍀 微信公众号 《云原生架构师实战》
🍀 网站