💻 本地开发 Pluto 应用
前置
- Node.js (opens in a new tab): Pluto 运行在 Node.js 环境中,最好使用 20 版本以上。
- Python (opens in a new tab): 如果你想开发 Python 应用,需要安装 Python 环境,最好是 3.10 版本以上。
安装
Pluto 命令行工具可以使用 npm (opens in a new tab) 进行安装:
npm install -g @plutolang/cli
Pluto 的命令是 pluto
,可以通过以下命令验证是否安装成功:
pluto --help
创建应用
首先,运行以下命令创建一个 Pluto 应用,这条命令将交互式地创建一个项目,根据你的需要选择编程语言、目标平台、项目信息等,配置完成后,Pluto 会使用提供的项目名称创建一个目录。
pluto new
开发应用
使用 cd project_name
命令进入项目目录,进入后可以看到已经配置有基本的项目结构,接下来我们执行下面的命令来安装依赖,不同编程语言的安装方式稍用不同:
npm install
pip install -r ./requirements.txt
安装完依赖后,你就可以根据自己的需求修改 app/main.py
文件,完成应用开发。当然,你也可以直接部署示例应用来体验 Pluto 的使用。
配置环境
应用开发完成后,我们还需要对访问凭证、镜像仓库等环境信息进行配置,以便后续能够正常部署应用。
在部署时,Pluto 会将应用中包含的若干个函数分别打包成容器镜像,并上传到指定镜像仓库中。Pluto 构建的容器镜像名称由这几部分构成:<registry>/<formatted_project_name>:<function_id>-<timestamp>
。
因此,如果你希望上传至公开镜像仓库,你需要先在 Docker Hub 等平台上创建以项目名称命名的镜像仓库,然后采用相同的方式将镜像仓库地址配置到 Pluto 配置文件中。注意,为了避免违法字符,我们在上传镜像时会将项目名称格式化为小写字母和短横线的组合,你可以在下方输入项目名称,获取格式化的结果,并以此创建镜像仓库:
格式化结果:
接下来,我们将镜像仓库地址填写到 Pluto 的配置文件中。我们打开项目目录下的 .pluto/pluto.yml
配置文件,找到你创建的 stack,默认是 dev
,修改其中的 configs
字段,将镜像仓库地址填写进去,填写方式如下:
...
stacks:
- name: dev
configs:
kubernetes:registry: docker.io/your-username/
kubernetes:platform: auto # or linux/amd64, linux/arm64
...
默认情况下, Pluto 打包镜像的目标平台是 linux/amd64
架构。如果你的 Kubernetes 集群是其他架构,则需要在 Pluto 配置文件中配置 kubernetes:platform
字段,可选项有 linux/amd64
、linux/arm64
和 auto
,其中 auto
会根据当前设备架构自动选择。
Pluto 会应用发布为多个 Knative Service,因此,需要事先在 Kubernetes 中安装 Knative,并关闭缩容到零的功能(因为 Pluto 尚不支持 Ingress 转发到 Knative Serving,欢迎社区贡献者来帮助改进)。你可以根据这篇文档配置所需的 Kubernetes 环境。
部署
在配置完环境信息后,我们就可以执行下面这条命令来部署 Pluto 应用了:
pluto deploy
这条命令可能会执行一段时间,取决于你的应用规模和网络环境。执行完成后,你可以从输出中看到应用的访问地址。你可以从部署细节中了解 Pluto 具体部署了哪些资源。
测试
在 Kubernetes 集群中,我们可以通过 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
部署成功的话,你应该可以看到类似下面的输出:
如果你在测试时遇到错误,你可以通过 kubectl get pods -A
命令查看所有 Pod 的状态,是否所有非 Job 类 Pod 都已经正常启动。如果你的集群不是这样,请等待 Pod 启动完成后再进行测试。可能需要重新部署 Pluto 应用。
清理
如果你想从目标平台上下线这个应用,可以使用以下命令:
pluto destroy
部署细节
Pluto 将从应用代码中推导出需要 1 个路由、1 个消息队列、1 个 KV 数据库和 3 个函数对象,然后,Pluto 将自动地在你指定的云平台上创建相应的资源实例,并配置好它们之间的依赖关系。
在 Kubernetes 中,将会配置 1 个 Ingress、2 个 Redis 和 3 个 Knative Service。