Helm系列之初见

发布时间 2023-07-01 14:34:52作者: coreylin

初见

什么是 Helm

Helm 是一个开源的 Kubernetes 包管理器和应用程序部署工具

它允许你以声明性的方式定义、安装、升级和卸载 Kubernetes 应用程序。Helm 使用称为 "chart" 的打包格式来组织和管理应用程序的配置和资源。

一个 Helm chart 是一个预定义的目录结构,其中包含了应用程序的所有部署所需的 Kubernetes 资源文件和配置参数。通过使用 Helm,你可以轻松地共享和重用 Helm chart,从而加快应用程序的部署和管理过程。

Helm 还支持版本管理、依赖管理和回滚等功能,使得应用程序的部署和维护更加方便和可靠。通过 Helm,你可以快速部署复杂的应用程序,同时还可以轻松地管理应用程序的多个实例和不同环境之间的配置差异。

总而言之,Helm 是一个强大的工具,它简化了在 Kubernetes 上部署和管理应用程序的过程,提供了更高效、更可靠的方式来管理应用程序的配置和资源。

为什么需要 Helm

Kubernetes (k8s) 是一个强大的容器编排平台,它提供了丰富的功能来管理和部署容器化应用程序。然而,使用原生的 Kubernetes 配置文件来定义和管理复杂的应用程序部署可以变得繁琐和复杂。这时候,Helm 成为了一个有用的工具,它为 Kubernetes 提供了以下几个重要的优势:

1. 简化部署和管理:Helm 提供了一个标准化的打包和发布模型,使得应用程序的部署和管理更加简单和一致。通过使用 Helm,你可以将应用程序的配置和资源组织成一个统一的 Helm chart,从而简化了复杂应用程序的部署和管理过程。

2. 重用和共享:Helm 支持 Helm chart 的共享和重用,这意味着你可以使用其他人已经创建好的 Helm chart 来部署常见的应用程序,如数据库、消息队列等。这样可以节省时间和精力,同时也可以从社区中获得可靠和经过验证的部署模板。

3. 版本管理和回滚:Helm 具备强大的版本管理功能,你可以轻松地升级和回滚应用程序的不同版本。这对于进行灰度部署、测试不同版本或者应对问题回滚是非常有用的。通过 Helm,你可以更加灵活和可靠地管理应用程序的版本控制。

4. 依赖管理:Helm 允许你定义和管理应用程序的依赖关系,这样可以确保应用程序所需的其他服务和组件能够正确地被部署和配置。这对于复杂的应用程序和微服务架构非常重要,可以简化依赖的管理和部署流程。

综上所述,Helm 提供了一种简化、标准化和可重复使用的方式来管理和部署 Kubernetes 应用程序。它简化了复杂应用程序的部署过程,提供了版本管理和回滚的能力,并促进了应用程序的共享和重用。因此,Helm 成为了 Kubernetes 生态系统中非常重要和广泛使用的工具。

一些案例对比


通过使用 Helm,你可以简化在 Kubernetes 上部署和管理复杂应用程序的过程。Helm 提供了一个标准化的打包和发布模型,使得部署应用程序变得更加简单、一致和可重复使用。如下是一些使用 k8s 和 helm 部署应用的案例

1. 数据库部署:
- Kubernetes 操作:
  - 创建一个命名空间(Namespace)用于部署数据库。可以使用命令 kubectl create namespace <namespace-name> 创建命名空间。
  - 创建一个持久化存储卷(Persistent Volume)和持久化存储卷声明(Persistent Volume Claim),用于存储数据库的数据。可以使用 Kubernetes 的存储类(Storage Class)来创建这些资源。
  - 创建一个 Secret,用于存储数据库的敏感信息,例如用户名和密码。可以使用命令 kubectl create secret generic <secret-name> --from-literal=<key>=<value> 来创建 Secret。
  - 创建一个 ConfigMap,用于存储数据库的配置信息。可以使用命令 kubectl create configmap <configmap-name> --from-file=<config-file-path> 来创建 ConfigMap。
  - 创建一个 Deployment,用于部署数据库的实例。在 Deployment 的配置文件中,需要指定容器镜像、端口号、环境变量、挂载持久化存储卷、挂载 Secret 和 ConfigMap 等信息。
  - 创建一个 Service,用于将外部请求路由到数据库的实例。在 Service 的配置文件中,需要指定端口号、选择器等信息。

- Helm 操作:
  - 执行命令 `helm install my-database bitnami/mysql -n my-namespace --set mysqlUser=admin,mysqlPassword=passw0rd` 使用 MySQL Helm Chart 安装 MySQL 数据库。

1. 消息队列部署:

- Kubernetes 操作:
  - 创建一个命名空间(Namespace)用于部署消息队列。可以使用命令 kubectl create namespace <namespace-name> 创建命名空间。
  - 创建一个持久化存储卷(Persistent Volume)和持久化存储卷声明(Persistent Volume Claim),用于存储消息队列的数据。可以使用 Kubernetes 的存储类(Storage Class)来创建这些资源。
  - 创建一个 ConfigMap,用于存储消息队列的配置信息。可以使用命令 kubectl create configmap <configmap-name> --from-file=<config-file-path> 来创建 ConfigMap。
  - 创建一个 Deployment,用于部署消息队列的实例。在 Deployment 的配置文件中,需要指定容器镜像、端口号、环境变量等信息。可以使用命令 kubectl create -f <deployment-config-file> 创建 Deployment。
  - 创建一个 Service,用于将外部请求路由到消息队列的实例。在 Service 的配置文件中,需要指定端口号、选择器等信息。可以使用命令 kubectl create -f <service-config-file> 创建 Service。

- Helm 操作:
  - 执行命令 `helm install my-rabbitmq rabbitmq/rabbitmq -n my-namespace --set rabbitmqUsername=admin,rabbitmqPassword=passw0rd` 使用 RabbitMQ Helm Chart 安装 RabbitMQ。

点评:

k8s 的关键概念是资源,所有的操作都是基于资源,而通过对资源进行筛选,拼装,形成最终的一个可以发布的应用。而 Helm 则是已经拼装好的“蓝图”,可以直接依据这个蓝图,快速生成一个应用。

以乐高类比的话,k8s 的每一种资源可以理解成乐高中的基础颗粒,那么 k8s 构建应用的方式,就是自己根据基础颗粒搭建积木,而 helm 则更像是根据已有的模板自动拼装起来(有点类似王国之泪的蓝图功能),快速,准确且可复制。

另一个形象的例子,可以把 k8s 中的资源理解成是各种不同的食材和调料,那么 k8s 则是自己根据这些食材进行烹饪,做成饭菜,而 helm 则更像是做好的预制菜,食材,调料等都按照配方预先处理好,只需要加水,加热,就可以做出饭菜。

Helm Chart 这个名字的由来

Helm 这个名字的由来是因为 Helm 工具的设计灵感来源于航海中使用的船舵(Helm)。船舵是船舶上的一个关键部件,用于控制船的方向。类似地,Helm 工具旨在为 Kubernetes 的应用程序提供一个集中的控制和管理机制(如部署,升级,回滚等操作)。因此,Helm 这个名字被选为该工具的名称,以强调其作为 Kubernetes 包管理工具的关键作用和功能,为用户提供一个方便、集中和可靠的方式来管理和控制他们的应用程序。

Chart 可以看作是应用程序的"图表"或"蓝图",描述了如何将应用程序部署到 Kubernetes 环境中。类似于软件开发中的设计图纸或蓝图,Chart 提供了一种标准化的方式来组织和管理应用程序的配置和依赖关系。