控制台 退出登录

Helm

一句话说明白helm的工作原理: values.local + values + templates 组成一堆yaml 然后apply吗

介绍

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 已经非常熟悉的情况下使用。

本文采用 CC BY-NC-SA 4.0 协议发布

相关文章

鹊桥计划

鹊桥计划

日志模板提取与 Drain 算法

日志模板提取与 Drain 算法

Thin Pool

Thin Pool

镜像层与可写层原理

镜像层与可写层原理