文档
容器开发

🐳 在容器中开发 Pluto 应用

我们提供了一组用于开发 Pluto 应用的容器镜像,镜像中包含了 AWS CLI、Pulumi、Pluto 等基础依赖,并配置了 Node.js 20.x 和 Python 3.10 环境,你可以根据需求选择合适的镜像。

镜像Node.jsPythonk3d
plutolang/pluto:latest20.x3.10
plutolang/pluto:latest-typescript20.x
plutolang/pluto:latest-k3d20.x3.10

接下来,我们以在 K3s、AWS 为例,演示如何在容器中开发 Pluto 应用。

创建容器

首先,执行以下命令来创建一个 Pluto 应用开发容器:

docker run -it --privileged \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -v /lib/modules:/lib/modules \
    --name pluto-k3d \
    plutolang/pluto:latest-k3d bash

创建完成后,会自动进入容器。在容器中,我们执行下面这条命令来自动创建一个 k3s 集群,并安装 Knative,最后一个参数为集群名称,可以修改成其他名称:

bash /scripts/create-cluster.sh pluto-cluster

上一条命令执行结束后,执行以下命令应该可以看到 k3s 集群中的节点:

kubectl get nodes
💡

请确保你的容器有足够的存储空间,否则可能会导致 Kubernetes Pod 无法正常启动。你可以通过执行 df -h 命令,查看当前容器的存储空间使用情况。

开发应用

执行下面这条命令可以交互式地创建一个 Pluto 应用,在过程中你可以配置应用名称、编程语言、目标平台等信息,创建结束后会在当前目录以应用名称创建一个目录:

pluto new
💡

K3s 环境暂时仅支持 TypeScript 应用。

使用 cd project_name 命令进入项目目录,进入后可以看到已经配置有基本的项目结构,接下来我们执行下面的命令来安装依赖,不同编程语言的安装方式稍用不同:

npm install
pip install -r ./requirements.txt

安装完依赖后,你就可以根据自己的需求修改 app/main.py 文件,完成应用开发。当然,你也可以直接部署示例应用来体验 Pluto 的使用。

配置环境

应用开发完成后,我们还需要对访问凭证、镜像仓库等环境信息进行配置,以便后续能够正常部署应用。

在部署时,Pluto 会将应用中包含的若干个函数分别打包成容器镜像,并上传到指定镜像仓库中。在前面的集群创建过程中,执行脚本自动创建了一个本地的镜像仓库,仓库名称由集群名称加上 -registry 组成,端口为 5432,例如 pluto-cluster-registry:5432

接下来,我们将镜像仓库地址填写到 Pluto 的配置文件中。我们打开项目目录下的 .pluto/pluto.yml 配置文件,找到你创建的 stack,默认是 dev,修改其中的 configs 字段,将镜像仓库地址填写进去,填写方式如下:

...
stacks:
  - name: dev
    configs:
      kubernetes:registry: pluto-cluster-registry:5432
      kubernetes:platform: auto
...

如果你希望上传至公开镜像仓库,仍需要对镜像仓库地址进行配置。Pluto 构建的容器镜像名称由这几部分构成:<registry>/<formatted_project_name>:<function_id>-<timestamp>。因此,你需要先在 Docker Hub 等平台上创建以项目名称命名的镜像仓库,然后采用相同的方式将镜像仓库地址配置到 Pluto 配置文件中。注意,为了避免违法字符,我们在上传镜像时会将项目名称格式化为小写字母和短横线的组合,你可以在下方输入项目名称,获取格式化的结果,并以此创建镜像仓库:

项目名称:

格式化结果:

默认情况下, Pluto 打包镜像的目标平台是 linux/amd64 架构。如果你的 K8s 集群是其他架构,则需要在 Pluto 配置文件中配置 kubernetes:platform 字段,可选项有 linux/amd64linux/arm64auto,其中 auto 会根据当前设备架构自动选择。

部署

在配置完环境信息后,我们就可以执行下面这条命令来部署 Pluto 应用了:

pluto deploy

这条命令可能会执行一段时间,取决于你的应用规模和网络环境。执行完成后,你可以从输出中看到应用的访问地址。你可以从部署细节中了解 Pluto 具体部署了哪些资源。

测试

在 K3s 集群中,我们可以通过 kubectl port-forward 命令将服务暴露到本地,然后通过 curl 命令来测试服务是否正常。你可以使用下面这条命令在后台执行 kubectl port-forward 命令,也可以选择再打开一个终端窗口执行:

nohup kubectl port-forward --namespace=ingress-nginx service/ingress-nginx-controller 8080:80 > /dev/null 2>&1 &

然后,我们可以通过先后执行以下两条命令来测试服务是否正常,其中 hello-pluto-dev-plutolang-pluto-router-router.localdev.me 是 Pluto 部署结束时输出的访问地址,如果你的 Pluto 应用名称不是 hello-pluto,则需要将其完整替换为你获取到的访问地址:

curl --resolve hello-pluto-dev-plutolang-pluto-router-router.localdev.me:8080:127.0.0.1 \
	http://hello-pluto-dev-plutolang-pluto-router-router.localdev.me:8080/hello
 
curl --resolve hello-pluto-dev-plutolang-pluto-router-router.localdev.me:8080:127.0.0.1 \
	http://hello-pluto-dev-plutolang-pluto-router-router.localdev.me:8080/store

部署成功的话,你应该可以看到类似下面的输出:

K3s 测试结果

如果你在测试时遇到错误,你可以通过 kubectl get pods -A 命令查看所有 Pod 的状态,其中,带有 svclb- 前缀的 Pod 可以处于 Pending 状态,其他所有非 Job 类 Pod 都应该已经正常启动。如果你的集群不是这样,请等待 Pod 启动完成后再进行测试。可能需要重新部署 Pluto 应用。

清理

执行下面这条命令可以将 Pluto 应用从 k3s 集群中下线:

pluto destroy

如果你希望删除 k3s 集群,可以执行以下命令,集群名称需要修改为你的集群名称:

k3d cluster delete pluto-cluster

如果你想销毁开发环境,可以在宿主机执行以下命令:

docker stop pluto-k3d
docker rm pluto-k3d
💡
  1. 如果你希望将应用同时部署到多个平台上,可以参考多平台部署文档。
  2. 如果你想了解更多 Pluto 应用示例,可以查看案例文档。

部署细节

Pluto 将从应用代码中推导出需要 1 个路由、1 个消息队列、1 个 KV 数据库和 3 个函数对象,然后,Pluto 将自动地在你指定的云平台上创建相应的资源实例,并配置好它们之间的依赖关系。

在 Kubernetes 中,将会配置 1 个 Ingress、2 个 Redis 和 3 个 Knative Service。