介绍

Helm 是一个用于管理 Kubernetes 应用的包管理工具。类似于操作系统中的包管理器(如 apt 或 yum),Helm 可以帮助你定义、安装和升级 Kubernetes 应用。Helm 通过使用称为 “Charts” 的打包格式来实现这一点。

Helm 是 Kubernetes 的一个包管理工具,它被设计用来帮助管理 Kubernetes 应用的生命周期。Helm 使用 Charts(图表)来封装运行在 Kubernetes 上的应用程序的定义信息。一个 Chart 包含了运行一个应用所需的所有 Kubernetes 资源定义,例如 Deployments、Services、ConfigMaps、Secrets 等。

主要功能包括:

1.应用打包:将 Kubernetes 应用程序及其所有依赖项打包成一个 Chart。

2.版本管理:管理应用的不同版本,方便回滚到之前的版本。

3.应用安装:一键部署复杂的 Kubernetes 应用,减少手动配置的繁琐。

4.配置管理:使用值文件(values.yaml)来管理应用配置,使得同一 Chart 可以在不同环境中使用不同的配置。

5.依赖管理:管理 Chart 之间的依赖关系,自动安装所需的依赖。

6.可重用性:通过共享 Charts,提高开发和运维效率。

使用 Helm 可以显著简化 Kubernetes 应用的部署和管理过程,特别是在需要部署和维护复杂的多组件应用时。

工作流程

使用 Helm 安装 MySQL 到 Kubernetes 集群是一个常见且方便的方式。下面是具体步骤:

  1. 安装 Helm

如果还没有安装 Helm,可以按照以下步骤安装 Helm。

对于 macOS 用户:

brew install helm

对于 Linux 用户:

curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash

  1. 添加 Helm 仓库

添加官方的 Helm 仓库以获取 MySQL Chart:

helm repo add bitnami https://charts.bitnami.com/bitnami

helm repo update

  1. 安装 MySQL

使用 Helm Chart 安装 MySQL:

helm install my-mysql bitnami/mysql

以上命令将会在默认的命名空间中安装 MySQL。如果你希望在特定命名空间中安装,可以使用 -n 选项:

kubectl create namespace my-database

helm install my-mysql bitnami/mysql -n my-database

  1. 配置 MySQL

可以通过创建一个 values.yaml 文件来自定义 MySQL 配置。例如,创建一个 my-values.yaml 文件:

auth:

rootPassword: my-root-password

database: my-database

username: my-user

password: my-password

然后使用以下命令安装 MySQL 并使用自定义配置:

helm install my-mysql bitnami/mysql -f my-values.yaml

  1. 验证安装

确认 MySQL Pod 已经运行:

kubectl get pods -l app.kubernetes.io/name=mysql

获取 MySQL 服务的详情:

kubectl get svc -l app.kubernetes.io/name=mysql

  1. 连接到 MySQL

可以使用 Kubernetes 的 Port Forwarding 功能连接到 MySQL:

kubectl port-forward svc/my-mysql 3306:3306

然后使用 MySQL 客户端连接:

mysql -h 127.0.0.1 -P 3306 -u my-user -p my-password my-database

通过以上步骤,你可以在 Kubernetes 集群中成功部署并连接到 MySQL 实例。

工作原理

Helm 本身是一个客户端工具,不需要安装在 Kubernetes 集群内部。它运行在用户的本地机器上,通过 Kubernetes API 服务器与集群进行通信来管理应用。

本质上 helm就是针对用户的输入 在本地修改文件 然后把用户的输入转换成特定的请求 去请求apiserver

是的,本质上 Helm 的确是这样工作的。以下是对这一过程的详细解释:

1. 用户输入和 Chart 模板

用户使用 Helm 提供的命令行工具(Helm CLI)来指定需要安装、升级、删除的应用。这些操作会涉及用户的输入,如 Chart 名称、配置参数等。

2. 渲染模板

Helm 将用户的输入与 Chart 中的模板结合,渲染成具体的 Kubernetes 资源定义。这个渲染过程主要利用了 Go 模板引擎:

values.yaml: 包含默认的配置值。

Chart.yaml: 定义了 Chart 的元数据。

templates/: 包含 Kubernetes 资源的模板文件(例如 Deployment、Service 等),这些模板会使用 values.yaml 中的值进行渲染。

例如,一个简单的 Deployment 模板可能如下所示:

\# templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
 name: {{ .Values.name }}
spec:
 replicas: {{ .Values.replicaCount }}
 selector:
  matchLabels:
   app: {{ .Values.name }}
 template:
  metadata:
   labels:
     app: {{ .Values.name }}
  spec:
   containers:
   \- name: {{ .Values.name }}
   image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"        ports:
    \- containerPort: {{ .Values.service.port }}

用户可以通过命令行覆盖这些值:

