Helm入门

Helm入门

1、基本功能

1.1 Helm 是什么?

helm 是 Kubernetes 的包管理器。类似于yum安装指令,统一对安装服务进行管理,使得用户不需要关心服务之间的依赖关系。Helm 由客户端组件 helm 和服务端组件 Tiller 组成,能够将一组K8S资源打包统一管理,是查找、共享和使用为Kubernetes构建的软件的最佳方式。

这个时候,如果一键部署所有应用,使用  Helm 是一个很不错的选择,它具备如下的能力:

  • 简化部署
  • 高度可配置:Helm Charts提供了高度可配置的选项,可以轻松自定义和修改应用程序的部署配置;
  • 版本控制
  • 模板化:Helm Charts使用YAML模板来定义Kubernetes对象的配置,从而简化了配置过程,并提高了可重复性和可扩展性;
  • 应用程序库:Helm具有应用程序库的概念,可以轻松地共享和重用Helm Charts,从而简化了多个应用程序的部署和管理;
  • 插件系统:Helm拥有一个强大的插件系统,允许您扩展和定制Helm的功能,以满足特定的需求和要求。

1.2 Helm 相关组件及概念

在使用Helm的过程中,需要理解如下的几个核心的概念:

概念 描述
helm 是一个命令行工具,用于本地开发及管理chart,chart仓库管理等
Tiller(3.0之后它去掉了tiller,而直接与k8s通讯) 是 Helm 的服务端。Tiller 负责接收 Helm 的请求,与 k8s 的 apiserver 交互,根据chart 来生成一个 release 并管理 release
Chart 一个Helm包,其中包含了运行一个应用所需要的镜像、依赖和资源定义等,还可能包含Kubernetes集群中的服务定义,类似Homebrew中的formula、APT的dpkg或者Yum的rpm文件
Release 使用 helm install 命令在 Kubernetes 集群中部署的 Chart 称为 Releas。可以将这个Chart安装两次,并在每次安装中生成自己的Release以及Release名称
Repository Helm chart 的仓库,Helm 客户端通过 HTTP 协议来访问存储库中 chart 的索引文件和压缩包
Value Helm Chart的参数,用于配置Kubernetes对象
Template 使用Go模板语言生成Kubernetes对象的定义文件
Namespace Kubernetes中用于隔离资源的逻辑分区

1.3 Helm工作流程

以下是Helm的工作流程(注意:这里使用的是Helm的v3版本,该版本没有了tiller并并使用更加简单和灵活的架构,直接通过kubeconfig连接apiserver,简化安全模块,降低了用户的使用壁垒)

image.png-1161.3kB

如上图所示,Helm的工作流程总结如下:

  • 开发者首先创建并编辑chart的配置;
  • 接着打包并发布至Helm的仓库(Repository);
  • 当管理员使用helm命令安装时,相关的依赖会从仓库下载;
  • 接着helm会根据下载的配置部署资源至k8s;

2、安装部署

2.1 环境准备

在此之前,请先确保环境中已经部署 Kubernetes 集群

主机名称 物理IP 服务器版本 k8s版本 Helm 版本
master 172.16.20.10 Centos7.9 v1.31 v3.16.2
worker 172.16.20.11 Centos7.9 v1.31 v3.16.2

2.2 快速安装

# 通过脚本安装
[root@master ~]# curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash

# 查看版本
[root@master ~]# helm version
version.BuildInfo{Version:"v3.16.2", GitCommit:"13654a52f7c70a143b1dd51416d633e1071faffb", GitTreeState:"clean", GoVersion:"go1.22.7"}

2.3 仓库

Helm 3 不再附带一个默认的 chart 仓库

# 添加仓库
[root@master ~]# helm repo add bitnami https://charts.bitnami.com/bitnami

# 查看仓库列表
[root@master ~]# helm repo ls
NAME   	URL                               
bitnami	https://charts.bitnami.com/bitnami

# 查看可以被安装的charts列表
[root@master ~]# helm search repo bitnami
NAME                                        	CHART VERSION	APP VERSION  	DESCRIPTION                                       
bitnami/airflow                             	20.0.0       	2.10.2       	Apache Airflow is a tool to express and execute...
bitnami/apache                              	11.2.21      	2.4.62       	Apache HTTP Server is an open-source HTTP serve...
...

# 更新charts列表
[root@master ~]# helm repo update

使用 helm repo remove 命令来移除仓库

3、常用命令

3.1 常用命令简介

常用命令 描述
helm create 创建Chart示例
helm install 部署
helm status 状态
helm ls 列出已经部署的 Release
helm upgrade 更新
helm rollback 回滚
helm delete 移除
helm uninstall 卸载
helm repo update 更新charts列表

3.2 创建Chart示例

# 创建Chart示例
[root@master ~]# helm create myapp

[root@master ~]# tree myapp/
myapp/
├── charts
├── Chart.yaml
├── templates
│   ├── deployment.yaml
│   ├── _helpers.tpl
│   ├── hpa.yaml
│   ├── ingress.yaml
│   ├── NOTES.txt
│   ├── serviceaccount.yaml
│   ├── service.yaml
│   └── tests
│       └── test-connection.yaml
└── values.yaml
  • 如果你查看一下mychart/templates/目录,你会注意到那里已经有一些文件了。
    • charts:目录里存放这个chart依赖的所有子chart。
    • Chart.yaml:用于描述这个 Chart的基本信息,包括名字、描述信息以及版本等。#只用于描述。
    • values.yaml :用于存储 templates 目录中模板文件中用到变量的值。
    • templates: 目录里面存放所有yaml模板文件。#deployment.yaml service.yaml ingress.yaml等
    • NOTES.txt :用于介绍Chart帮助信息, helm install 部署后展示给用户。例如:如何使用这个 Chart、列出缺省的设置等。
    • _helpers.tpl:放置模板的地方,可以在整个chart中重复使用。

