目录
3.迁移helm2部署的应用(确保helm2和helm3同时安装在同一台机器上)
3.‘helm upgrade’ 和 ‘helm rollback’:升级 release 和失败时恢复
3.helm get——查看release指定内容(与helm show作用、格式相同)
一.Helm介绍
1.Helm的本质
2.Helm的三大概念
Chart 代表着 Helm 包。它包含在 Kubernetes 集群内部运行应用程序,工具或服务所需的所有资源定义。你可以把它看作是 Homebrew formula,Apt dpkg,或 Yum RPM 在Kubernetes 中的等价物。
Repository(仓库) 是用来存放和共享 charts 的地方。它就像 Perl 的 CPAN 档案网络库或是 Fedora 的 软件包仓库,只不过它是供 Kubernetes 包所使用的。
Release 是运行在 Kubernetes 集群中的 chart 的实例。一个 chart 通常可以在同一个集群中安装多次。每一次安装都会创建一个新的 release。以 MySQL chart为例,如果你想在你的集群中运行两个数据库,你可以安装该chart两次。每一个数据库都会拥有它自己的 release 和 release name。
二.Helm的版本
1.Helm2
主要组件
Tiller: helm的服务端,部署在k8s里面的一个pod,通常在kube-system这个系统空间里。主要负责部署helm charts,管理release,跟k8s API通信。
Helm Client: 主要负责从共有或者私有helm charts仓库拉取chart包,修改变量值,然后直接扔给tiller。
存在的问题
Helm2的一个主要问题是需要在k8s集群里面运行一个服务端,而这就需要把tiller的端口暴露给外界,会产生安全隐患。
在helm 2中引入的tiller主要是当时k8s还没有RBAC机制,所以就引入了服务端tiller。的功能相应完善,加入了RBAC和CRD等,都使得tiller这个东西显得多余。
2.Helm3
主要组件
helm3只有一个客户端,没有服务端,所以安装起来很方便,把相应的程序下下来即可,不需要helm init安装了。
主要特性
- 移除了tiller
- 支持分布式helm hub, 有了它就可以在很多时候不需要手动添加非官方repo了,例如helm3 search hub <package name>
- 为chart输入值进行json schema验证。
- 可以给helm charts添加test了,通过helm test <release>就能针对部署的应用跑一些tests。
- 部署的时候release name必须指定了,helm2的时候不指定会自动生成一个。
- 删除的时候不需要--purge了,删了就是删了。
3.Helm2到Helm3的迁移
1.安装插件
helm3 plugin install https://github.com/helm/helm-2to3
2.迁移helm2的配置,例如仓库
helm3 2to3 move config
3.迁移helm2部署的应用(确保helm2和helm3同时安装在同一台机器上)
helm3 2to3 convert <release-name> --delete-v2-releases
三.Helm3的安装
1.二进制版本安装
下载 需要的版本
解压
tar -zxvf helm-v3.0.0-linux-amd64.tar.gz
在解压目中找到helm
程序,移动到需要的目录中
mv linux-amd64/helm /usr/local/bin/helm
2.使用脚本安装
Helm现有个官方的安装脚本可以自动拉取最新的Helm版本并在本地安装
curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
chmod 700 get_helm.sh
./get_helm.sh
如果想直接执行安装,运行
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
四.Helm的使用
1.查找 Charts
Helm 自带一个强大的搜索命令,可以用来从两种来源中进行搜索
helm search hub
从 Artifact Hub 中查找并列出 helm charts。 Artifact Hub中存放了大量不同的仓库。helm search repo
从你添加(使用helm repo add
)到本地 helm 客户端中的仓库中进行查找。该命令基于本地数据进行搜索,无需连接互联网。
helm search hub
命令会展示所有可用的 charts。
使用 helm search repo
命令,你可以从你所添加的仓库中查找chart的名字
找到想安装的 helm 包,可以通过使用 helm install
命令来安装它。
2.安装一个 helm 包
使用现有的chart包
使用 helm install
命令来安装一个新的 helm 包。最简单的使用方法只需要传入两个参数:命名的release名字和想安装的chart的名称
例:
helm install happy-panda bitnami/wordpress
在安装过程中,helm
客户端会打印一些有用的信息,其中包括:哪些资源已经被创建,release当前的状态,以及你是否还需要执行额外的配置步骤。
Helm按照以下顺序安装资源:
Namespace
NetworkPolicy
ResourceQuota
LimitRange
PodSecurityPolicy
PodDisruptionBudget
ServiceAccount
Secret
SecretList
ConfigMap
StorageClass
PersistentVolume
PersistentVolumeClaim
CustomResourceDefinition
ClusterRole
ClusterRoleList
ClusterRoleBinding
ClusterRoleBindingList
Role
RoleList
RoleBinding
RoleBindingList
Service
DaemonSet
Pod
ReplicationController
ReplicaSet
Deployment
HorizontalPodAutoscaler
StatefulSet
Job
CronJob
Ingress
APIService
Helm 客户端不会等到所有资源都运行才退出。许多 charts 需要大小超过 600M 的 Docker 镜像,可能需要很长时间才能安装到集群中。
可以使用 helm status
来追踪 release 的状态,或是重新读取配置信息
例:
helm status happy-panda
安装前自定义 chart
有时候需要自定义 chart 来指定我们想要的配置。
使用 helm show values
可以查看 chart 中的可配置选项
例:
helm show values bitnami/wordpress
然后,使用 YAML 格式的文件覆盖上述任意配置项,并在安装过程中使用该文件
echo '{mariadb.auth.database: user0db, mariadb.auth.username: user0}' > values.yaml
helm install -f values.yaml bitnami/wordpress --generate-name
安装过程中有两种方式传递配置数据:
--values
(或-f
):使用 YAML 文件覆盖配置。可以指定多次,优先使用最右边的文件。--set
:通过命令行的方式对指定项进行覆盖。
如果同时使用两种方式,则 --set
中的值会被合并到 --values
中,但是 --set
中的值优先级更高。在--set
中覆盖的内容会被被保存在 ConfigMap 中。可以通过 helm get values <release-name>
来查看指定 release 中 --set
设置的值。也可以通过运行 helm upgrade
并指定 --reset-values
字段来清除 --set
中设置的值。
更多安装方法
helm install
命令可以从多个来源进行安装:
- chart 的仓库(如上所述)
- 本地 chart 压缩包
helm install foo foo-0.1.1.tgz
- 解压后的 chart 目录
helm install foo path/to/foo
- 完整的 URL
helm install foo https://example.com/charts/foo-1.2.3.tgz
3.‘helm upgrade’ 和 ‘helm rollback’:升级 release 和失败时恢复
当升级到 chart 的新版本,或是修改 release 的配置,你可以使用 helm upgrade
命令
一次升级操作会使用已有的 release 并根据你提供的信息对其进行升级。由于 Kubernetes 的 chart 可能会很大而且很复杂,Helm 会尝试执行最小侵入式升级。即它只会更新自上次发布以来发生了更改的内容。
例:
helm upgrade -f panda.yaml happy-panda bitnami/wordpress
happy-panda 这个 release 使用相同的 chart 进行升级,但是使用了一个新的 YAML 文件
可以使用 helm get values
命令来看看配置值是否真的生效了
例:
helm get values happy-panda
如果在一次发布过程中,发生了不符合预期的事情,也很容易通过 helm rollback [RELEASE] [REVISION]
命令回滚到之前的发布版本
例:
helm rollback happy-panda 1
这条命令将我们的 happy-panda 回滚到了它最初的版本。
release 版本其实是一个增量修订(revision)。 每当发生了一次安装、升级或回滚操作,revision 的值就会加1。第一次 revision 的值永远是1。我们可以使用 helm history [RELEASE]
命令来查看一个特定 release 的修订版本号。
安装、升级、回滚时的有用选项
--timeout
:一个 Go duration 类型的值, 用来表示等待 Kubernetes 命令完成的超时时间,默认值为5m0s
。--wait
:表示必须要等到所有的 Pods 都处于 ready 状态,PVC 都被绑定,Deployments 都至少拥有最小 ready 状态 Pods 个数(Desired
减去maxUnavailable
),并且 Services 都具有 IP 地址(如果是LoadBalancer
, 则为 Ingress),才会标记该 release 为成功。最长等待时间由--timeout
值指定。如果达到超时时间,release 将被标记为FAILED
。注意:当 Deployment 的replicas
被设置为1,但其滚动升级策略中的maxUnavailable
没有被设置为0时,--wait
将返回就绪,因为已经满足了最小 ready Pod 数。--no-hooks
:不运行当前命令的钩子。--recreate-pods
(仅适用于upgrade
和rollback
):这个参数会导致重建所有的 Pod(deployment中的Pod 除外)。(在 Helm 3 中已被废弃)
4.‘helm uninstall’:卸载 release
使用 helm uninstall
命令从集群中卸载一个 release
例:
helm uninstall happy-panda
该命令将从集群中移除指定 release。你可以通过 helm list 命令看到当前部署的所有 release
在 Helm2 版本中,当一个 release 被删除,会保留一条删除记录。
而在 Helm 3 中,删除也会移除 release 的记录。 如果你想保留删除记录,使用 helm uninstall --keep-history
。使用 helm list --uninstalled
只会展示使用了 --keep-history
删除的 release
helm list --all
会展示 Helm 保留的所有 release 记录,包括失败或删除的条目(指定了 --keep-history)
5.‘helm repo’:使用仓库
Helm 3 不再附带一个默认的 chart 仓库。helm repo
提供了一组命令用于添加、列出和移除仓库。
使用 helm repo list
来查看配置的仓库
例:
helm repo list
NAME URL
stable https://charts.helm.sh/stable
mumoshu https://mumoshu.github.io/charts
使用 helm repo add
来添加新的仓库
helm repo add dev https://example.com/dev-charts
chart 仓库经常在变化,在任何时候你都可以通过执行 helm repo update
命令来确保你的 Helm 客户端是最新的
helm install test ./test
使用
helm repo remove
命令来移除仓库.
6.创建自己的 charts
chart 开发指南 介绍了如何开发自己的chart
也可以通过使用 helm create
命令来快速开始:
例:
helm create test
./test
目录下已经有一个 chart 了。可以编辑它并创建自己的模版。
在编辑 chart 时,可以通过 helm lint
验证格式是否正确
将 chart 打包分发时,可以运行 helm package
命令
helm package test
这个 chart 就可以很轻松的通过 helm install
命令安装
helm install test ./test
打包好的 chart 可以上传到 chart 仓库中
五.*Helm3的常用操作命令*
1.helm
查看helm基本操作命令
helm
查看helm的版本
helm version
查看helm环境变量
helm env
创建chart目录(含基本配置文件和目录)
helm create chartName
将chart目录打包
helm package chartDir
chartDir为chart目录
渲染template目录下的模板文件(即将这些模板文件的字段内容用values.yaml填充,然后直接输出到终端)
helm template chartName
根据关键字检索chart包
helm search repo keyword
helm search repo keyword
repo表示在本地所添加的仓库中进行检索;hub表示在Helm Hub中进行检索。
查看发布到k8s中的chart对应的release
helm list
上传chart到chart仓库
helm push chart.tgz repoName
有些仓库是有账号密码验证的,所以需要加上账号、密码的参数(比如Harbor提供的chart仓库功能
从chart仓库中拉取chart到本地
helm pull repoName/keyword
检查chart包中的文件内容是否正确(即该chart包去k8s中是否能够成功安装部署)
helm lint chartName
包可以是chart目录、chart压缩包
将chart包发布到k8s集群中安装部署
helm install releaseName chartName
releaseName为release的名字,chartName为chart包名,chart可以是未打包的chart,也可以是打包的chart,也可以是仓库中的chart。【chart和release的关系可以大致理解为程序和进程的关系,一个是静态的,一个是动态的】
helm install chartName --generate-name
可以不指定release的名字,只需要指定–generate-name即可随机生成一个名字
验证:创建完后可以使用helm list查看是否有对应的release
将部署到k8s中的release卸载掉
helm uninstall releaseName
卸载完后使用helm list查看relDemo是否被删除了,同时可以使用kubectl get pods查看相应的pod等与release相关的资源是否全部删除干净
将部署到k8s中的release升级,即相当于应用升级
helm upgrade releaseName chartName
relName指定一个release,该release对应一个k8s中的应用,chartName指定一个chart包,整个过程为直接使用指定的chart包替换部署release。就helm而言release还是原来那个,不过对应的chart包被替换了。对k8s而言,仅仅是将原先资源删除,然后用新的chart包创建资源。
验证:使用helm list查看release的CHART字段是否更新,同时可以使用kubectl get pods查看相应的pod等与release相关的资源是否全部更新(看名字、运行时间)
将release回退到前一个或若干个版本(k8s中会同步回退)
helm rollback releaseName revision
revision为第几个版本,1表示第一个版本,2表示第二个版本,以此类推。通常回滚会搭配helm history releaseName使用,通过该命令查看所有的关于本release的发布历史,然后选择回退到哪个版本
验证:回滚成功后使用helm list查看该release的CHART和APP VERSION是否更新(具体得看chart中的chart.yaml中的version和appVersion有没有相应的修改),同时可以使用kubectl get pods查看相应的pod等与release相关的资源是否全部更新(看名字、运行时间)
查看release的发布历史(包括安装、升级、回滚)
helm history releaseName
查看release的基本信息
helm status releaseName
2.helm show——查看chart包文件内容
查看chart包中的chart.yaml文件内容
helm show chart chartName
chart包可以是本地的未打包的chart目录(即helm create 创建出来的chart目录),也可以是打包的chart压缩包(由helm package打包),也可以是保存在仓库中的chart包
查看chart包中的values.yaml文件内容
helm show values chartName
查看chart包中README文件内容
helm show readme chartName
查看chart包中chart.yaml、values.yaml、README文件内容
helm show all chartName
3.helm get——查看release指定内容(与helm show作用、格式相同)
查看release的说明信息(相当于chart中的NOTES.TXT)
helm get notes releaseName
查看release在k8s中创建出来的资源
helm get manifest releaseName
查看release的回调创建资源
查看release的回调创建资源
查看release的values配置
helm get values releaseName
查看上述所有内容
helm get all releaseName
4.helm plugin——插件管理
查看本地安装好的插件
helm plugin list
安装插件
插件下载地址:下载插件
helm plugin install pluginURL
卸载插件
helm plugin uninstall pluginName
更新插件,将插件升级到最新版本
helm plugin update pluginName
在下载插件的时候会保存插件及其下载地址,更新的时候使用原本的下载地址直接下载最新版本替换
5.helm repo——仓库管理
查看添加的chart仓库,可在这些chart仓库中拉取chart(实际上就相当于一个应用的安装包)
helm repo list
本地添加chart仓库
helm repo add repoName repoURL
repoName是你自己起的一个名字,用来代表这个repoURL,后续操作仓库的命令中直接用repoName来代替repoURL,只要指定了repoName,就表示要去操作repoName指向的repoURL的仓库
本地删除chart仓库
helm repo remove repoName
将本地所添加的chart仓库的最新信息缓存到本地
helm repo update
helm search命令是检索某仓库中的chart包,假设仓库中一开始是没有所指定的chart包,所以helm search是检索不到的。这时候如果将chart包上传至该仓库,本地需要执行一遍helm repo update以更新本地的缓存数据才能检索到该指定的chart,因为helm search就是读取本地缓存数据的
根据指定仓库目录下的chart包生成index.yaml索引文件
helm repo index repoDir --url=repoURL
repoDir指定一个仓库的目录,该目录用来存放chart包及索引文件index.yaml。url指定仓库的访问路径,生成的索引文件中会以该url为地址前缀拼接上chart包名作为chart包的访问路径