Helm的三大概念
- Chart: chart代表一个helm的包,这个包里会包含一切在k8s 上运行某个应用、工具、服务所需要的资源定义。你可以认为这个chart就是home brew的formula,或者apt的dpkg,再或者是yum的rpm文件。
- Repository:资料库嘛,估计愿意看这篇文章的同学也熟,就是在远端存chart的地方。
- Release:release代表一个正运行在k8s 上的chart实例,一个chart可以在集群上安装多次,每安装一次,便会产生一个release。比如一个MySQL chart,你要是想在你集群上跑俩MySQL ,你就安两遍,产生两个release。
明白了以上这三个概念,咱现在就可以这么理解helm的用途:helm可以往k8s 集群安装chart,每次安装完就会产生一个新的release。你要是想找新的chart装,就去helm的chart repository里搜。
找chart:helm search
helm 的搜索指令很好用,可以用来搜两种不同类型的源:
helm search hub:会去helm hub上搜一些其他大佬们共享出来的chart。
helm search repo:会搜那些你已经通过 helm repo add添加到本地helm client的repository,这个搜索完全在搜本地数据,无需联外网。
来,让我们来试试 helm search hub:
$ helm search hub wordpress
URL CHART VERSION APP VERSION DESCRIPTION
https://hub.helm.sh/charts/bitnami/wordpress 7.6.7 5.2.4 Web publishing platform for building blogs and ...
https://hub.helm.sh/charts/presslabs/wordpress-... v0.6.3 v0.6.3 Presslabs WordPress Operator Helm Chart
https://hub.helm.sh/charts/presslabs/wordpress-... v0.7.1 v0.7.1 A Helm chart for deploying a WordPress site on ...这个搜索返回了所有在 Helm Hub上的带WordPress的chart,不带filter的话helm search hub 会给你所有可用的 charts.
使用 helm search repo, 你可以找到那些你已经添加到本地的chart,比如
$ helm repo add brigade https://brigadecore.github.io/charts
"brigade" has been added to your repositories
$ helm search repo brigade
NAME CHART VERSION APP VERSION DESCRIPTION
brigade/brigade 1.3.2 v1.2.1 Brigade provides event-driven scripting of Kube...
brigade/brigade-github-app 0.4.1 v0.2.1 The Brigade GitHub App, an advanced gateway for...
brigade/brigade-github-oauth 0.2.0 v0.20.0 The legacy OAuth GitHub Gateway for Brigade
brigade/brigade-k8s-gateway 0.1.0 A Helm chart for Kubernetes
brigade/brigade-project 1.0.0 v1.0.0 Create a Brigade project
brigade/kashti 0.4.0 v0.4.0 A Helm chart for KubernetesHelm search 使用了模糊匹配,所以打一半词儿也是可以搜的:
$ helm search repo kash
NAME CHART VERSION APP VERSION DESCRIPTION
brigade/kashti 0.4.0 v0.4.0 A Helm chart for Kubernetes搜索是发现包的方式,当你搜到想用的包,就用helm install来安装吧。
安装一个包: helm install
运行这个install时候,最少要传俩参数,你要定一个release name,以及你要装的chart是啥。
$ helm install happy-panda stable/mariadb
WARNING: This chart is deprecated
NAME: happy-panda
LAST DEPLOYED: Fri May 8 17:46:49 2020
NAMESPACE: default
STATUS: deployed
REVISION: 1
NOTES:
This Helm chart is deprecated
...
Services:
echo Master: happy-panda-mariadb.default.svc.cluster.local:3306
echo Slave: happy-panda-mariadb-slave.default.svc.cluster.local:3306
Administrator credentials:
Username: root
Password : $(kubectl get secret --namespace default happy-panda-mariadb -o jsonpath="{.data.mariadb-root-password}" | base64 --decode)
To connect to your database:
1. Run a pod that you can use as a client:
kubectl run happy-panda-mariadb-client --rm --tty -i --restart='Never' --image docker.io/bitnami/mariadb:10.3.22-debian-10-r27 --namespace default --command -- bash
2. To connect to master service (read/write):
mysql -h happy-panda-mariadb.default.svc.cluster.local -uroot -p my_database
3. To connect to slave service (read-only):
mysql -h happy-panda-mariadb-slave.default.svc.cluster.local -uroot -p my_database
To upgrade this helm chart:
1. Obtain the password as described on the 'Administrator credentials' section and set the 'rootUser.password' parameter as shown below:
ROOT_PASSWORD=$(kubectl get secret --namespace default happy-panda-mariadb -o jsonpath="{.data.mariadb-root-password}" | base64 --decode)
helm upgrade happy-panda stable/mariadb --set rootUser.password=$ROOT_PASSWORD现在,这个mariadb的chart被安好了,你应该看到了安装这个chart时也创建了一个新的release对象,release name是happy-panda。(如果你觉得自己是起名儿废,想让helm自动生成名字,那就别传名字参数了,加个 --generate-name 让helm自动生成名字。
安装时,helm client会打印一些有用的信息给你,比如创建了哪些资源,这个release目前状态是什么,是不是要有一些什么别的配置步骤。
helm不会等待所有资源都处于运行状态后才退出。很多chart可能都需要docker镜像,有些镜像体积很大,完全安装完可能要等很久。
使用helm status来查看release的状态,也可以看到配置信息。
$ helm status happy-panda
NAME: happy-panda
LAST DEPLOYED: Fri May 8 17:46:49 2020
NAMESPACE: default
STATUS: deployed
REVISION: 1
NOTES:
This Helm chart is deprecated
...
Services:
echo Master: happy-panda-mariadb.default.svc.cluster.local:3306
echo Slave: happy-panda-mariadb-slave.default.svc.cluster.local:3306
Administrator credentials:
Username: root
Password : $(kubectl get secret --namespace default happy-panda-mariadb -o jsonpath="{.data.mariadb-root-password}" | base64 --decode)
To connect to your database:
1. Run a pod that you can use as a client:
kubectl run happy-panda-mariadb-client --rm --tty -i --restart='Never' --image docker.io/bitnami/mariadb:10.3.22-debian-10-r27 --namespace default --command -- bash
2. To connect to master service (read/write):
mysql -h happy-panda-mariadb.default.svc.cluster.local -uroot -p my_database
3. To connect to slave service (read-only):
mysql -h happy-panda-mariadb-slave.default.svc.cluster.local -uroot -p my_database
To upgrade this helm chart:
1. Obtain the password as described on the 'Administrator credentials' section and set the 'rootUser.password' parameter as shown below:
ROOT_PASSWORD=$(kubectl get secret --namespace default happy-panda-mariadb -o jsonpath="{.data.mariadb-root-password}" | base64 --decode)
helm upgrade happy-panda stable/mariadb --set rootUser.password=$ROOT_PASSWORD在安装前做一些自定义操作
前面的安装都是走默认配置,有时候你可能会想做些自定义配置。
使用helm show values查看这个chart都支持哪些可配置项
$ helm show values stable/mariadb
Fetched stable/mariadb-0.3.0.tgz to /Users/mattbutcher/Code/Go/src/helm.sh/helm/mariadb-0.3.0.tgz
## Bitnami MariaDB image version
## ref: https://hub.docker.com/r/bitnami/mariadb/tags/
##
## Default: none
imageTag: 10.1.14-r3
## Specify a imagePullPolicy
## Default to 'Always' if imageTag is 'latest', else set to 'IfNotPresent'
## ref: https://kubernetes.io/docs/user-guide/images/#pre-pulling-images
##
# imagePullPolicy:
## Specify password for root user
## ref: https://github.com/bitnami/bitnami-docker-mariadb/blob/master/README.md#setting-the-root-password-on-first-run
##
# mariadbRootPassword:
## Create a database user
## ref: https://github.com/bitnami/bitnami-docker-mariadb/blob/master/README.md#creating-a-database-user-on-first-run
##
# mariadbUser:
# mariadbPassword:
## Create a database
## ref: https://github.com/bitnami/bitnami-docker-mariadb/blob/master/README.md#creating-a-database-on-first-run
##
# mariadbDatabase:
# ...以上这个方法会给Maria db创建一个叫user0 的用户,同时创建一个新db叫user0db ,并给user0赋予操作这个db的权限,除了这两个配置之外,其他配置依旧走默认值。
有两种方式在安装时传配置数据:
--values(or-f): 指定一个yaml文件,这个参数可以传递多个,写指令时,越靠右的拥有越高的优先级。--set: 直接覆盖配置。
如果都用的话,set的值会被合并到value里,并且拥有更高优先级。
使用set复写的配置会被持久化到config map中,同时可以使用helm get values <release-name>获取那些通过set设置进来的值,想清除通过set进来的值可以在运行helm upgrade 时带上 --reset-values
--set 的格式与限制
--set 选项可以不指定参数,也可以指定多个name/value 对, 最简单的写法一般是: --set name=value. YAML的等价写法:
多个值用 , 分割。 所以 --set a=b,c=d yaml这里就变成了:
也有一些更复杂的形式,比如 --set outer.inner=value 会被识别成:
列表可用 { 和 }包裹。 比如, --set name={a, b, c} 对应的是:
到了 Helm 2.5.0,可以使用数组索引的方式去访问列表元素。比如 --set servers[0].port=80 就代表:
多值可以这样设置。 --set servers[0].port=80,servers[0].host=example 代表:
servers:
- port: 80
host: example有时你可能需要在 --set 里使用一些特殊字符。你可以用 \去做转义,比如 --set name=value1\,value2 的意思是:
类似的,你也可以给点儿做转义,这样写的 --set nodeSelector."kubernetes\.io/role"=master 会被理解成:
nodeSelector:
kubernetes.io/role: master深层嵌套的结构如果用 --set写起来可能会很复杂,所以Chart的编写者在设计变量时也要考虑其他使用者在使用 --set 进行赋值时书写的复杂度。
其他的安装方法
helm install 可以从多种源进行安装:
- Chart 的 repository (如上所述)
- 本地的Chart archive (
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)