3.3 安装Chart示例

# 安装Chart示例
[root@master ~]# helm install mywordpress bitnami/wordpress

# 查询这个chart的基本信息
[root@master ~]# helm show chart bitnami/wordpress
annotations:
  category: CMS
  images: |
    - name: apache-exporter
      image: docker.io/bitnami/apache-exporter:1.0.9-debian-12-r3
    - name: os-shell
      image: docker.io/bitnami/os-shell:12-debian-12-r32
    - name: wordpress
      image: docker.io/bitnami/wordpress:6.6.2-debian-12-r19
  licenses: Apache-2.0
apiVersion: v2
appVersion: 6.6.2
...
# 查看发布版本
[root@master ~]# helm ls
NAME       	NAMESPACE	REVISION	UPDATED                                	STATUS  	CHART            	APP VERSION
mywordpress	default  	1       	2024-11-12 17:34:32.660117686 +0800 CST	deployed	wordpress-23.1.29	6.6.2 

# 查看该版本的信息
[root@master ~]# helm status mywordpress
NAME: mywordpress
LAST DEPLOYED: Tue Nov 12 17:34:32 2024
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
CHART NAME: wordpress
CHART VERSION: 23.1.29
APP VERSION: 6.6.2
...
  • 每当执行 helm install 的时候,都会创建一个新的发布版本。 所以一个chart在同一个集群里面可以被安装多次,每一个都可以被独立的管理和升级

3.4 安装前自定义 chart

# 使用 helm show values 可以查看 chart 中的可配置选项

[root@master ~]# helm show values bitnami/wordpress
...
global:
  imageRegistry: ""
  ## E.g.
  ## imagePullSecrets:
  ##   - myRegistryKeySecretName
  ##
...
# 然后,你可以使用 YAML 格式的文件覆盖上述任意配置项,并在安装过程中使用该文件
[root@master ~]# echo '{mariadb.auth.database: user0db, mariadb.auth.username: user0}' > values.yaml

[root@master ~]# helm install mywordpress-2 -f values.yaml bitnami/wordpress

# 查看发布版本
[root@master ~]# helm ls | grep mywordpress-2
mywordpress-2	default  	1       	2024-11-12 17:36:07.573493833 +0800 CST	deployed	wordpress-23.1.29	6.6.2   
  • 安装过程中有两种方式传递配置数据:
    • --values (或 -f):使用 YAML 文件覆盖配置。可以指定多次,优先使用最右边的文件。
    • --set:通过命令行的方式对指定项进行覆盖。

如果同时使用两种方式,则 --set 中的值会被合并到 --values 中,但是 --set 中的值优先级更高。在 --set 中覆盖的内容会被被保存在 ConfigMap 中。可以通过 helm get values 来查看指定 release 中 --set 设置的值。也可以通过运行 helm upgrade 并指定 --reset-values 字段来清除 --set 中设置的值

[root@master ~]# helm get values mywordpress-2
USER-SUPPLIED VALUES:
mariadb.auth.database: user0db
mariadb.auth.username: user0

3.5 更新

当你想升级到 chart 的新版本,或是修改 release 的配置,你可以使用 helm upgrade 命令

# 修改配置
[root@master ~]# echo '{mariadb.auth.database: user1db, mariadb.auth.username: user1}' > values.yaml

# 更新
[root@master ~]# helm upgrade -f values.yaml mywordpress-2 bitnami/wordpress

# 查看新修改的配置是否生效
[root@master ~]# helm get values mywordpress-2
USER-SUPPLIED VALUES:
mariadb.auth.database: user1db
mariadb.auth.username: user1

3.6 回滚

现在,假如在一次发布过程中,发生了不符合预期的事情,也很容易通过 helm rollback [RELEASE] [REVISION] 命令回滚到之前的发布版本

# 查看历史版本号
[root@master ~]# helm history mywordpress-2
REVISION	UPDATED                 	STATUS    	CHART            	APP VERSION	DESCRIPTION     
1       	Tue Nov 12 17:36:07 2024	superseded	wordpress-23.1.29	6.6.2      	Install complete
2       	Tue Nov 12 17:39:49 2024	deployed  	wordpress-23.1.29	6.6.2      	Upgrade complete

# 回滚到指定的版本
[root@master ~]# helm rollback mywordpress-2 1

# 查看配置信息
[root@master ~]# helm get values mywordpress-2
USER-SUPPLIED VALUES:
mariadb.auth.database: user0db
mariadb.auth.username: user0

3.7 卸载一个版本

# 卸载一个版本
[root@master ~]# helm uninstall mywordpress

# 如果卸载一个版本时候提供 `--keep-history` 选项, Helm将会保存版本历史
[root@master ~]# helm uninstall mywordpress-2 --keep-history

[root@master ~]# helm history mywordpress-2
REVISION	UPDATED                 	STATUS     	CHART            	APP VERSION	DESCRIPTION            
1       	Tue Nov 12 17:36:07 2024	superseded 	wordpress-23.1.29	6.6.2      	Install complete       
2       	Tue Nov 12 17:39:49 2024	superseded 	wordpress-23.1.29	6.6.2      	Upgrade complete       
3       	Tue Nov 12 17:42:51 2024	uninstalled	wordpress-23.1.29	6.6.2      	Uninstallation complete

# 但是下次创建新的版本不能与此名字重复,除非不加`--keep-history`彻底删除