Helm

一、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里面的内容了

相关文件编辑完成之后,我们验证一下,没有报错表示成功

posted @ 2023-03-13 18:25  林乃均  阅读(124)  评论(0编辑  收藏  举报