K8S中Helm _
前言
在我们yum管理工具,主要解决的是包之间的依赖问题,而我们的helm工具是安装服务的问题,在我们的k8s中的包管理工具helm,它可以通过一些仓库去下载一些我们想要yalm文件,我们去修改这些yalm文件对应的属性就可以安装对应我们想要的系统信息。
一、Helm 概述
1、Helm 简介
Helm是kubernetes生态系统中的一个软件包管理工具,类似ubuntu的apt,centos的yum或python的pip一样,专门负责管理kubernetes应用资源;使用helm可以对kubernetes应用进行统一打包、分发、安装、升级以及回退等操作。
Helm 就是为了简化在 Kubernetes 中安装部署容器云应用的一个客户端工具。通过 helm 能够帮助开发者定义、安装和升级 Kubernetes 中的容器云应用,同时也可以通过 helm 进行容器云应用的分享。在 Kubeapps Hub 中提供了包括 Redis、MySQL 和 Jenkins 等常见的应用,通过 helm 可以使用一条命令就能够将其部署安装在自己的 Kubernetes 集群中。
Helm 是管理 Kubernetes 包的工具,Helm 能提供下面的能力:
- 创建新的 charts(图表)
- 将 charts 打包成 tgz 文件
- 与 chart 仓库交互
- 安装和卸载 Kubernetes 的应用
- 管理使用 Helm 安装的 charts 的生命周期
2、Helm 架构
Helm 架构由 Helm 客户端、Tiller 服务器端和 Chart 仓库所组成;Tiller 部署在 Kubernetes 中,Helm 客户端从 Chart 仓库中获取 Chart 安装包,并将其安装部署到 Kubernetes 集群中。
Chart Install 过程:
- Helm从指定的目录或者tgz文件中解析出Chart结构信息
- Helm将指定的Chart结构和Values信息通过gRPC传递给Tiller
- Tiller根据Chart和Values生成一个Release
- Tiller将Release发送给Kubernetes运行。
Chart Update过程:
- Helm从指定的目录或者tgz文件中解析出Chart结构信息
- Helm将要更新的Release的名称和Chart结构,Values信息传递给Tiller
- Tiller生成Release并更新指定名称的Release的History
- Tiller将Release发送给Kubernetes运行
Chart Rollback过程:
- Helm将要回滚的Release的名称传递给Tiller
- Tiller根据Release的名称查找History
- Tiller从History中获取上一个Release
- Tiller将上一个Release发送给Kubernetes用于替换当前Release
3、Helm 组件
在 Helm 中有两个主要的组件,即 Helm 客户端和 Tiller 服务器
3.1 Heml
Helm 是一个命令行下的客户端工具。主要用于 Kubernetes 应用程序 Chart 的创建、打包、发布以及创建和管理本地和远程的 Chart 仓库。
客户端负责如下的工作:
- 本地 chart 开发
- 管理仓库
- 与 Tiller 服务器交互(发送需要被安装的 charts、请求关于发布版本的信息、请求更新或者卸载已安装的发布版本)
3.2 Tiller
Tiller 是 Helm 的服务端,部署在 Kubernetes 集群中。Tiller 用于接收 Helm 的请求,并根据 Chart 生成 Kubernetes 的部署文件( Helm 称为 Release ),然后提交给 Kubernetes 创建应用。Tiller 还提供了 Release 的升级、删除、回滚等一系列功能。
Tiller 服务器负责如下的工作:
- 监听来自于 Helm 客户端的请求
- 组合 chart 和配置来构建一个发布
- 在 Kubernetes 中安装,并跟踪后续的发布
- 通过与 Kubernetes 交互,更新或者 chart
3.3 Chart
Helm 的软件包,采用 TAR 格式。类似于 APT 的 DEB 包或者 YUM 的 RPM 包,其包含了一组定义 Kubernetes 资源相关的 YAML 文件。
3.4 Repository
Helm 的软件仓库,Repository 本质上是一个 Web 服务器,该服务器保存了一系列的 Chart 软件包以供用户下载,并且提供了一个该 Repository 的 Chart 包的清单文件以供查询。Helm 可以同时管理多个不同的 Repository。
3.5 Release
使用 helm install
命令在 Kubernetes 集群中部署的 Chart 称为 Release。
注意:需要注意的是:Helm 中提到的 Release 和我们通常概念中的版本有所不同,这里的 Release 可以理解为 Helm 使用 Chart 包部署的一个应用实例。
二、Helm 部署
Helm 的安装方式很多,这里采用二进制的方式安装。更多安装方法可以参考 Helm 的官方帮助文档。
1、安装Helm 客户端
#wget https://get.helm.sh/helm-v2.14.3-linux-amd64.tar.gz [root@master ~]# wget http://101.34.22.188/k8s/helm-v2.14.3-linux-amd64.tar.gz [root@master ~]# tar zxvf helm-v2.14.3-linux-amd64.tar.gz [root@master ~]# mv linux-amd64/helm /usr/local/bin/ [root@master ~]# chmod +x /usr/local/bin/helm [root@master ~]# echo 'source <(helm completion bash)' >> /etc/profile [root@master ~]# . /etc/profile
2、安装 Tiller server(需要创建授权用户)
#创建授权用户 [root@master ~]# vim tiller-rbac.yaml apiVersion: v1 kind: ServiceAccount metadata: name: tiller namespace: kube-system --- apiVersion: rbac.authorization.k8s.io/v1beta1 kind: ClusterRoleBinding metadata: name: tiller roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: - kind: ServiceAccount name: tiller namespace: kube-system
[root@master ~]# kubectl apply -f tiller-rbac.yaml [root@master ~]# helm init --service-account=tiller [root@master ~]# kubectl get pod -n kube-system | grep tiller [root@master ~]# kubectl edit pod tiller-deploy-8557598fbc-tvfsj -n kube-system //编辑 pod 的 yaml 文件,将其使用的镜像改为国内阿里云的,默认是 Google 的镜像,下载不下来 //修改 spec 字段的 image 指定的镜像如下: image: gcr.io/kubernetes-helm/tiller:v2.14.3 //修改如下: image: registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.14.3 //修改后,保存退出即可,它会去自动下载新镜像(如果没有自动下载,就想办法吧,比如说在 tiller 容器所在的节点手动下载下来镜像,然后重启该节点的 kubelet,或重启该容器) [root@master ~]# kubectl get pod -n kube-system | grep tiller //只要保证 tiller 的 pod 正常运行即可 tiller-deploy-8557598fbc-m986t 1/1 Running 0 7m54s
3、配置 helm 仓库
[root@master ~]# helm repo list //查看其仓库信息 NAME URL stable https://kubernetes-charts.storage.googleapis.com //如上,默认是 Google,在国外,速度特别慢 local http://127.0.0.1:8879/charts //执行下面命令,更改为国内阿里云的仓库 [root@master ~]# helm repo add stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts [root@master ~]# helm repo list //再次查看,可以发现更改生效了 NAME URL stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts local http://127.0.0.1:8879/charts [root@master ~]# helm repo update //更新一下 helm 仓库 [root@master ~]# helm version //查看 helm 版本信息,必须保证可以查看出来 client 和 server,才可正常使用 helm Client: &version.Version{SemVer:"v2.14.3", GitCommit:"0e7f3b6637f7af8fcfddb3d2941fcc7cbebb0085", GitTreeState:"clean"} Server: &version.Version{SemVer:"v2.14.3", GitCommit:"0e7f3b6637f7af8fcfddb3d2941fcc7cbebb0085", GitTreeState:"clean"}
4、测试 helm 是否可以正常使用
[root@master ~]# helm search mysql //搜索 MySQL //查看到的是 charts 包文件,查出来的版本是 helm 的 Charts 包的版本 [root@master ~]# helm inspect stable/mysql //查看其详细信息 [root@master ~]# helm fetch stable/mysql //下载搜索到的包到本地 [root@master templates]# helm install stable/mysql //在线安装这个 MySQL
三、helm仓库的基本操作
1、如何查看配置的存储库
helm repo list helm search repo aliyun
删除存储库
helm repo remove aliyun
2、使用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 2023-03-13 15:00:00.561399142 +0800 CST deployed weave-scope-0.9.2 1.6.5 [root@master1 k8s]#
当然我们也可以通过kubectl命令查看相关的pod是否创建成功
四、 自定义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 2022 NAMESPACE: default STATUS: deployed REVISION: 2 TEST SUITE: None [root@master1 k8s]#
第五步:删除应用
[root@master1 ~]# helm uninstall ui-test release "ui-test" uninstalled [root@master1 ~]#
1、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.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里面的内容了
相关文件编辑完成之后,我们验证一下,没有报错表示成功
真正部署一下