当前位置:网站首页>Kubernetes:(十七)Helm概述、安装及配置
Kubernetes:(十七)Helm概述、安装及配置
2022-08-10 05:20:00 【糖醋·小排顾】
目录
前言:在我们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
[[email protected] ~]# wget http://101.34.22.188/k8s/helm-v2.14.3-linux-amd64.tar.gz
[[email protected] ~]# tar zxvf helm-v2.14.3-linux-amd64.tar.gz
[[email protected] ~]# mv linux-amd64/helm /usr/local/bin/
[[email protected] ~]# chmod +x /usr/local/bin/helm
[[email protected] ~]# echo 'source <(helm completion bash)' >> /etc/profile
[[email protected] ~]# . /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(需要创建授权用户)
#创建授权用户
[[email protected] ~]# 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[[email protected] ~]# kubectl apply -f tiller-rbac.yaml
[[email protected] ~]# helm init --service-account=tiller
[[email protected] ~]# kubectl get pod -n kube-system | grep tiller
[[email protected] ~]# 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,或重启该容器)
[[email protected] ~]# kubectl get pod -n kube-system | grep tiller
//只要保证 tiller 的 pod 正常运行即可
tiller-deploy-8557598fbc-m986t 1/1 Running 0 7m54s2.3配置 helm 仓库
[[email protected] ~]# helm repo list //查看其仓库信息
NAME URL
stable https://kubernetes-charts.storage.googleapis.com
//如上,默认是 Google,在国外,速度特别慢
local http://127.0.0.1:8879/charts
//执行下面命令,更改为国内阿里云的仓库
[[email protected] ~]# helm repo add stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
[[email protected] ~]# helm repo list //再次查看,可以发现更改生效了
NAME URL
stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
local http://127.0.0.1:8879/charts
[[email protected] ~]# helm repo update //更新一下 helm 仓库
[[email protected] ~]# 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 是否可以正常使用
[[email protected] ~]# helm search mysql //搜索 MySQL
//查看到的是 charts 包文件,查出来的版本是 helm 的 Charts 包的版本
[[email protected] ~]# helm inspect stable/mysql //查看其详细信息
[[email protected] ~]# helm fetch stable/mysql //下载搜索到的包到本地
[[email protected] templates]# helm install stable/mysql //在线安装这个 MySQL三:helm仓库的基本操作
3.1 如何查看配置的存储库
helm repo list
helm search repo aliyun
删除存储库
helm repo remove aliyun3.2使用helm快速部署一个应用
3.2.1使用搜索命令搜索应用
helm search repo 应用名称
[[email protected] 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 安装之后应用的名称[[email protected] 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
[[email protected] k8s]# 
当然我们也可以通过kubectl命令查看相关的pod是否创建成功

四:自定义chart
自定义选项是因为并不是所有的 chart 都能按照默认配置运行成功,可能会需要一些环境 依赖,例如 PV。 所以我们需要自定义 chart 配置选项,安装过程中有两种方法可以传递配置数据:
- --values(或-f):指定带有覆盖的 YAML 文件。这可以多次指定,最右边的文件 优先
- --set:在命令行上指定替代。如果两者都用,--set 优先级高
4.1使用命令创建chart
helm create chart名称
[[email protected] k8s]# helm create mychart
Creating mychart
[[email protected] k8s]#
[[email protected] k8s]# ls mychart/
charts Chart.yaml templates values.yaml
[[email protected] k8s]# cd mychart
[[email protected] 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
[[email protected] mychart]# 分析一下相关目录的含义:
charts:普通文件夹,刚开始创建为空
Chart.yaml:用于配置当前chart的属性信息,可以作为全局变量提供给模板文件使用

templates:目标信息文件,里面有很多的yaml模板文件,我们使用helm创建应用相当于helm帮我去执行这些yaml文件了。
[[email protected] 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
[[email protected] templates]# 因为我们需要自己自定义chart,因此我们可以修改这些yaml文件,也可以删除这些默认生成的yaml文件,然后自己重新写。
[[email protected] templates]# rm -rf *
[[email protected] templates]# ls
[[email protected] 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 ..
[[email protected] templates]# values.yaml:全局变量文件,提供给templates里面的yaml文件用
4.2在templates文件夹中创建两个yaml文件


为了方便得到service.yaml,我们事先创建了一个web1的服务,得到service.yaml文件之后,再删除这个服务。
4.3开始安装mychart
[[email protected] 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
[[email protected] k8s]#
[[email protected] 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
[[email protected] k8s]# 4.4更新应用
helm upgrade chart名称
更新应用的话,一般更新我们的宏定义变量
[[email protected] 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
[[email protected] k8s]# 4.5删除应用
[[email protected] ~]# helm uninstall ui-test
release "ui-test" uninstalled
[[email protected] ~]# 4.6chart模板的使用
helm可以把我们的yaml文件统一做整体管理,另外可以让我们的yaml文件实现高效的复用。下面就试验如何实现yaml文件的高效的复用,即如何模板,我们动态的渲染模板,动态的传入参数。就是values.yaml使用。
yaml文件中大体中image,tag,label,port,replicas不同,即我们把它们当做宏定义。
4.6.1在values.yaml定义变量和值
[[email protected] 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: {}
[[email protected] 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
[[email protected] 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: {}
[[email protected] mychart]# 然后就是templates里面的内容了

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

真正部署一下

边栏推荐
- 剑指Offer 033.变位数组
- FPGA工程师面试试题集锦21~30
- Become a language that hackers have to learn. Do you think it's okay after reading it?
- curl命令介绍
- The sword refers to Offer 033. Variation array
- 基于BP神经网络的多因素房屋价格预测matlab仿真
- Joomla vulnerability reproduced
- 2022 security officer C certificate test and simulation test in shandong province
- ThreadPoolExecutor thread pool principle
- mysql cdc (2.1.1)inital snapshot数据库的时候设置了5个并发度,se
猜你喜欢

Read the excerpt notes made by dozens of lightweight target detection papers for literacy

How to improve product quality from the code layer

How to simulate the background API call scene, very detailed!

EasyGBS connects to mysql database and prompts "can't connect to mysql server", how to solve it?

【LeetCode】41. The first missing positive number

MySql之json_extract函数处理json字段

Hezhou ESP32C3 +1.8"tft network clock under Arduino framework

二进制中负数为何要用补码形式来表示——二进制加减法

接口文档进化图鉴,有些古早接口文档工具,你可能都没用过

深度梳理:防止模型过拟合的方法汇总
随机推荐
aliases node analysis
2022 R2 transportable pressure vessel filling operation examination question bank simulation platform
aliases节点分析
An article to master the entire JVM, JVM ultra-detailed analysis!!!
Nexus_仓库类型
线程(下):读写者模型\环形队列\线程池
flinksql怎么写redis的value只有最后一个字段?
ORA-16018 异常处理记录
2022 T Elevator Repair Exam Questions and Mock Exams
Important transformation and upgrading
Introduction to curl command
Get started with the OAuth protocol easily with a case
十年架构五年生活-07 年轻气盛的蜕变
Guys, the test in the idea uses FlinkCDC SQL to read Mysql data and write it into Kafka. The code creates
SQLSERVER 2008 解析 Json 格式数据
`id` bigint(20) unsigned NOT NULL COMMENT '数据库主键',
ThreadPoolExecutor线程池原理
AVL树的插入--旋转笔记
openGauss源码,在window系统用VSCode维护吗?
flex 相关