使用 SkyPilot 一键云端部署 Streamlit 应用:完整配置指南与源码级原理解析
【免费下载链接】skypilotThe AI Compute Platform for frontier teams. SkyPilot turns fragmented AI compute into one AI supercomputer, so frontier AI teams build custom intelligence faster.项目地址: https://gitcode.com/GitHub_Trending/sk/skypilot
导读
本指南基于仓库 examples/streamlit 目录下的实战示例,系统讲解如何将 Streamlit 应用部署到任意主流云平台(AWS / GCP / Azure / Kubernetes 等)。你将掌握streamlit.sky.yaml任务清单的完整配置语义、sky launch/sky status --endpoint/sky down三条核心命令的用法,以及自定义端口、指定云厂商与机型、依赖安装等进阶技巧,并从源码层面理解ports、infra等关键字段背后的解析与校验逻辑。
上图是 app.py 部署成功后在浏览器中呈现的交互界面(随机数据可视化 + 侧边栏参数控制),对应示例中--server.port 8501暴露的 8501 端口服务。
一、示例组成与整体思路
本示例包含两个核心文件:
| 文件 | 作用 |
|---|---|
| app.py | 一个简单的 Streamlit 演示应用:通过滑块控制数据点数量、下拉框切换折线/柱状/面积图,支持勾选查看原始数据表格 |
| streamlit.sky.yaml | SkyPilot 任务(Task)配置清单,声明运行环境、依赖安装命令与启动命令 |
部署思路非常简洁:SkyPilot 以“任务清单”为中心,将资源需求(resources)、工作目录(workdir)、环境准备(setup)与运行命令(run)四件事写在一个 YAML 中,一条命令即可完成"选云、开 VM、装依赖、跑服务、开端口"的全部流程,并在集群生命周期内保持服务可达。
二、完整配置文件逐行解析
原文档对应的 streamlit.sky.yaml 全文仅 12 行,却涵盖了 SkyPilot 任务配置的全部关键要素:
name: streamlit-app resources: ports: 8501 workdir: . setup: | pip install streamlit run: | streamlit run app.py --server.port 8501 --server.address 0.0.0.0 --server.headless true各字段含义如下:
name:集群与任务名称。该名称同时被-c(cluster 名)引用,后续sky status、sky down都使用它定位集群。resources.ports: 8501:声明需要在云端安全组/防火墙中开放的端口。SkyPilot 会在资源分配阶段将端口列表翻译为云厂商的安全组规则,Streamlit 默认监听 8501,因此这里与run中的--server.port 8501必须保持一致。workdir: .:指定工作目录为当前目录,SkyPilot 会将本地文件(包括app.py)打包上传到远端集群,并自动cd到该目录执行后续命令。这是"本地代码 + 云端运行"的核心机制。setup:在首次创建集群时执行的安装脚本,这里安装 Streamlit。该命令只在集群初始化/更新时执行一次,之后的重复sky launch不会重复执行(除非代码变更触发)。run:每次sky launch或重启集群后都会执行的启动命令。--server.address 0.0.0.0让服务监听所有网卡接口(否则默认只监听 localhost,外部无法访问),--server.headless true则禁用 Streamlit 的提示上报与本地浏览器打开行为,适合无人值守的云端运行。
需要额外依赖时怎么办
如果你的应用需要其他第三方包,只需在setup中追加安装命令。原文档给出了带requirements.txt的写法:
setup: | pip install streamlit pip install -r requirements.txt从源码结构看,setup与run都是 "Hermetic"(封闭式)脚本:setup一旦成功会缓存在集群上,run则在每次执行时重新运行,这保证了"环境只装一次、服务每次按最新代码启动"的合理行为。
三、三步完成部署与访问
第 1 步:启动集群并部署应用
sky launch -c streamlit-app streamlit.sky.yaml-c streamlit-app为集群命名(与 YAML 中name保持一致),后续所有命令都通过这个名字引用该集群。- 不加任何云参数时,SkyPilot 会根据价格、可用性等因素自动在启用的云厂商之间选择最优基础设施;你也可以在 YAML 的
resources中显式指定(见下文"进阶选项")。
Tip:追加
-d参数可以让sky launch将任务提交到后台后立即返回终端,适合部署长驻服务:sky launch -c streamlit-app streamlit.sky.yaml -d此时你可以在终端做其他事情,服务仍在云端正常启动运行。
第 2 步:查询服务端点地址
ENDPOINT=$(sky status --endpoint 8501 streamlit-app) echo "Streamlit app: $ENDPOINT"sky status --endpoint <端口号> <集群名>会返回该集群上指定端口的可访问 URL(形如http://<公网IP>:8501),将输出保存到变量或直接复制到浏览器即可访问应用。
该命令底层实现在 sky/client/cli/command.py:--endpoint选项被声明为type=int,其文档字符串明确说明"获取集群上指定端口号对应的端点 URL",并指出该选项会覆盖其他输出选项。此外还提供--endpoints标志,可以一次性列出集群暴露的所有端点:
sky status --endpoints streamlit-app第 3 步:使用完毕释放资源
sky down streamlit-app该命令会销毁集群及其关联的云端资源(VM、磁盘等),避免持续计费。如果只是暂时不用,还可以用sky stop streamlit-app停止集群并保留磁盘,下次用sky start streamlit-app快速恢复。
四、把示例换成你自己的 Streamlit 应用
原文档给出了清晰的"三步替换法":
- 替换 app.py为你自己的 Streamlit 应用代码(或在工作目录中组织好你的项目文件);
- 更新
streamlit.sky.yaml:- 在
setup部分补全你的应用依赖(见上文 requirements.txt 示例); - 如果你的应用主文件不叫
app.py,修改run中的文件名;
- 在
- 重新启动:
sky launch -c my-app streamlit.sky.yaml由于workdir: .会把当前目录整体打包上传,只要你的项目文件(包括自定义模块、数据文件、静态资源)都位于该目录下,SkyPilot 都会一并同步到云端,无需额外配置。
五、进阶选项:自定义端口与指定云/机型
5.1 自定义端口
Streamlit 默认使用 8501,但如果你要部署的服务监听其他端口,需要同时修改两处,保持resources.ports与run中的端口一致:
resources: ports: 8080 run: | streamlit run app.py --server.port 8080 --server.address 0.0.0.0ports字段在 SkyPilot 中的处理逻辑(见 sky/resources.py)会先把用户输入统一归一化为端口字符串列表,再经resources_utils.simplify_ports压缩为最小端口集合(支持8501-8510之类的区间写法)。随后_try_validate_ports(见 sky/resources.py)会检查当前启用的云是否支持开端口:如果不指定端口则完全跳过校验;若指定了端口但没有任何已启用的云支持开端口,会直接报错并提示"关闭resources.ports或启用支持开端口的云"。这意味着ports声明不仅负责安全组规则,还参与云端资源的选择约束。
5.2 指定云厂商与实例类型
原文档展示了通过infra字段精确指定基础设施的写法:
resources: infra: aws # 或 "infra: aws/us-east-1"、"infra: gcp"、"infra: azure" 等 instance_type: t3.medium ports: 8501infra是 SkyPilot 推荐的统一基础设施声明语法,格式为云厂商[/区域],例如aws/us-east-1、gcp、azure。从 sky/resources.py 的实现可以看到,infra字符串会被解析为InfraInfo并拆解出云厂商(cloud)、区域(region)与可用区(zone)三要素,因此它实际上取代了旧的cloud/region/zone单独声明的写法——两者同时出现会触发校验错误(见 sky/resources.py)。该字段同样支持 Kubernetes 集群上下文,如infra: k8s/my-cluster-ctx。instance_type: t3.medium:指定具体机型。t3.medium是 AWS 的通用型实例(2 vCPU、4 GiB 内存),足以支撑轻量级 Streamlit 演示应用。你也可以换成 GPU 机型,例如p3.2xlarge,用于部署依赖 GPU 推理的 Streamlit 应用。
5.3 常用生命周期命令速查
| 命令 | 作用 |
|---|---|
sky launch -c streamlit-app streamlit.sky.yaml -d | 后台部署并立即返回 |
sky status --endpoint 8501 streamlit-app | 获取 8501 端口访问地址 |
sky status --endpoints streamlit-app | 列出集群所有开放端口地址 |
sky stop streamlit-app | 停止集群(保留磁盘,之后可sky start恢复) |
sky down streamlit-app | 销毁集群并释放全部云端资源 |
六、常见问题排查要点
- 访问超时/连接拒绝:优先检查
resources.ports是否与run中的--server.port一致;确认run中带上了--server.address 0.0.0.0(否则 Streamlit 只监听容器/VM 本机回环地址)。 - 依赖缺失:新依赖务必写入
setup(如pip install -r requirements.txt),修改后重新执行sky launch,SkyPilot 会检测到 setup 命令变更并在集群上重新安装。 - 提示 headless 相关输出:
--server.headless true可抑制交互式提示,保证服务在无终端环境下稳定运行。 - 端点查询失败:确认集群处于
UP状态(可用sky status查看),且查询的端口号与resources.ports声明一致。
七、相关资源
- 完整示例代码:app.py 与 streamlit.sky.yaml
- 更多 SkyPilot 示例(分布式训练、批处理、Docker、TPU 等):examples/README.md
- 任务配置字段的底层实现:sky/resources.py(
resources解析与端口校验)、sky/task.py(setup/run/workdir语义) sky status --endpoint命令实现:sky/client/cli/command.py
【免费下载链接】skypilotThe AI Compute Platform for frontier teams. SkyPilot turns fragmented AI compute into one AI supercomputer, so frontier AI teams build custom intelligence faster.项目地址: https://gitcode.com/GitHub_Trending/sk/skypilot
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考