helm 一、命令的使用

大番茄 2020年02月22日 1,004次浏览

helm version: v3.1.0

helm: kubernetes 的包管理工具。
https://helm.sh/
https://helm.sh/docs/

为什么需要helm?

  1. kubernetes 定义一个正常运行的微服务需要多少了yaml文件。
    比如: deployment, service, ingress, configmap。 这4个还是很常用到的吧。 这是一个服务,那么几十个服务呢。
  2. 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 版本跟以前的版本发生了一些变化。

  1. 最主要的就是Tiller删除了。
    Tiler 是在kubernetes中运行的helm服务端。
    以前的版本helm只是一个客户端命令,通过发送请求给Tiller,由Tiller来完成操作。Tiller 需要有相关的kubernetes资源的权限。
    v3 版本移除了Tiler,由helm通过kuberconfig文件提供的权限直接操作kubernetes资源。
  2. Release名称可以在不同命名空间重用
  3. 支持将 Chart 推送至 Docker 镜像仓库中
  4. 使用JSONSchema验证chart values
  5. v2 在不存在的namespace中创建release是,会自动创建namespace。 v3 遵循kubernetes的行为。
  6. 不再需要requirements.yaml, 依赖关系是直接在chart.yaml中定义。
  7. 一些命令的变化:
helm delete  更名为  helm uninstall
helm inspect  更名为  helm show
helm fetch 更名为  helm pull

旧的命令依旧可用。

移除了用于本地临时搭建 Chart Repositoryhelm 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.

  1. Download your desired version
  2. Unpack it (tar -zxvf helm-v3.0.0-linux-amd64.tar.gz)
  3. 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。

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/