目录
一:Helm概述
1.1 何为helm?
1.2 Helm 组件及相关术语
1.2.1 Helm
1.2.2 Tiller
1.2.3 Chart
1.2.4 Repoistory
1.2.5 Release
1.3 架构
二:部署 Helm
2.1安装 helm 客户端
2.2安装 Tiller server(需要创建授权用户)
2.3配置 helm 仓库
2.4测试 helm 是否可以正常使用
三:helm仓库的基本操作
3.1 如何查看配置的存储库
3.2使用helm快速部署一个应用
3.2.1使用搜索命令搜索应用
3.2.2根据搜索内容选择安装
3.2.3查看安装之后的状态
四:自定义chart
4.1使用命令创建chart
4.2在templates文件夹中创建两个yaml文件
4.3开始安装mychart
4.4更新应用
4.5删除应用
4.6chart模板的使用
4.6.1在values.yaml定义变量和值
4.6.2在具体的yaml中获取定义的变量值
前言:在我们yum管理工具,主要解决的是包之间的依赖问题,而我们的helm工具是安装服务的问题,在我们的k8s中的包管理工具helm,它可以通过一些仓库去下载一些我们想要yalm文件,我们去修改这些yalm文件对应的属性就可以安装对应我们想要的系统信息。
一:Helm概述
1.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 的生命周期
1.2 Helm 组件及相关术语
在 Helm 中有俩个主要的组件,即 Helm 客户端和 Tiller 服务器
1.2.1 Helm
Helm 是一个命令行下的客户端工具。主要用于 Kubernetes 应用程序 Chart 的创建、打包、发布以及创建和管理本地和远程的 Chart 仓库。
客户端负责如下的工作:
- 本地 chart 开发
- 管理仓库
- 与 Tiller 服务器交互(发送需要被安装的 charts、请求关于发布版本的信息、请求更新或者卸载已安装的发布版本)
1.2.2 Tiller
Tiller 是 Helm 的服务端,部署在 Kubernetes 集群中。Tiller 用于接收 Helm 的请求,并根据 Chart 生成 Kubernetes 的部署文件( Helm 称为 Release ),然后提交给 Kubernetes 创建应用。Tiller 还提供了 Release 的升级、删除、回滚等一系列功能。
Tiller 服务器负责如下的工作:
- 监听来自于 Helm 客户端的请求
- 组合 chart 和配置来构建一个发布
- 在 Kubernetes 中安装,并跟踪后续的发布
- 通过与 Kubernetes 交互,更新或者 chart
1.2.3 Chart
Helm 的软件包,采用 TAR 格式。类似于 APT 的 DEB 包或者 YUM 的 RPM 包,其包含了一组定义 Kubernetes 资源相关的 YAML 文件。
1.2.4 Repoistory
Helm 的软件仓库,Repository 本质上是一个 Web 服务器,该服务器保存了一系列的 Chart 软件包以供用户下载,并且提供了一个该 Repository 的 Chart 包的清单文件以供查询。Helm 可以同时管理多个不同的 Repository。
1.2.5 Release
使用 helm install命令在 Kubernetes 集群中部署的 Chart 称为 Release。
注:需要注意的是:Helm 中提到的 Release 和我们通常概念中的版本有所不同,这里的 Release 可以理解为 Helm 使用 Chart 包部署的一个应用实例。
1.3 架构
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
二:部署 Helm
Helm 的安装方式很多,这里采用二进制的方式安装。更多安装方法可以参考 Helm 的官方帮助文档
2.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
添加常用repo
- 添加存储库:helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
- 更新存储库:helm repo update
- 查看存储库:helm repo list
- 删除存储库:helm repo remove aliyun
2.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
2.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"}
2.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仓库的基本操作
3.1 如何查看配置的存储库
helm repo list
helm search repo aliyun
删除存储库
helm repo remove aliyun
3.2使用helm快速部署一个应用
3.2.1使用搜索命令搜索应用
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...
3.2.2根据搜索内容选择安装
helm install 安装后应用的名称 搜索之后应用的名称
3.2.3查看安装之后的状态
helm list
helm status 安装之后应用的名称
[root@master1 k8s]# helm list #也可以使用helm ls
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
ui-test default 1 2022-08-10 19:52:48.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 优先级高
4.1使用命令创建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文件用
4.2在templates文件夹中创建两个yaml文件
为了方便得到service.yaml,我们事先创建了一个web1的服务,得到service.yaml文件之后,再删除这个服务。
4.3开始安装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]#
4.4更新应用
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]#
4.5删除应用
[root@master1 ~]# helm uninstall ui-test
release "ui-test" uninstalled
[root@master1 ~]#
4.6chart模板的使用
helm可以把我们的yaml文件统一做整体管理,另外可以让我们的yaml文件实现高效的复用。下面就试验如何实现yaml文件的高效的复用,即如何模板,我们动态的渲染模板,动态的传入参数。就是values.yaml使用。
yaml文件中大体中image,tag,label,port,replicas不同,即我们把它们当做宏定义。
4.6.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
lable: nginx
port: 80
podSecurityContext: {}
[root@master1 mychart]#
4.6.2在具体的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里面的内容了
相关文件编辑完成之后,我们验证一下,没有报错表示成功
真正部署一下