目录

helm基本介绍

 helm部署使用

1. helm的安装

2. 配置helm仓库

(1)添加仓库

(2)helm仓库的基本操作

3. 使用helm快速部署一个应用

4. 自定义chart

5. chart模板的使用


helm基本介绍

前言:在我们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

  • chart 是创建一个应用的信息集合,包括各种 Kubernetes 对象的配置模板、参数定义、依赖关系、文档说 明等。chart 是应用部署的自包含逻辑单元。可以将 chart 想象成 apt、yum 中的软件安装包。

在k8s中,应用的信息其实有很多,比如说我们的deployment或者svc是怎么创建的,包括一些存储呀都需要声明出来,chart就是这些信息的集合。

  • release 是 chart 的运行实例,代表了一个正在运行的应用。当 chart 被安装到 Kubernetes 集群,就生成 一个 release。chart 能够多次安装到同一个集群,每次安装都是一个 release。

其实上面的两个跟我们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、其他

 helm部署使用

1. helm的安装

由于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"}

2. 配置helm仓库

(1)添加仓库

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]# 

(2)helm仓库的基本操作

如何查看配置的存储

helm repo list

helm search repo aliyun

删除存储

helm repo remove aliyun

 3. 使用helm快速部署一个应用

第一步: 使用搜索命令搜索应用

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是否创建成功

4. 自定义chart

自定义选项是因为并不是所有的 chart 都能按照默认配置运行成功,可能会需要一些环境 依赖,例如 PV。 所以我们需要自定义 chart 配置选项,安装过程中有两种方法可以传递配置数据:

  • --values(或-f):指定带有覆盖的 YAML 文件。这可以多次指定,最右边的文件 优先
  • --set:在命令行上指定替代。如果两者都用,--set 优先级高

第一步:使用命令创建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      <none>        443/TCP        108m
service/ui-test-weave-scope   ClusterIP   10.1.107.92   <none>        80/TCP         33m
service/web1                  NodePort    10.1.25.42    <none>        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 ~]# 

5. chart模板的使用

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.Namerelease 名称
Release.Namerelease 名字
Release.Namespacerelease 命名空间
Release.Servicerelease 服务的名称
Release.Revisionrelease 修订版本号,从 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的高级用法。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