helm install my-release bitnami/mysql --set replicaCount=3 --set image.tag=5.7

3. 生成 Kubernetes 资源文件

Helm 将模板渲染成具体的 Kubernetes 资源文件(例如上面的 Deployment YAML 文件),这些文件是标准的 Kubernetes 资源定义文件。

4. 与 Kubernetes API Server 交互

Helm 使用 Kubernetes 客户端库与 Kubernetes API Server 交互,将渲染后的 Kubernetes 资源定义文件提交到集群中。

安装 Chart: Helm 将生成的资源文件通过 Kubernetes API 创建相应的资源(例如 Pod、Service 等)。

升级 Release: Helm 计算现有资源与新渲染资源之间的差异,通过 Kubernetes API Server 更新资源。

删除 Release: Helm 通过 Kubernetes API Server 删除与 Release 关联的资源。

5. 管理 Release

Helm 记录每个 Release 的状态和历史。可以查看、回滚或删除 Release。

工作流程总结

1.用户输入:用户通过 Helm CLI 提供输入(Chart 名称、配置参数等)。

2.模板渲染:Helm 将用户输入与 Chart 模板结合,渲染成 Kubernetes 资源定义文件。

3.API 调用:Helm 使用 Kubernetes 客户端库与 Kubernetes API Server 交互,将渲染后的资源定义文件提交到集群中。

4.管理和记录:Helm 记录每个 Release 的状态和历史,提供查看、升级、回滚和删除功能。

通过这种方式,Helm 简化了在 Kubernetes 上部署和管理应用的过程,将复杂的 Kubernetes 资源管理抽象为用户友好的命令行操作。

与deployment的区别

使用 Helm 和使用 Deployment 直接部署应用在 Kubernetes 中有一些显著的区别,主要体现在管理和配置的简便性、复用性以及扩展性上。下面是具体的区别:

1. 管理和配置的简便性

Helm 提供了一个更高层次的抽象,通过使用 Charts 来打包应用及其所有依赖项。它支持使用 values.yaml 文件进行配置,使得配置变得更简单且更具可维护性。

\# values.yaml
auth:
 rootPassword: my-root-password
 database: my-database
 username: my-user
 password: my-password

•只需一个命令就可以进行安装或升级应用

helm install my-mysql bitnami/mysql -f my-values.yaml

直接使用 Deployment 需要手动编写所有的 Kubernetes 资源文件(例如 Deployment、Service、ConfigMap、Secret 等)。这可能导致配置文件分散且难以管理,特别是对于复杂应用。

\# mysql-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
 name: mysql
spec:
 replicas: 1
 selector:
  matchLabels:
   app: mysql
 template:
  metadata:
   labels:
      app: mysql
  spec:
   containers:
   \- name: mysql
   image: mysql:5.7
   env:
  \- name: MYSQL_ROOT_PASSWORD
  value: my-root-password
  \- name: MYSQL_DATABASE
  value: my-database
  \- name: MYSQL_USER
  value: my-user
  \- name: MYSQL_PASSWORD
  value: my-password

•然后需要手动应用每个配置文件:

kubectl apply -f mysql-deployment.yaml

kubectl apply -f mysql-service.yaml

2. 版本管理

Helm:Helm 支持版本管理,可以方便地回滚到之前的版本。例如:

helm rollback my-mysql 1

Deployment:直接使用 Deployment 没有内置的版本管理功能,需要手动维护不同版本的配置文件。

3. 复用性

Helm Charts 可以很容易地在不同环境中复用。你可以通过修改 values.yaml 文件中的配置来适应不同的需求,而不需要修改 Chart 本身。

helm install my-mysql-prod bitnami/mysql -f values-prod.yaml

helm install my-mysql-dev bitnami/mysql -f values-dev.yaml

直接使用 Deployment 时,复用性较差。你可能需要为不同的环境维护不同的配置文件,增加了维护的复杂性。

4. 依赖管理

Helm 可以管理应用的依赖关系。如果你的应用依赖于其他服务或应用,Helm 可以自动处理这些依赖。例如,你的应用依赖于数据库和缓存服务,Helm 可以在安装时自动安装这些依赖项。

直接使用 Deployment 时,需要手动管理和部署所有的依赖项,增加了工作量和出错的可能性。

5. 社区支持

Helm 拥有一个庞大的社区,提供了大量的官方和第三方 Charts,可以方便地搜索和使用。这些 Charts 通常经过测试和验证,质量较高。

直接使用 Deployment 时,需要自己编写和维护所有的资源配置文件,缺乏现成的解决方案。

综上所述,使用 Helm 更适合管理和部署复杂的应用,尤其是在需要频繁更新、维护和复用的场景中。直接使用 Deployment 则更适合简单、单一的应用部署,或者在对 Kubernetes 已经非常熟悉的情况下使用。