开始接触Kubernetes的技术人员都知道,如果要在Kubernetes集群中进行部署应用,需要去自己手动去写yaml文件来启动pod,每个应用可能会需要不止一两种的资源类型,如:service/deployment/pod/PV/PVC等等,使得在Kubernetes集群中部署应用很繁琐,要写很多的yaml文件,也成了新一代运维的掉发新方法
当正常使用Kubernetes手动部署一个应用,要去写多个yaml文件去定义资源,如何把这些文件去集中管理,把众多文件作为一个应用去管理,Helm就可以接近这些问题。
介绍
Helm是Kubernetes的包管理器,就像centos的yum,或者ubuntu的apt,这两种是Linux下的包管理工具,Helm和这两种工具类似,应用开发者可以管理应用包之间的依赖关系,发布应用;用户则可以以简单的方式查找、安装、升级、卸载等操作Kubernetes中的应用。
对于应用发布者,可以通过Helm将上面提到的问题,也就是将同一应用的多个yaml文件打包为一个应用,管理依赖关系、版本并发布应用到软件仓库。
对于接触Kubernetes不深的使用者,可以不用去过多的理解yaml的语言结构去手动编写文件,可以通过Helm下载相关应用的chart,并在Kubernetes上部署即可。
Helm还提供了Kubernetes上的软件部署、删除、升级、回滚应用的强大功能。
组件
Helm:Kubernetes的应用打包工具,简单理解就是命令行工具。
Tiller:Helm的服务端,部署在Kubernetes集群中,用于处理Helm的相关命令。3.0新版已不需要服务端
Chart:Helm的打包格式,内部包含了一组相关的Kubernetes资源, 把它想象成Kubernetes对应的Homebrew公式,Apt dpkg,或者是Yum RPM文件。
Repoistory:Helm的软件仓库,repository本质上是一个web服务器,该服务器保存了chart软件包以供下载,并有提供一个该repository的chart包的清单文件以供查询。在使用时,Helm可以对接多个不同的Repository。
Release:使用helm install命令在Kubernetes集群中安装的Chart成为Release。
需要特别注意的是, Helm中提到的Release和我们通常概念中的版本有所不同,这里的Release可以理解为Helm使用Chart包部署的一个应用实例。
其实Helm中的Release叫做Deployment更合适。估计因为Deployment这个概念已经被Kubernetes使用了,因此Helm才采用了Release这个术语。
安装Helm
安装Kubernetes单节点
kubernetes单节点与集群唯一不一样的就是不需要其他node加入集群,然后把master节点的污点去掉,因为默认master是不允许被调度启动pods的
# kubectl taint nodes --all node-role.kubernetes.io/master-
Helm-cli
Helm Client
是用户命令行工具,其主要负责如下:
- 本地 chart 开发
- 仓库管理
- 与 Tiller sever 交互(3.0已取消服务端)
- 发送预安装的 chart
- 查询 release 信息
- 要求升级或卸载已存在的 release
在安装Helm之前要保证有一个完整的Kubernetes集群在正常运行。
安装方式有很多,具体参考官网安装文档,这里只是tar的安装方法。
在该链接的Installation and Upgrading
部分的链接是下载tar.gz包的链接,我这里选则的版本是这个
# tar zxf helm-v3.4.2-linux-amd64.tar.gz
安装helm,其实主要就是要这个命令的脚本即可,所以解压缩之后,将helm命令脚本复制到系统中的命令可执行环境变量的目录中即可
大多数情况下,安装只需要简单地获取一个构建好的helm
二进制包
# mv linux-amd64/helm /usr/local/bin/helm
Helm-tiller(服务端)
3.0已取消该部分
Tiller Server
是一个部署在Kubernetes
集群内部的 server,其与 Helm client、Kubernetes API server 进行交互。Tiller server 主要负责如下:
- 监听来自 Helm client 的请求
- 通过 chart 及其配置构建一次发布
- 安装 chart 到
Kubernetes
集群,并跟踪随后的发布 - 通过与
Kubernetes
交互升级或卸载 chart - 简单的说,client 管理 charts,而 server 管理发布 release
本身服务端需要运行命令helm init
进行部署安装,但在3.x之后被移除,如果使用的helm版本为2.x,请参考Helm初始化文档
Helm的使用
仓库
helm的使用是需要使用仓库的,就像docker和kubernetes一样,需要从仓库中拉取作者创建好的模板文件为己用
仓库 是归集和分享chart的地方。只针对于Kubernetes包。
添加chart仓库,常见的选择是helm的官方仓库,如下:
格式:
添加:
helm repo add [NAME] [URL]
删除:
helm repo remove [NAME]
# helm repo add stable https://charts.helm.sh/stable
"stable" has been added to your repositories
阿里云:https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
微软:http://mirror.azure.cn/kubernetes/charts
helm search
Helm有强大的搜索命令。可以搜索两类不同资源:
helm search hub
搜索 Artifact Hub,该仓库列出了来自不同仓库的大量chart。
# helm search hub
URL CHART VERSION APP VERSION DESCRIPTION
https://hub.helm.sh/charts/gabibbo97/389ds 0.1.0 fedora-32 389 Directory Server
https://hub.helm.sh/charts/aad-pod... 3.0.0 1.7.1 Deploy components for aad-pod-identity
https://hub.helm.sh/charts/arhatdev/abbot 0.1.0 latest Network Manager Living at Edge
# ... and many more
helm search repo
搜索已经(用 helm repo add
)加入到本地helm客户端的仓库。该命名只搜索本地数据,不需要连接网络。
# helm search repo
NAME CHART VERSION APP VERSION DESCRIPTION
stable/acs-engine-autoscaler 2.2.2 2.1.1 DEPRECATED Scales worker nodes within agent pools
stable/aerospike 0.3.5 v4.5.0.5 DEPRECATED A Helm chart for Aerospike in Kubern...
stable/airflow 7.13.3 1.10.12 DEPRECATED - please use: https://github.com/air...
# ... and many more
指定本地仓库
# helm search repo [仓库名]
仓库模糊查找
Helm搜索使用字符串模糊匹配,因此输入部分名称也可以
# helm search repo sql
NAME CHART VERSION APP VERSION DESCRIPTION
stable/gcloud-sqlproxy 0.6.1 1.11 DEPRECATED Google Cloud SQL Proxy
stable/mssql-linux 0.11.4 14.0.3023.8 DEPRECATED - SQL Server 2017 Linux Helm Chart
stable/mysql 1.6.9 5.7.30 DEPRECATED - Fast, reliable, scalable, and easy...
# ... and many more
helm install
使用search搜到到可以用包之后,即可使用helm install
安装
最简单的方式有两个参数:查找到发布名称和chart名称。
现在找一个数据库来部署
[root@t10 ~]# helm search repo mysql
NAME CHART VERSION APP VERSION DESCRIPTION
...
stable/mariadb 7.3.14 10.3.22 DEPRECATED Fast, reliable, scalable, and easy t...
发布名称自定义,chart名称为search看到的名称stable/mariadb
格式:
helm install [发布名称] [chart名称]
# helm install happy-panda stable/mariadb
WARNING: This chart is deprecated
NAME: happy-panda
LAST DEPLOYED: Mon Dec 28 11:23:42 2020
NAMESPACE: default
STATUS: deployed
REVISION: 1
NOTES:
This Helm chart is deprecated
Given the `stable` deprecation timeline (https://github.com/helm/charts#deprecation-timeline), the Bitnami maintained Helm chart is now located at bitnami/charts (https://github.com/bitnami/charts/).
The Bitnami repository is already included in the Hubs and we will continue providing the same cadence of updates, support, etc that we've been keeping here these years. Installation instructions are very similar, just adding the _bitnami_ repo and using it during the installation (`bitnami/<chart>` instead of `stable/<chart>`)
```bash
$ helm repo add bitnami https://charts.bitnami.com/bitnami
$ helm install my-release bitnami/<chart> # Helm 3
$ helm install --name my-release bitnami/<chart> # Helm 2
```
To update an exisiting _stable_ deployment with a chart hosted in the bitnami repository you can execute
```bash
$ helm repo add bitnami https://charts.bitnami.com/bitnami
$ helm upgrade my-release bitnami/<chart>
```
Issues and PRs related to the chart itself will be redirected to `bitnami/charts` GitHub repository. In the same way, we'll be happy to answer questions related to this migration process in this issue (https://github.com/helm/charts/issues/20969) created as a common place for discussion.
Please be patient while the chart is being deployed
Tip:
Watch the deployment status using the command: kubectl get pods -w --namespace default -l release=happy-panda
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已经安装。上述发布的名称是:happy-panda
。 (如果想让Helm为你生成一个名称,去掉发布名称并加上--generate-name
)
如:helm install stable/mariadb --generate-name
安装方法
本地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
helm get
查看使用 --set
或者 -f xxx.yaml
传递的应用配置
helm get values [应用名]
helm list
查看发布后的chart
# helm list
NAME NAMESPACE REVISIO UPDATED STATUS CHART APP VERSION
happy-panda default 1 2020-12-28 13:10:44.016697442 -0500 EST deployed mariadb-7.3.14 10.3.22
helm status
使用helm status
,可以查看chart发布的状态或者配置信息
格式:
helm status [发布名称]
# helm status happy-panda
# 输出的内容和刚install结束的内容是一样的
helm show values
以上的安装使用了chart的所有默认配置,也可以对配置进行自定义,首先通过helm show values
命令查看chart的可配置项
格式:
helm show values [chart名称]
# helm show values stable/mariadb
## Global Docker image parameters
## Please, note that this will override the image parameters, including dependencies, configured to use the global value
## Current available global Docker image parameters: imageRegistry and imagePullSecrets
##
# global:
# imageRegistry: myRegistryName
# imagePullSecrets:
# - myRegistryKeySecretName
# storageClass: myStorageClass
## Use an alternate scheduler, e.g. "stork".
## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/
##
# schedulerName:
## Bitnami MariaDB image
## ref: https://hub.docker.com/r/bitnami/mariadb/tags/
##
image:
registry: docker.io
repository: bitnami/mariadb
tag: 10.3.22-debian-10-r27
...
通过yaml文件覆盖默认配置
# echo '{mariadbUser: user0, mariadbDatabase: user0db}' > config.yaml
# helm install -f config.yaml stable/mariadb --generate-name
mariadbUser和mariadbDatabase分别是mariadb数据库里面的用户和数据库,以上更改意思是创建了数据库新用户user0,和创建了新数据库user0db,且该用户拥有user0db数据库的访问权限。
通过命令行覆盖默认配置
# helm install --set name=value stable/mariadb --generate-name
name: value
# 多个值用','分割
# helm install --set a=b,c=d stable/mariadb --generate-name
a: b
c: d
# 负载表达式
# helm install --set outer.inner=value stable/mariadb --generate-name
outer:
inner: value
# 列表配置
# helm install --set name={a, b, c} stable/mariadb --generate-name
name:
- a
- b
- c
# 数组索引
# helm install --set servers[0].port=80 stable/mariadb --generate-name
servers:
- port: 80
# 数组索引+负载
# helm install --set servers[0].port=80,servers[0].host=example --generate-name
servers:
- port: 80
host: example
# 一个变量多个值
# helm install --set name=value1\,value2 --generate-name
name: "value1,value2"
--set
指定的值会被helm upgrade
运行时--reset-values
指定的值清空。
实例更改标签选择
# helm install --set nodeSelector."kubernetes\.io/role"=master --generate-name
nodeSelector:
kubernetes.io/role: master
helm upgrade
当chart新版本发布时,或者您想改变发布的配置,可以使用 helm upgrade
命令。
升级采用已有版本并根据您提供的信息进行升级。由于Kubernetes的chart会很大且很复杂,Helm会尝试执行最小增量升级。 这样只会升级自最新版发生改变的部分。
格式和install使用文件替换默认配置的方法类似
格式:helm upgrade -f [yaml文件名] [发布名称] [chart名称]
# vim config.yaml
mariadbUser: cyj
# helm upgrade -f config.yaml happy-panda stable/mariadb
...
查看发布的更新内容是否生效
# helm get values happy-panda
USER-SUPPLIED VALUES:
mariadbUser: cyj
helm rollback
如果发现更新出现了问题,可以使用helm rollback
进行回滚
通过helm hist [发布名称]
查看版本
# helm hist happy-panda
REVISION UPDATED STATUS CHART APP VERSION DESCRIPTION
1 Mon Dec 28 11:23:42 2020 superseded mariadb-7.3.14 10.3.22 Install complete
2 Mon Dec 28 11:59:13 2020 deployed mariadb-7.3.14 10.3.22 Upgrade complete
格式:
helm rollback [发布名称] REVISION
# helm rollback happy-panda 1
Rollback was a success! Happy Helming!
# helm hist happy-panda
REVISION UPDATED STATUS CHART APP VERSION DESCRIPTION
1 Mon Dec 28 11:23:42 2020 superseded mariadb-7.3.14 10.3.22 Install complete
2 Mon Dec 28 11:59:13 2020 superseded mariadb-7.3.14 10.3.22 Upgrade complete
3 Mon Dec 28 12:08:22 2020 deployed mariadb-7.3.14 10.3.22 Rollback to 1
helm uninstall
从集群中卸载发布,使用helm uninstall
格式:
helm uninstall [发布名称]
# helm uninstall happy-panda
release "happy-panda" uninstalled
还有很多命令在使用过程中会遇到的,加油少年~