目录

一、Helm 概述

1.1 helm 简介

1.2 helm 架构

1.3 helm 的重要概念

1.4 helm 组件

二、部署 Helm

1、安装Helm 客户端

2、安装 Tiller server(需要创建授权用户)

3、配置 helm 仓库

4、测试 helm 是否可以正常使用

三、helm仓库的基本操作

1、如何查看配置的存储库

2、使用helm快速部署一个应用

四、 自定义chart

1、chart模板的使用


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

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

真正部署一下

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