K8S--Helm
一、Helm 概述
1.1 helm 简介
在 Kubernetes 中部署容器云的应用也是一项有挑战性的工作,Helm 就是为了简化在 Kubernetes 中安装部署容器云应用的一个客户端工具。通过 helm 能够帮助开发者定义、安装和升级 Kubernetes 中的容器云应用,同时也可以通过 helm 进行容器云应用的分享。在 Kubeapps Hub 中提供了包括 Redis、MySQL 和 Jenkins 等常见的应用,通过 helm 可以使用一条命令就能够将其部署安装在自己的 Kubernetes 集群中。
Helm 是管理 Kubernetes 包的工具,Helm 能提供下面的能力:
- 创建新的 charts(图表)
- 将 charts 打包成 tgz 文件
- 与 chart 仓库交互
- 安装和卸载 Kubernetes 的应用
- 管理使用 Helm 安装的 charts 的生命周期
1.2 helm 架构
Helm 架构由 Helm 客户端、Tiller 服务器端和 Chart 仓库所组成;Tiller 部署在 Kubernetes 中,Helm 客户端从 Chart 仓库中获取 Chart 安装包,并将其安装部署到 Kubernetes 集群中。
1.3 helm 的重要概念
Charts:是创建 Kubernetes 应用实例的信息集合,也就是一个 helm 的程序包,它包含了运行一个 k8s 应用所有需要的镜像、依赖关系和资源定义等,必要时还会包含 Service 资源定义,它类似于 yum 的 rpm 文件
Repository:Chart 仓库,用于集中存储和分发 Charts。
Config:应用程序实例化安装时运行使用的配置信息
Release:chart 的运行实例,包含特定的 config
1.4 helm 组件
在 Helm 中有两个主要的组件,即 Helm 客户端和 Tiller 服务器
1.4.1 helm 客户端
是一个供终端用户使用的命令行工具
客户端负责如下的工作:
本地 chart 开发
管理仓库
与 Tiller 服务器交互(发送需要被安装的 charts、请求关于发布版本的信息、请求更新或者卸载已安装的发布版本)
1.4.2 Tiller 服务器
Tiller 是 helm 的服务器端,一般运行于 kubernetes 集群之上,定义 tiller 的 ServiceAccount,并通过 ClusterRoleBinding 将其绑定至集群管理员角色 cluster-admin,从而使得它拥有集群级别所有的最高权限
Tiller 服务器负责如下的工作:
监听来自于 Helm 客户端的请求
组合 chart 和配置来构建一个发布
在 Kubernetes 中安装,并跟踪后续的发布
通过与 Kubernetes 交互,更新或者 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里面的内容了
相关文件编辑完成之后,我们验证一下,没有报错表示成功
真正部署一下