
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 Runner、Azure Container Apps 和 Google Cloud Run 等努力为部署容器化工作负载带来类似 PaaS 的体验,但它们仅限于公有云环境并且不可移植。Acorn 是少数几个可以从开发人员笔记本电脑上运行的 Kind 集群无缝扩展到云中的多节点集群的框架之一。
本文将分析 Acorn 的架构,并深入了解 Acorn 部署如何转换为 Kubernetes 对象。
让我们详细了解一下。
在 Minikube 中设置环境
在 Mac 上安装 Minikube 并在其上启用 Nginx Ingress。Ingress 是 Acorn 最重要的先决条件之一。

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

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

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

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

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

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

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

部署 Acorn 应用程序
让我们从基于 Nginx 镜像的单个 Web 服务器创建最简单的 Acorn 应用程序开始。
在一个空目录中创建一个 Acornfile 包含以下内容的目录:
该定义是不言自明的。我们基于 Docker 注册表中的 Nginx 镜像启动一个名为“web”的容器,并使其在端口 80 上可用。
使用以下命令运行 Acornfile:

由于我们没有为应用程序提供名称,因此 Acorn 为应用程序指定了一个随机名称,即 proud-silence。
当我们调用 run 命令时,Acorn 创建了一个 OCI 清单并将其推送到在 namespace 内运行的内部注册表服务 acorn-system 上。也可以为这些 OCI 工件使用外部注册表。

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

让我们访问 Web 服务器来测试应用程序。
现在,让我们看看这个简单的应用程序对我们的 Kubernetes 集群做了什么。
首先,我们注意到有一个新的 namespace 作为应用程序的边界。

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

集群 IP 服务通过一个 Ingress 资源暴露给外界,我们稍后会探讨。
当我们检查 acorn namespace 时,我们会找到 CRD 的实例 AppInstance。

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

每个“发布”端口的 Acorn 应用程序都会在 Kubernetes 中创建一个关联的入口对象。
由于应用程序按预期运行,它现在可以被标记并推送到外部注册表。管理工作负载的运营团队可以将其部署到生产集群,而无需了解应用程序的内部结构。
Acorn 让我着迷的是它的简单性和便携性。它将 Kubernetes 视为部署、扩展和运行应用程序的理想运行时环境,无需任何假设。它不会篡改集群并部署最少的资源集,足以运行微服务。从某种意义上说,它是真正可移植的,当我们从开发集群上下文切换到另一个并部署应用程序时,它会被推送到生产集群。
Acorn 深受 Docker 的影响,并遵循一些通用的模式来运行多容器应用程序。与 Cloud Foundry 一样,它也支持绑定现有服务,例如部署在其他应用程序中的数据库和缓存。
一旦 Acorn 支持直接从包含 Acornfile 的 Git 存储库进行部署的能力,DevOps 就可以非常轻松地管理基于微服务的应用程序。
译自:https://thenewstack.io/acorn-a-lightweight-portable-paas-for-kubernetes/
译者:#公众号:进击云原生
















