之前在Centos 7_64位上实现了用kubespray-2.15.0完成kubenetes的部署,对于kubenetes,Helm无疑是一个良好的命令行下的客户端工具。Helm主要用于 Kubernetes 应用程序 Chart 的创建、打包、发布以及创建和管理本地和远程的 Chart 仓库。
需要对helm加深了解的,可以取官方文档看看:Helm官方doc
由于k8s版本不同,对应的helm也不同,这里整理了一下k8s-helm版本表:
k8s版本 | helm版本 |
---|---|
1.20.x ~ 1.23.x | 3.8.x |
1.19.x ~ 1.22.x | 3.7.x |
1.21.x - 1.18.x | 3.6.x |
1.20.x - 1.17.x | 3.5.x |
1.19.x - 1.16.x | 3.4.x |
1.18.x - 1.15.x | 3.3.x |
1.18.x - 1.15.x | 3.2.x |
1.17.x - 1.14.x | 3.1.x |
1.16.x - 1.13.x | 3.0.x |
1.16.x - 1.15.x | 2.16.x |
1.15.x - 1.14.x | 2.15.x |
1.14.x - 1.13.x | 2.14.x |
1.13.x - 1.12.x | 2.13.x |
1.12.x - 1.11.x | 2.12.x |
1.11.x - 1.10.x | 2.11.x |
1.10.x - 1.9.x | 2.10.x |
1.10.x - 1.9.x | 2.9.x |
1.9.x - 1.8.x | 2.8.x |
1.8.x - 1.7.x | 2.7.x |
1.7.x - 1.6.x | 2.6.x |
1.6.x - 1.5.x | 2.5.x |
1.6.x - 1.5.x | 2.4.x |
1.5.x - 1.4.x | 2.3.x |
1.5.x - 1.4.x | 2.2.x |
1.5.x - 1.4.x | 2.1.x |
1.4.x - 1.3.x | 2.0.x |
如果不知道自己装完的k8s是什么版本,可以在master上执行命令:
kubectl version
(一)Helm手动安装
我的版本是1.19.7,于是我安装了helm-3.7.x版本。为了避免网络问题,我选择了手动安装,也就是先把压缩包从github下载下来。
我用的helm-3.7.2直接打成百度网盘了,可以直接下载:
helm-v3.7.2-linux-amd64.tar.gz 提取码:suil
将压缩包放到/root目录下,然后解压:
[root@master ~]# tar xf helm-v3.7.2-linux-amd64.tar.gz
解压之后可以看到生成了一些新的文件,进入linux-amd64文件,把里面的helm文件复制到/usr/local/bin目录下:
[root@master ~]# cd linux-amd64/
[root@master linux-amd64]# cp helm /usr/local/bin/
可以看一下helm的版本:
[root@master linux-amd64]# helm version
注意,由于用的是helm v3版本,这个版本中已经不需要tiller这个客户端了,所以应该只展示client版本号,不会报错,如图:
然后可以看一下helm是否已经安装成功:
[root@node1 ~]# helm
已经知道helm最大的作用就是Chart的创建、打包、发布以及创建和管理本地和远程的 Chart 仓库,所以helm的增删改查就是下一个要点。
(二)Helm仓库管理
2.1 应用添加
对于helm来说,添加应用就相当于linux系统的yum源下载一个包一样的操作。
就像yum源只能下载源里有的包一样,helm也只能先明白有哪些库是可以下载的,这里有一个很实用的网站:
应用包汇总查询 Artifacthub
Artifacthub是一个可以搜索云原生包的网站,于2021年发布1.0.0版本。Artifact中提供的软件包都是开源的,可以直接安装运行,而且自带软件列表,可以选择性安装。如果需要一个软件来显示 Helm chart、operator,或 Artifact Hub 支持的其他许多东西之一,现在可以使用 Artifact Hub 的稳定版本来做。
举个例子,比如现在想给k8s-master上安装一个nginx应用,我们可以先在Artifacthub上搜索nginx:
点开可以看到每种nginx包的简介:
比如这个,简介里标注了用于kubenetes的,可以考虑用一用。
在下方还自带这个包的安装命令:
2.2 Helm基础命令
上图可以看到,ArtifactHub已经给出安装包的命令,那么这两句命令具体是做什么呢:
2.2.1 添加repo
对于查找到的包,我们要把它的repo添加到我们本地,具体命令是:
格式:helm repo add [自定义仓库名] [拉取网址]
举例:
[root@node1 ~]# helm repo add mirantis https://charts.mirantis.com
可以加完之后,查看一下仓库列表有没有加成功:
[root@node1 ~]# helm repo list
可以看到mirantis仓库已经在里面了。
2.2.2 删除repo
如果不想要某个仓库了,在helm3的命令如下(比如,我不想要之前的bitnami库了):
[root@node1 ~]# helm repo remove bitnami
再查看一下仓库列表,发现没有了:
(三)Chart操作
3.1 Chart的查找
我们已经准备好本地的仓库了(刚刚拉下来的mirantis),Chart就可以在这个本地库里面找安装包。这里以安装nginx的Chart为例。
先查看一下仓库里nginx相关的包:
[root@node1 ~]# helm search repo nginx
可以看到,当前我们可以安装的包是mirantis/nginx
3.2 Chart安装
安装可以查询找到的mirantis/nginx:
格式:helm install [自定义release名] [要安装的包的原名]
举例:
[root@node1 ~]# helm install k8s-release mirantis/nginx
我自己起名叫k8s-release
安装是异步的,也就是这里提示的只是成功的将chart发布到了k8s中,应用的部署还需要时间
安装好chart之后,可以看一下部署的状态:
[root@node1 ~]# helm status k8s-release
还可以看一下具体的Pod运行情况,这里要用到kubectl命令,所以要保证之前的k8s是装好的:
[root@node1 ~]# kubectl get pod | grep k8s-release
3.3 Chart卸载
helm3与helm2的一个区别,就是卸载命令不同。v2是delete,v3是uninstall。
可以先查看一下自己的helm里目前有多少chart release:
[root@node1 ~]# helm list
举例,我现在不想要helm-nginx那个release包了,于是卸载命令:
[root@node1 ~]# helm uninstall helm-nginx
再查看一下helm list,无了,就实现了应用的卸载
3.4 Chart信息查看
和yum中的rpm包一样,我们也可以查看chart中的描述信息。
[root@node1 ~]# helm inspect
这个命令引出一个菜单,提示说想看所有信息输入all等等,这里举例,查看一下values。
PS:这里注意,查看信息要用原来chart的名字,不要用自定义的,因为自定义的还没完全实现部署
[root@node1 ~]# helm inspect values mirantis/nginx
3.5 Chart部署到本地
3.5.1 Chart导出为本地压缩包
chart就是部署应用时需要的配置,那么可以和rpm一样将这些配置都拉取到本地,然后本地部署安装
[root@node1 ~]# helm pull mirantis/nginx
拉取完nginx后,可以看一下根目录里有没有nginx的压缩包:
[root@node1 ~]# ls -l
可以看到nginx-0.1.0.tgz,说明拉取下来了。
然后对本地nginx压缩包进行解压:
[root@node1 ~]# tar -zxf nginx-0.1.0.tgz
查看一下是否解压成功:
[root@node1 ~]# ls -ltr
看到有nginx文件夹,ok
3.5.2 查看Chart目录情况
Chart本质上就是一个文件夹目录,可以tree看一下结构:
[root@node1 ~]# tree -L 1 nginx
3.5.3 开启nginx应用(不是所用版本的nginx都需要这一步的,svc一开始没有给访问端口的可以尝试一下,有端口号的直接访问吧)
已经部署好的nginx应该可以应用了,首先我们先查看nginx这个service是不是存在:
[root@node1 templates]# kubectl get svc
可以看到,有k8s-release-nginx这个应用在,但是其现在没有提供访问端口,只给了一个80的Port提示。
我们可以执行下一句命令对目前这个nginx应用的配置进行一些修改:
[root@node1 templates]# kubectl edit svc k8s-release-nginx
命令执行会弹出下面这个yaml,将里面的type修改为NodePort:
修改好了会提示“edited"
再查看一下service,发现已经有访问端口了:
在firefox或者edge里输入:【你master机器的ip】:[给出的服务端口号]
举例:我是 192.168.214.100:31444
提示”Welcom to nginx",说明可以访问运行了
PS:这里挖个坑,Chart的其他配置方法很多,后续再讲,先把最简单的模式上手了
3.6 自己建立Chart
之前的Chart操作,是我们下载远程Artifact Hub上,nginx打包好的Chart,属于从远程helm仓库中获取第三方chart。
但是在k8s中,一般是通过yaml文件把要创建的service、pod等定义好,很可能会产生多个yaml文件,将这些文件放在一个目录中,就变成一个自定义的chart。
所以如果我们要把自己的东西打包成Chart,准备上传/分享呢?
3.6.1 helm创建空白chart
在helm工具下,chart的创建只需要1条命令:
格式:helm create [自定义chart名]
[root@node1 ~]# helm create hellochart
然后,我们就要在自己创建的hellochart目录下工作。打开hellochart看一下:
这里面比较关键的是templates目录,很多配置文件都在里面。接下来会介绍两种自创chart的方法,确实都跑通了,但是原理并不太一样,可以选择看着顺眼的试一试。
3.6.2 Chart模板法
这种方法需要我们舍弃所有create产生的默认配置,手写自己的Chart模板,所以第一步是删光templates里的文件:
[root@node1 hellochart]# rm -rf templates/*.*
PS:注意避坑,执行完上面那个命令后进去看一眼是不是彻底删完了
确认删除干净之后,在templates里写一个configmap.yaml文件:
[root@node1 templates]# cat > configmap.yaml << EOF
> apiVersion: v1
> kind: ConfigMap
> metadata:
> name: mychart-configmap
> data:
> myvalue: "Hello World"
> EOF
然后,退回hellochart外的那个目录里,执行安装hellochart的命令:
格式:helm install [自定义名称] ./hellochart
或者:helm install ./hellochart --generate-name
举例:
[root@node1 ~]# helm install hello ./hellochart
然后,我们可以去查询下载的信息:
格式:helm get manifest 【release的名称】
[root@node1 ~]# helm get manifest hello
这个就是一种最简单的、自定义的chart模板的创建了。
3.6.3 Chart-deployment法
这种方法和上面一种最大的区别是:
1.只操作deployment.yaml和service.yaml两个文件即可
2.过程中需要借助Pod
首先同样是创建一个chart:
然后进入到/templates下操作,同样先把原来的内容删光。
首先创建一个Pod:
格式: kubectl create deployment [自定义pod名] --image=nginx
[root@node1 templates]# kubectl create deployment web --image=nginx
看下pod是否生成了:
把容器的配置情况写入deployment.yaml中:
[root@node1 templates]# kubectl create deployment web --image=nginx --dry-run -o yaml > deployment.yaml
然后把上述配好的资源暴露为service,并且写入service.yaml中:
[root@node1 templates]# kubectl expose deployment web --port=80 --type=NodePort --dry-run -o yaml >service.yaml
然后把前面配的deployment删除
[root@node1 templates]# kubectl delete deployment web
然后,依然退回depchart外面的目录,执行depchart的下载,但是下载命令并不一样,因为借助了web这个pod,所以:
[root@node1 ~]# helm install web depchart/
最后,升级一下自创的chart:
[root@node1 ~]# helm upgrade web depchart/
由于这个方法借助了pod和nginx,所以自己写完的这个chart模板,如果没有修改其他配置的话,会默认是nginx的镜像,需要在values.yaml中修改,但是这种方法通过传递参数的方式实现yaml文件的高效复用
PS:第一种方法,由于helm2和helm3版本差异,在生成名称上就有一些微妙的差别