如果你一直在寻找一个工具来将你的应用程序部署到Kubernetes集群上,你肯定已经遇到过Helm这个工具。它是目前使用最广泛的Kubernetes配置管理工具之一。
Helm 是 Kubernetes 的包管理器。这意味着你可以将你的部署、服务、ingress 等所有 Kubernetes 资源组件组合成有意义的单位。这意味着软件供应商(例如 Grafana)可以创建一个 Helm 图表,所有用户都可以用一条命令安装 成千上万个 资源,并且确保一切正常工作。
我觉得Helm有些地方特别好,但有些地方却常常被误用,引入了复杂性,其实没有多大好处。
如果你的 Kubernetes 集群中存在正在运行的 Helm 释放,这篇内容绝对适合你。
支持我们吧 🙏
我们都知道Kubernetes可能有点棘手。这就是我们开发Cyclops的原因,一个构建在Kubernetes上的开源开发者平台框架。通过一个可自定义的UI来简化Kubernetes的复杂性,从而满足您的需求,部署和管理您的应用程序。
我们正在开发Cyclops作为一个开源项目。如果你有兴趣尝试一下,这里有一个快速入门指南,可以在我们的代码库中查看。如果你喜欢它,不妨给它点个赞 ⭐ 来表示支持。
⭐ GitHub上的Cyclops星 ⭐
部署到 Kubernetes 集群的应用程序通常不仅仅是一个 Deployment,还包括其他类型的 Kubernetes 资源,比如 Configmaps、Secrets、Ingress 等等。这样就不用一次次手动创建这些资源了,你可以创建一个 Helm 图表,在一个地方定义所有的这些资源,然后在需要的时候就可以复制或重新创建这些资源了。
一个 Helm chart
是一个 Helm 包。Grafana 有一个 Helm chart,它定义了运行所需的全部资源,MySQL 也有一个自己的 chart,等等。
如果你想在你的集群中运行 MySQL,你可以简单地将这个 chart 安装到你的集群中,无需担心具体的资源分配。通过这次安装,你实际上创建了一个 Helm release
,这些 release 会跟踪在集群中安装的内容,这样你稍后就可以检查你都安装了哪些 Helm charts。
在 Helm 图表里,Kubernetes 资源以模板形式被定义,允许用户无需深入了解每个资源即可对其进行自定义。你可以通过包含配置信息的 values 文件来自定义你的发布,这些配置信息会被注入到资源模板里,从而生成 Kubernetes 清单文件。而这里就是 Helm 问题开始的地方。
不足我喜欢Helm的包管理方式,但有些地方我不是很感冒。
YAML 的配置文件
Helm的模板引擎在抽象和重用配置信息方面表现出色。每次遇到一个新的Helm图表,你都需要花一些时间来弄清楚哪些可以配置,哪些不能配置。
values.yaml
通常是个不错的起点,因为在那儿你可以找到默认设置。不是所有的配置都必须写在 values.yaml
中,你还需要查阅文档(如果有的话),或者更可怕的是,还得去 Helm 模板里看看配置项和模板之间是怎么关联的。
这里没有类型安全,你很容易在配置中拼错字,导致系统故障。
配置持久性
当你安装一个Helm发行版时,Helm默认会使用values.yaml
文件中的值。你可以在运行helm install
时通过--set
标志从文件中注入任何值,或者直接在命令中设置,但这就会引出一个问题:实际部署了哪些内容。每次你想要升级Helm发行版时,都需要确切地知道当前部署了哪些内容,以防止意外覆盖某些配置。
例如,你和你的同事正在同一个应用上工作,该应用部署为Helm发行。你的同事希望将副本数量设定为5。
上述命令会更新名为my-release的Helm release,并将副本数量设置为5。这通常用于调整部署的规模。运行此命令来更新helm图表,设置副本数量为5:
helm upgrade my-release <helm repo> --set replicas=5
全屏模式 退出
然后,你可以将应用程序的版本更新为 latest
,可以运行下面的命令:
执行以下命令来更新名为my-release的helm部署:helm upgrade my-release <helm repo> --set image.tag=latest
全屏模式,按一下退出全屏
你部署了一个新版本,但无意中覆盖了同事的代码更改,现在你只剩下单一副本。除非你检查当前已部署的值,否则你无法确定是否覆盖了别人的东西(甚至是你一个月前自己的改动)。
资源简介
安装了一个版本后,你可能会想要检查部署的资源,并确认它们是否正常运行。Helm 提供了 helm status
命令,可以列出所有资源,提供了这样的功能。
这更多是一种个人习惯,但我发现用 helm
命令列出来的部署资源,然后再用 kubectl
查看这些资源,感觉有点奇怪。理想情况下,我希望能从一个统一的界面中查看我的资源。
Cyclops 原生支持 Helm 图表,并能够进行部署。它解决了这些常见问题,并为你所有 Helm 图表提供了自定义界面。
与其通过 YAML 配置 Helm 图表,Cyclops 会基于 Helm 图表的值为你生成一个 UI。现在你可以通过表单来配置应用,你可以看到所有可配置的字段,并且提供的值都会被验证。
相反,Cyclops 不依赖 Helm 发布,而是实现自己的自定义的 Kubernetes 资源,称为模块(Modules),这些自定义资源引用 Helm 图表并保持所有值的持久性。
从版本 v0.17.0
开始,Cyclops 允许你以非侵入性的方式将现有的 Helm 发布版本迁移到 Cyclops 模块化应用。它将仅为你应用创建一个新的模块化应用,并不再删除或重新部署你的应用。
迁移到Cyclops(平台)
独眼巨人可以自动检测你当前在集群中运行的所有Helm发布的资源,并支持你将它们迁移到独眼巨人模块
。独眼巨人模块是一种自定义的Kubernetes资源类型,该资源引用一个Helm图表并包含配置该图表所需的所有值。
用这种方法,你不必担心需要使用哪些值文件,它们如何重叠。相反,一切都明确定义在同一个位置。如果你想更改任何值,可以通过 YAML 模块文件、Cyclops 界面,或任何你喜欢的其他方式。
咱们把这些发布迁移一下吧!
安装Cyclops插件
首先,你需要用下面的命令安装Cyclops到正在运行的Kubernetes集群中。
# 下面的命令用于应用cyclops安装文件和演示模板文件
kubectl apply -f https://raw.githubusercontent.com/cyclops-ui/cyclops/v0.17.1/install/cyclops-install.yaml && kubectl apply -f https://raw.githubusercontent.com/cyclops-ui/cyclops/v0.17.1/install/demo-templates.yaml
全屏/退出全屏
要访问cyclops-ui(一个界面),你可以直接将其服务通过端口转发,但在实际生产中,你可以通过 ingress 或通过负载均衡器将其暴露。
kubectl port-forward svc/cyclops-ui -n cyclops 3000:3000
将本地端口3000转发到cyclops-ui服务的3000端口
点击进入全屏模式 点击退出全屏模式
你现在可以在这里访问 Cyclops,网址是 "http://localhost:3000/"
。
迁移 Helm 发布包
为了教程的需要,我安装了三个Helm图表(Helm chart)。如果你没有安装任何Helm发行(release)来尝试迁移过程,你可以用下面的命令安装官方的PostgreSQL图表(chart):
运行以下命令来安装数据库:
helm (命令管理工具) install my-api-database oci://registry-1.docker.io/bitnamicharts/postgresql
该命令使用 Helm 工具从 Docker 注册表安装名为 my-api-database 的 PostgreSQL 数据库。
点击全屏 点击退出全屏
打开Cyclops后,你可以在侧边栏中找到Helm releases
,查看当前部署在你集群中的应用。
从那里,你可以选择任何 Helm 发布的版本,并检查该特定发布部署的 Kubernetes 资源。
当你准备迁移你的发布并使用Cyclops模块时,点击迁移到Cyclops模块
,这将打开一个弹出窗口,在其中输入Helm图表的引用。在这种情况下,您需要输入Bitnami的git仓库及其PostgreSQL图表(位于main
分支)。
图表引用也可以是Helm仓库或符合OCI规范的Helm图表。
点击图片查看
一旦你确认了图表参考,Cyclops会拉取并验证这个参考,如果参考有效的话,会带你到一个可以调整配置的页面,然后你就可以迁移到一个 Cyclops 模块。
别担心,Cyclops会保留你之前设定的Helm release的配置;这一步仅在需要时允许你修改。
一旦你满意了配置,你可以点击部署
按钮,Cyclops会用你的模板和输入的所有值创建新模块。
所有之前部署的资源都将保持不变,没有资源会在过程中被销毁。 唯一的不同就是现在有模块在帮你管理资源了。
有了 Cyclops,现在你可以统一管理应用配置,并在一个地方查看所有资源的状态。你和你的同事也不会再互相打扰了!
未来的计划我们 Cyclops 计划扩展支持范围,不仅限于 Helm,还想让我们的 Modules 支持任何配置语言。告诉我们您正在使用哪些工具(例如 Kustomize、KPT、Cue 等),我们很乐意支持您正在使用的工具!
如果你喜欢这篇文章或觉得它有帮助,加入我们的 Discord 服务器(点击这里: join our Discord server),你可以在那里获得最新的内容、团队动态以及新闻!
⭐ GitHub上的Cyclops星 ⭐