Acorn,用于 Kubernetes 的轻量级、可移植的 PaaS

Acorn 是 Rancher 创始人推出的一个新的应用程序部署框架,它非常接近我对运行在 Kubernetes 上的开发环境的期望。

长期以来,我一直主张用一种简化的方法来开发和部署以 Kubernetes 为目标的应用程序。我之前强调需要一个可移植的、透明的、开源的应用程序层,该应用程序层将始终部署在开发人员笔记本电脑中的 Minikube 集群或在公共云中配置的大型多节点集群内运行。

作为高人气的 Kubernetes 发行版 K3s 的缔造者 Darren Shepherd 及其团队的开发成果,Acorn 从 Rancher 身上继承了不少颇受云原生社区好评的设计原则。这是一套开源、简单、轻量化且可移植的框架,用于在 Kubernetes 上部署和扩展微服务。

使用 Acorn 的开发人员和运维人员无需了解 Kubernetes 的具体细节。如果他们了解 Volumes、Secrets、ConfigMaps 和 Ingress 等内部结构,那将非常棒。Acorn 用自己的类 JSON 领域特定语言(DSL)抽象了 Kubernetes 的复杂性,以描述基于微服务设计模式的现代应用程序。

像 Cloud Foundry 这样的 PaaS 的目标是将代码推送到运行时并使用 URL。Acorn 正是专注于接受源代码或容器镜像并发布端点的工作流程。在后台,它完成了与 Kubernetes API 协商以创建资源和连接它们所需的管道的繁重工作。

尽管 Amazon Web Services 的 App RunnerAzure Container AppsGoogle Cloud Run 等努力为部署容器化工作负载带来类似 PaaS 的体验,但它们仅限于公有云环境并且不可移植。Acorn 是少数几个可以从开发人员笔记本电脑上运行的 Kind 集群无缝扩展到云中的多节点集群的框架之一。

本文将分析 Acorn 的架构,并深入了解 Acorn 部署如何转换为 Kubernetes 对象。

让我们详细了解一下。

在 Minikube 中设置环境

在 Mac 上安装 Minikube 并在其上启用 Nginx Ingress。Ingress 是 Acorn 最重要的先决条件之一。

minikube addons enable ingress

使用 Homebrew 安装 Acorn CLI,并检查其版本以确保已安装。

brew install acorn-io/cli/acorn

我们现在准备在 Minikube 中安装 Acorn。运行 acorn init 以配置 Minikube。

在 Kubernetes 集群中安装 Acorn 会创建一组资源来处理应用程序的构建时间和运行时要求。让我们从 namespaces 开始。

acorn-system namespaces 包含 API 和控制器,它们是运行时环境的组件。在开发环境中运行时,相同的 namespaces 可以选择运行镜像构建器和镜像注册表。另一个 namespaces acorn 是为应用程序保留的,我们将在下一节中探讨。

安装程序仅在集群中创建一个自定义资源定义(CRD)。CRD AppInstance.internal.acorn.io 映射到集群内运行的 Acorn 应用程序上。

Acorn API 服务器通过聚合与 Kubernetes API 服务器关联。Acorn CLI 与 API 服务器 api.acorn.io 对话。由于 Acorn 利用 Kubernetes API 聚合,CLI 只需要 Acorn API 组的 RBAC 权限。

API 服务器将入站请求传递给 Acorn 控制器,该控制器将应用程序定义转换为适当的 Kubernetes 资源,例如 Deployments、ConfigMaps、Secrets 和 Volumes。控制器负责通过创建和终止下游 Kubernetes 资源来管理 Acorn 应用程序的生命周期。

部署 Acorn 应用程序

让我们从基于 Nginx 镜像的单个 Web 服务器创建最简单的 Acorn 应用程序开始。

在一个空目录中创建一个 Acornfile 包含以下内容的目录:

containers: {
 web: {
 image: "nginx"
 ports: {
 publish: "80/http"
 }
 }
}

该定义是不言自明的。我们基于 Docker 注册表中的 Nginx 镜像启动一个名为“web”的容器,并使其在端口 80 上可用。

使用以下命令运行 Acornfile:

acorn run  .

由于我们没有为应用程序提供名称,因此 Acorn 为应用程序指定了一个随机名称,即 proud-silence。

当我们调用 run 命令时,Acorn 创建了一个 OCI 清单并将其推送到在 namespace 内运行的内部注册表服务 acorn-system 上。也可以为这些 OCI 工件使用外部注册表。

让我们通过运行以下命令获取访问应用程序的 URL:

acorn apps

让我们访问 Web 服务器来测试应用程序。

curl  -H  "host: web.proud-silence.local.on-acorn.io"  `minikube ip`

现在,让我们看看这个简单的应用程序对我们的 Kubernetes 集群做了什么。

首先,我们注意到有一个新的 namespace 作为应用程序的边界。

让我们检查一下这个 namespace。正如预期的那样,app run 命令已经创建了一个 Kubernetes Deployment、ReplicaSet、Pod 和一个集群 IP 服务。

集群 IP 服务通过一个 Ingress 资源暴露给外界,我们稍后会探讨。

当我们检查 acorn namespace 时,我们会找到 CRD 的实例 AppInstance。

kubectl get appinstances -n acorn

重温 Ingress 的想法来暴露 Web 应用程序,让我们看看我们是否可以在应用程序 namespace 中找到一个 Ingress 资源。

kubectl get ingress  -n  proud-silence-f6db18f8-c38

每个“发布”端口的 Acorn 应用程序都会在 Kubernetes 中创建一个关联的入口对象。

由于应用程序按预期运行,它现在可以被标记并推送到外部注册表。管理工作负载的运营团队可以将其部署到生产集群,而无需了解应用程序的内部结构。

Acorn 让我着迷的是它的简单性和便携性。它将 Kubernetes 视为部署、扩展和运行应用程序的理想运行时环境,无需任何假设。它不会篡改集群并部署最少的资源集,足以运行微服务。从某种意义上说,它是真正可移植的,当我们从开发集群上下文切换到另一个并部署应用程序时,它会被推送到生产集群。

Acorn 深受 Docker 的影响,并遵循一些通用的模式来运行多容器应用程序。与 Cloud Foundry 一样,它也支持绑定现有服务,例如部署在其他应用程序中的数据库和缓存。

一旦 Acorn 支持直接从包含 Acornfile 的 Git 存储库进行部署的能力,DevOps 就可以非常轻松地管理基于微服务的应用程序。

译自:https://thenewstack.io/acorn-a-lightweight-portable-paas-for-kubernetes/
译者:#公众号:进击云原生

本文由mdnice多平台发布

posted @ 2022-08-31 11:33  进击云原生  阅读(169)  评论(0编辑  收藏  举报