目录
helm基本介绍
helm部署使用
1. helm的安装
2. 配置helm仓库
(1)添加仓库
(2)helm仓库的基本操作
3. 使用helm快速部署一个应用
4. 自定义chart
5. chart模板的使用
前言:在我们yum管理工具,主要解决的是包之间的依赖问题,而我们的helm工具是安装服务的问题,在我们的k8s中的包管理工具helm,它可以通过一些仓库去下载一些我们想要yalm文件,我们去修改这些yalm文件对应的属性就可以安装对应我们想要的系统信息。
那么什么是helm呢?
官方的解释是在没使用helm之前,向 kubernetes 部署应用,我们要依次部署 deployment、svc 等,步骤较繁琐。况且随 着很多项目微服务化,复杂的应用在容器中部署以及管理显得较为复杂,helm 通过打包的方式,支持发布的版本 管理和控制,很大程度上简化了 Kubernetes 应用的部署和管理。
Helm 本质就是让 K8s 的应用管理(Deployment,Service 等 ) 可配置,能动态生成。通过动态生成 K8s 资源清 单文件(deployment.yaml,service.yaml)。然后调用 Kubectl 自动执行 K8s 资源部署。
也就是说通过helm生成的yaml文件并不是一成不变的,它不想之前的手动创建的yaml文件,从我们创建到运行,只要我们编辑完yaml文件,这个数据就不会更改。但是通过我们helm传递类似环境变量的东西去修改我们的pod的信息,达到一个动态的效果。
Helm 是官方提供的类似于 YUM 的包管理器,是部署环境的流程封装。Helm 有两个重要的概念:chart 和 release
在k8s中,应用的信息其实有很多,比如说我们的deployment或者svc是怎么创建的,包括一些存储呀都需要声明出来,chart就是这些信息的集合。
其实上面的两个跟我们docker中的镜像与容器的关系,chart相当于一个镜像,没运行之前就是一些环境的封装,当启动chart就会生成一个容器,并且一个镜像可以启动多个容器,这里就是realease。
Helm2 包含两个组件:Helm 客户端和 Tiller 服务器,如下图所示
Helm2 客户端负责 chart 和 release 的创建和管理以及和 Tiller 的交互。Tiller 服务器运行在 Kubernetes 集群 中,它会处理 Helm2 客户端的请求,与 Kubernetes API Server 交互。
在最新版本中,我们已经把helm升级到V3版本了,V3版本移除了tiller服务器的概念,关于v3和v2版本的区别如下:
Helm 2 、Helm 3 比较 | 码农网
1、一个最明显的变化是tiller的删除
2、Release 名称可以在不同命名空间重用
3、支持将 Chart 推送至 Docker 镜像仓库中
4、使用 JSONSchema 验证 chart values
5、其他
由于v2版本现在基本已经废弃使用,下面我们只使用v3版本试验,关于helm的安装,很简单,去官方网站拿到对应的二进制文件,然后放到PATH路径下即可。
[root@master1 k8s]# tar -vxf helm-v3.0.0-linux-amd64.tar.gz
linux-amd64/
linux-amd64/helm
linux-amd64/README.md
linux-amd64/LICENSE
[root@master1 k8s]# cp linux-amd64/helm /usr/bin/ -af
[root@master1 k8s]# helm version
version.BuildInfo{Version:"v3.0.0", GitCommit:"e29ce2a54e96cd02ccfce88bee4f58bb6e2a28b6", GitTreeState:"clean", GoVersion:"go1.13.4"}
helm repo add 仓库名称 仓库地址
[root@master1 k8s]# helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
"aliyun" has been added to your repositories
[root@master1 k8s]#
[root@master1 k8s]# helm repo list
NAME URL
aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
[root@master1 k8s]# helm repo update #更新仓库,相当于yum update
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "aliyun" chart repository
Update Complete. ⎈ Happy Helming!⎈
[root@master1 k8s]#
如何查看配置的存储库
helm repo list
helm search repo aliyun
删除存储库
helm repo remove aliyun
第一步: 使用搜索命令搜索应用
helm search repo 应用名称
[root@master1 k8s]# helm search repo weave
NAME CHART VERSION APP VERSION DESCRIPTION
aliyun/weave-cloud 0.1.2 Weave Cloud is a add-on to Kubernetes which pro...
aliyun/weave-scope 0.9.2 1.6.5 A Helm chart for the Weave Scope cluster visual...
第二步:根据搜索内容选择安装
helm install 安装后应用的名称 搜索之后应用的名称
第三步:查看安装之后的状态
helm list
helm status 安装之后应用的名称
[root@master1 k8s]# helm list #也可以使用helm ls
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
ui-test default 1 2021-10-23 19:52:48.561399142 +0800 CST deployed weave-scope-0.9.2 1.6.5
[root@master1 k8s]#
当然我们也可以通过kubectl命令查看相关的pod是否创建成功
自定义选项是因为并不是所有的 chart 都能按照默认配置运行成功,可能会需要一些环境 依赖,例如 PV。 所以我们需要自定义 chart 配置选项,安装过程中有两种方法可以传递配置数据:
第一步:使用命令创建chart
helm create chart名称
[root@master1 k8s]# helm create mychart
Creating mychart
[root@master1 k8s]#
[root@master1 k8s]# ls mychart/
charts Chart.yaml templates values.yaml
[root@master1 k8s]# cd mychart
[root@master1 mychart]# ls -al
总用量 12
drwxr-xr-x 4 root root 93 10月 23 20:01 .
drwxr-xr-x 6 root root 233 10月 23 20:01 ..
drwxr-xr-x 2 root root 6 10月 23 20:01 charts
-rw-r--r-- 1 root root 905 10月 23 20:01 Chart.yaml
-rw-r--r-- 1 root root 342 10月 23 20:01 .helmignore
drwxr-xr-x 3 root root 146 10月 23 20:01 templates
-rw-r--r-- 1 root root 1490 10月 23 20:01 values.yaml
[root@master1 mychart]#
分析一下相关目录的含义吧
charts:普通文件夹,刚开始创建为空
Chart.yaml:用于配置当前chart的属性信息,可以作为全局变量提供给模板文件使用
templates:目标信息文件,里面有很多的yaml模板文件,我们使用helm创建应用相当于helm帮我去执行这些yaml文件了。
[root@master1 templates]# ls -al
总用量 24
drwxr-xr-x 3 root root 146 10月 23 20:01 .
drwxr-xr-x 4 root root 93 10月 23 20:05 ..
-rw-r--r-- 1 root root 1626 10月 23 20:01 deployment.yaml
-rw-r--r-- 1 root root 1847 10月 23 20:01 _helpers.tpl
-rw-r--r-- 1 root root 1030 10月 23 20:01 ingress.yaml
-rw-r--r-- 1 root root 1581 10月 23 20:01 NOTES.txt
-rw-r--r-- 1 root root 207 10月 23 20:01 serviceaccount.yaml
-rw-r--r-- 1 root root 361 10月 23 20:01 service.yaml
drwxr-xr-x 2 root root 34 10月 23 20:01 tests
[root@master1 templates]#
因为我们需要自己自定义chart,因此我们可以修改这些yaml文件,也可以删除这些默认生成的yaml文件,然后自己重新写。
[root@master1 templates]# rm -rf *
[root@master1 templates]# ls
[root@master1 templates]# ls -al
总用量 0
drwxr-xr-x 2 root root 6 10月 23 20:07 .
drwxr-xr-x 4 root root 93 10月 23 20:05 ..
[root@master1 templates]#
values.yaml:全局变量文件,提供给templates里面的yaml文件用
第二步:在templates文件夹中创建两个yaml文件
为了方便得到service.yaml,我们事先创建了一个web1的服务,得到service.yaml文件之后,再删除这个服务。
第三步:开始安装mychart
[root@master1 k8s]# helm install web1 mychart/
NAME: web1
LAST DEPLOYED: Sat Oct 23 20:25:23 2021
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
[root@master1 k8s]#
[root@master1 k8s]# kubectl get svc,pod
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.1.0.1 443/TCP 108m
service/ui-test-weave-scope ClusterIP 10.1.107.92 80/TCP 33m
service/web1 NodePort 10.1.25.42 80:32142/TCP 25s
NAME READY STATUS RESTARTS AGE
pod/weave-scope-agent-ui-test-gb42z 1/1 Running 0 33m
pod/weave-scope-frontend-ui-test-77f49fbcd5-j6mrs 1/1 Running 0 33m
pod/web1-74b5695598-t65gj 1/1 Running 0 25s
[root@master1 k8s]#
第四步:更新应用
helm upgrade chart名称
更新应用的话,一般更新我们的宏定义变量
[root@master1 k8s]# helm upgrade web1 mychart/
Release "web1" has been upgraded. Happy Helming!
NAME: web1
LAST DEPLOYED: Sat Oct 23 20:29:06 2021
NAMESPACE: default
STATUS: deployed
REVISION: 2
TEST SUITE: None
[root@master1 k8s]#
第五步:删除应用
[root@master1 ~]# helm uninstall ui-test
release "ui-test" uninstalled
[root@master1 ~]#
helm可以把我们的yaml文件统一做整体管理,另外可以让我们的yaml文件实现高效的复用。下面就试验如何实现yaml文件的高效的复用,即如何模板,我们动态的渲染模板,动态的传入参数。就是values.yaml使用。
yaml文件中大体中image,tag,label,port,replicas不同,即我们把它们当做宏定义。
第一步:在values.yaml定义变量和值
[root@master1 mychart]# cat values.yaml
# Default values for mychart.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.
replicas: 1
image: nginx
tag: 1.16
lable: nginx
port: 80
podSecurityContext: {}
[root@master1 mychart]#
第二步:在具体的yaml中获取定义的变量值
通过一种表达式的形式使用全局变量,
{{ . Values.变量名称}}
{{ . Release.Name}} 表示取到当前版本的名称,保证每次部署的名字不一样,这是helm内置的对象属性。
helm常用的内置对象:
Release.Name | release 名称 |
Release.Name | release 名字 |
Release.Namespace | release 命名空间 |
Release.Service | release 服务的名称 |
Release.Revision | release 修订版本号,从 1 开始累加 |
首先是values.yaml
[root@master1 mychart]# cat values.yaml
# Default values for mychart.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.
replicas: 1
image: nginx
tag: 1.16
label: nginx
port: 80
podSecurityContext: {}
[root@master1 mychart]#
然后就是templates里面的内容了
相关文件编辑完成之后,我们验证一下,没有报错表示成功
真正部署一下
至此为止,helm的大部分操作以及应用已经完成了,后面还会学习到关于helm的高级用法。