helm version: v3.1.0
helm: kubernetes 的包管理工具。
https://helm.sh/
https://helm.sh/docs/
为什么需要helm?
- kubernetes 定义一个正常运行的微服务需要多少了yaml文件。
比如: deployment, service, ingress, configmap。 这4个还是很常用到的吧。 这是一个服务,那么几十个服务呢。 - yaml文件发生修改,要不要算作是一个版本。如果只是修改镜像,服务版本升级还好说。 如果其他文件也发生变化, 当前的yaml状态算不算作一个版本。
helm 简单来说就是用来把多个yaml打包成一个文件,方便管理与存储。并且为了使包更加通用化,还支持使用变量、函数与语句控制(判断循环)。 在安装包的时候通过传递变量的值来修改yaml文件里的一些参数。
一、概念
- helm: 命令行工具。所有操作都是通过helm命令完成。
- Chart: 是一种封装格式。描述一组相关kubernetes资源的集合。
上面说的多个yaml文件的包就是Chart包,未打包之前就是一个目录,包含一些应用的描述文件以及相应的yaml文件。helm的学习主要就是Chart的制作。 - Release: 基于Chart的部署实例, Chart被helm运行以后会生成对应的实例,就叫做Release。 会在k8s里创建实际运行的资源对象。
Chart里有什么东西
刚接触的时候搞不懂chart具体的意思。 看一下chart包的内容就明白了。下面的mytest是创建的基本chart。
[root@k8s-master3 chart]# tree mytest
mytest
├── charts
├── Chart.yaml
├── templates
│ ├── deployment.yaml
│ ├── _helpers.tpl
│ ├── ingress.yaml
│ ├── NOTES.txt
│ ├── serviceaccount.yaml
│ ├── service.yaml
│ └── tests
│ └── test-connection.yaml
└── values.yaml
3 directories, 9 files
templates目录下面的东西。deployment.yaml, ingress.yaml, serviceaccount.yaml, service.yaml, 就是k8s里用来生成资源的yaml文件。
东西还是有点多,再精简一下:
[root@k8s-master3 chart]# tree
.
└── mytest
├── Chart.yaml
└── templates
└── deployment.yaml
2 directories, 2 files
这也是一个chart, 里面就一个deployment资源的部署文件。
Chart.yaml里面是chart的信息。
v3的变化
helm v3 版本跟以前的版本发生了一些变化。
- 最主要的就是
Tiller
删除了。
Tiler
是在kubernetes中运行的helm服务端。
以前的版本helm只是一个客户端命令,通过发送请求给Tiller
,由Tiller
来完成操作。Tiller
需要有相关的kubernetes资源的权限。
v3 版本移除了Tiler
,由helm通过kuberconfig文件提供的权限直接操作kubernetes资源。 Release
名称可以在不同命名空间重用- 支持将 Chart 推送至 Docker 镜像仓库中
- 使用JSONSchema验证chart values
- v2 在不存在的namespace中创建release是,会自动创建namespace。 v3 遵循kubernetes的行为。
- 不再需要
requirements.yaml
, 依赖关系是直接在chart.yaml
中定义。 - 一些命令的变化:
helm delete 更名为 helm uninstall
helm inspect 更名为 helm show
helm fetch 更名为 helm pull
旧的命令依旧可用。
移除了用于本地临时搭建 Chart Repository
的 helm serve
命令。
二、helm命令使用
连接k8s
跟kubectl一样,默认找~/.kube/config配置文件, 没有文件就连接127.0.0.1:8080端口。 也可以使用--kubeconfig参数指定文件位置。
注意: 文件里面的namespace配置也会影响helm的namespace。helm也有namespace, 跟K8S的没有关系, 一般好像也用不到。
注意: 使用最新的helm, k8s集群推荐也是最新的稳定版本
安装
https://helm.sh/docs/intro/install/
下载地址: https://github.com/helm/helm/releases
下载解压就能用,里面的helm命令直接可以用。一般把命令放到/usr/local/bin/下面。
From the Binary Releases
Every release of Helm provides binary releases for a variety of OSes. These binary versions can be manually downloaded and installed.
- Download your desired version
- Unpack it (
tar -zxvf helm-v3.0.0-linux-amd64.tar.gz
) - Find the
helm
binary in the unpacked directory, and move it to its desired destination (mv linux-amd64/helm /usr/local/bin/helm
)
使用
helm有多个子命令。
命令 | 描述 |
---|---|
create | 创建一个指定名称的chart |
dependency | 管理chart依赖 |
get | 下载一个release的信息。 |
history | 查看release的部署历史版本 |
install | 安装一个chart |
lint | 检查chart中可能出现的问题 |
list | 列出release |
package | 将chart目录打包成chart包 |
plugin | 安装,列出,删除 helm 插件 |
pull | 从远程仓库中下载chart |
repo | 添加,列出,移除,更新和索引chart仓库。 |
rollback | 回滚到之前的版本 |
search | 根据关键字搜索chart。 |
show | 查看chart信息。 |
status | 显示release的状态 |
template | 本地呈现模板 |
test | 对release运行测试 |
uninstall | 卸载一个release |
upgrade | 更新一个release |
version | 查看helm客户端版本 |
配置国内Chart仓库
使用之前需要先添加仓库,然后才能下载官方的一些chart。
-
微软仓库(http://mirror.azure.cn/kubernetes/charts/)这个仓库强烈推荐,基本上官网有的chart这里都有。
-
阿里云仓库(https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts )
-
官方仓库(https://hub.kubeapps.com/charts/incubator)官方chart仓库,国内有点不好使。
repo
Usage:
helm repo [command]
Available Commands:
add add a chart repository
index generate an index file given a directory containing packaged charts
list list chart repositories
remove remove a chart repository
update update information of available charts locally from chart repositories
添加仓库:helm repo add
Usage:
helm repo add [NAME] [URL] [flags]
[root@k8s-master3 ~]# helm repo add stable http://mirror.azure.cn/kubernetes/charts
"stable" has been added to your repositories
[root@k8s-master3 ~]# helm repo add ali https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
"ali" has been added to your repositories
从远程仓库更新本地可用chart信息:
[root@k8s-master3 ~]# helm repo update
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "ali" chart repository
...Successfully got an update from the "stable" chart repository
Update Complete. ⎈ Happy Helming!⎈
列出添加的仓库:
[root@k8s-master3 ~]# helm repo list
NAME URL
stable http://mirror.azure.cn/kubernetes/charts
ali https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
更新完成以后就可以从远程仓库安装需要的chart了。
部署应用
查找Chart。
search
Usage:
helm search [command]
Available Commands:
hub search for charts in the Helm Hub or an instance of Monocular
repo search repositories for a keyword in charts
使用repo
在添加的仓库中搜索chart。
比如搜索redis的chart。
[root@k8s-master3 ~]# helm search repo redis
NAME CHART VERSION APP VERSION DESCRIPTION
ali/redis 1.1.15 4.0.8 Open source, advanced key-value store. It is of...
ali/redis-ha 2.0.1 Highly available Redis cluster with multiple se...
stable/prometheus-redis-exporter 3.2.2 1.3.4 Prometheus exporter for Redis metrics
.....省略.....
还有一个hub
, 默认是在helm hub上搜索, 包含了很多仓库。
搜索出来的不是chart,而是包含这个chart的仓库,打开对应的网址会让你repo add添加仓库安装。
https://github.com/helm/hub
[root@k8s-master3 ~]# helm search hub apache
URL CHART VERSION APP VERSION DESCRIPTION
https://hub.helm.sh/charts/microsoft/spark 1.0.0 2.4.0 Fast and general-purpose cluster computing system.
https://hub.helm.sh/charts/couchdb/couchdb 3.1.0 2.3.1 A database featuring seamless multi-master sync...
https://hub.helm.sh/charts/bitnami/spark 1.2.7 2.4.5 Spark is a fast and general-purpose cluster com...
https://hub.helm.sh/charts/bitnami/airflow 4.4.2 1.10.9 Apache Airflow is a platform to programmaticall...
https://hub.helm.sh/charts/bitnami/apache 7.3.6 2.4.41 Chart for Apache HTTP Server
默认是在https://hub.helm.sh搜索,可以网页打开。
国内对应的是https://developer.aliyun.com/hub,可以网页打开,但是好像不能通过helm search hub搜索。
部署Chart
一般部署的时候需要传递配置数据。
有两种在安装过程中传递配置数据的方式:
--values
(或-f
):指定带有替代的YAML文件。可以多次指定,最右边的文件优先--set
:在命令行上指定。
而查看可配置参数需要通过helm show values
查看。
因为这里只是命令的简单实用,先不搞这么复杂了。
install
Usage:
helm install [NAME] [CHART] [flags]
[root@k8s-master3 ~]# helm install redis1 stable/redis
NAME: redis1
LAST DEPLOYED: Sun Feb 23 12:15:22 2020
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
.....省略......
查看Release
Chart部署以后的实例就称作Release。
list
[root@k8s-master3 ~]# helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
redis1 default 1 2020-02-23 12:15:22.553518196 +0800 CST deployed redis-10.5.3 5.0.7
查看k8s, 这个chart包含了多个资源,这里只查看一下statefulset:
[root@k8s-master3 ~]# kubectl get statefulsets
NAME READY AGE
redis1-master 0/1 8m17s
redis1-slave 0/2 8m17s
查看Release创建了什么资源
get
Usage:
helm get [command]
Available Commands:
all download all information for a named release
hooks download all hooks for a named release
manifest download the manifest for a named release
notes download the notes for a named release
values download the values file for a named release
manifest
: 显示生成的yaml文件。也就是创建了什么资源。
notes
: 显示需要打印的记录信息。
values
: 显示用户指定的values。
hooks
: 钩子这个还没有用过,不清楚具体作用。
这里只看一下manifest
,看一下应用的yaml文件。 notes
,values
在制作Chart的时候就明白了。
helm get manifest redis1
更新回滚以及删除Release
更新就是重新渲染Chart的yaml文件, 然后把yam更新到资源上。
Chart里是有很多变量的,可以通过--set 或 -f参数 指定或修改。比如修改镜像与tag。--set 直接定义变量, -f 指定一个values.yaml文件,把文件里的变量覆盖Chart 里 values.yaml文件里的变量。
制作Chart部分再细说。
更新Release
upgrade
Usage:
helm upgrade [RELEASE] [CHART] [flags]
现在的redis镜像与Tag。
[root@k8s-master3 ~]# kubectl get statefulsets/redis1-master -o yaml | grep image
image: docker.io/bitnami/redis:5.0.7-debian-10-r0
通过--set来修改Chart中的变量
[root@k8s-master3 ~]# helm upgrade redis1 stable/redis --set image.repository=redis --set image.tag=5.0.7
Release "redis1" has been upgraded. Happy Helming!
NAME: redis1
LAST DEPLOYED: Sun Feb 23 13:33:50 2020
NAMESPACE: default
STATUS: deployed
REVISION: 2
TEST SUITE: None
查看一下:
这里因为刚才多upgrade了一下, 所以REVISION变成3了。
[root@k8s-master3 ~]# helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
redis1 default 3 2020-02-23 13:42:05.755309167 +0800 CST deployed redis-10.5.3 5.0.7
查看版本历史
可以看到描述信息里都写着呢 一次安装,二次更新。
[root@k8s-master3 ~]# helm history redis1
REVISION UPDATED STATUS CHART APP VERSION DESCRIPTION
1 Sun Feb 23 12:41:24 2020 superseded redis-10.5.3 5.0.7 Install complete
2 Sun Feb 23 13:33:50 2020 superseded redis-10.5.3 5.0.7 Upgrade complete
3 Sun Feb 23 13:42:05 2020 deployed redis-10.5.3 5.0.7 Upgrade complete
k8s里的:
[root@k8s-master3 ~]# kubectl get statefulsets/redis1-master -o yaml | grep image
image: docker.io/redis:5.0.7
回滚
rollback
Usage:
helm rollback <RELEASE> [REVISION] [flags]
回滚,指定release以及history里的revision。
[root@k8s-master3 ~]# helm rollback redis1 1
Rollback was a success! Happy Helming!
[root@k8s-master3 ~]# helm history redis1
REVISION UPDATED STATUS CHART APP VERSION DESCRIPTION
1 Sun Feb 23 12:41:24 2020 superseded redis-10.5.3 5.0.7 Install complete
2 Sun Feb 23 13:33:50 2020 superseded redis-10.5.3 5.0.7 Upgrade complete
3 Sun Feb 23 13:42:05 2020 superseded redis-10.5.3 5.0.7 Upgrade complete
4 Sun Feb 23 14:01:03 2020 deployed redis-10.5.3 5.0.7 Rollback to 1
删除Release
uninstall
Usage:
helm uninstall RELEASE_NAME [...] [flags]
Aliases:
uninstall, del, delete, un
uninstall一下就删除,很简单。
[root@k8s-master3 ~]# helm uninstall redis1
release "redis1" uninstalled
其他命令简单介绍
创建Chart
create
创建Chart, 包含了一个基本的Chart。 里面的模板是nginx的。 这个Chart也可以直接启动。
[root@k8s-master3 chart]# helm create mytest
Creating mytest
[root@k8s-master3 chart]# ls
mytest
[root@k8s-master3 chart]# tree mytest/
mytest/
├── charts
├── Chart.yaml
├── templates
│ ├── deployment.yaml
│ ├── _helpers.tpl
│ ├── ingress.yaml
│ ├── NOTES.txt
│ ├── serviceaccount.yaml
│ ├── service.yaml
│ └── tests
│ └── test-connection.yaml
└── values.yaml
3 directories, 9 files
直接启动:
[root@k8s-master3 chart]# helm install web1 mytest
NAME: web1
LAST DEPLOYED: Sun Feb 23 14:26:45 2020
NAMESPACE: default
STATUS: deployed
REVISION: 1
[root@k8s-master3 chart]# kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
web1-mytest 1/1 1 1 21s
[root@k8s-master3 chart]#
检查Chart中可能的问题
lint
可以用来检查Chart中的一些常见问题。
[root@k8s-master3 chart]# helm lint mytest
==> Linting mytest
[INFO] Chart.yaml: icon is recommended
1 chart(s) linted, 0 chart(s) failed
但是在values.yaml中删除了一些需要的变量以后。
[root@k8s-master3 chart]# helm lint mytest
==> Linting mytest
[INFO] Chart.yaml: icon is recommended
[ERROR] templates/: template: mytest/templates/serviceaccount.yaml:1:14: executing "mytest/templates/serviceaccount.yaml" at <.Values.serviceAccount.create>: nil pointer evaluating interface {}.create
Error: 1 chart(s) linted, 1 chart(s) failed
打包
package
[root@k8s-master3 chart]# helm package mytest
Successfully packaged chart and saved it to: /root/chart/mytest-0.1.0.tgz
[root@k8s-master3 chart]# ls
mytest mytest-0.1.0.tgz
[root@k8s-master3 chart]#
剩下的
plugin
: 安装插件用。 helm自身没有的功能,以插件提供。
比如要把chart上传到harbor,需要安装对应插件。
[root@k8s-master3 chart]# helm plugin install https://github.com/chartmuseum/helm-push
pull
: 下载chart到本地。
root@k8s-master3 ~]# helm pull stable/redis
下载并解压
[root@k8s-master3 ~]# helm pull stable/redis --untar
show
: 查看chart信息:
Usage:
helm show [command]
Aliases:
show, inspect
Available Commands:
all shows all information of the chart
chart shows the chart's definition
readme shows the chart's README
values shows the chart's values
chart里一些信息。
chart : Chart.yaml文件的信息。
readme: README.md文件的信息。
values: values.yaml文件的信息。
template
: 对本地chart模板进行渲染并显示,就是渲染yaml文件。
[root@k8s-master3 chart]# helm template mytest
---
# Source: mytest/templates/serviceaccount.yaml
apiVersion: v1
kind: ServiceAccount
.......省略........
test
: 使用chart中的tests目录下的文件进行测试。
[root@k8s-master3 mytest]# helm test web1
Pod web1-mytest-test-connection pending
Pod web1-mytest-test-connection pending
Pod web1-mytest-test-connection running
......省略......
Chart下载到本地并解压以后,helm可以操作本地的chart目录。
如:
helm show values redis
helm show values /root/redis
helm show values ./redis
helm install redis1 redis
有兴趣可以看看官方的命令介绍。
https://helm.sh/docs/helm/helm/