升级 SkyPilot API 服务器#
本页提供了升级远程 SkyPilot API 服务器应遵循的步骤概述
升级使用 Helm 部署的 API 服务器#
此处介绍使用 Helm 部署 升级远程 API 服务器的步骤。
注意
升级 API 服务器会导致停机。我们建议在维护窗口期间安排升级:对旧 API 服务器进行封锁 (cordon) 和排空 (drain),然后执行升级。
步骤 1:准备升级#
在 SkyPilot 每夜构建 中查找要使用的版本。
将 SkyPilot helm 仓库更新到最新版本
helm repo update skypilot
准备版本控制环境变量。
NAMESPACE
和RELEASE_NAME
应设置为当前安装的命名空间和发布名称
NAMESPACE=skypilot # TODO: change to your installed namespace
RELEASE_NAME=skypilot # TODO: change to your installed release name
VERSION=1.0.0-dev20250410 # TODO: change to the version you want to upgrade to
IMAGE_REPO=berkeleyskypilot/skypilot-nightly
步骤 2:升级 API 服务器和客户端#
注意
为最大限度地减少升级影响,您可以在执行此步骤之前封锁和排空 API 服务器。可选的封锁和排空步骤确保在升级前完成所有请求,并在升级期间没有新请求。
如果您选择不执行封锁和排空,升级将有以下行为
升级 API 服务器将中断 API 服务器上任何待处理和进行中的请求,例如进行中的
sky launch
。客户端可以在新的 API 服务器启动后再次运行相同的命令来恢复进行中的请求。仅升级服务器或仅升级客户端可能会破坏它们之间的兼容性。在这种情况下,客户端会引发错误,并提示将客户端升级到与服务器相同的版本。
升级客户端
pip install -U skypilot-nightly==${VERSION}
升级 API 服务器
# --reuse-values is critical to keep the values set in the previous installation steps.
helm upgrade -n $NAMESPACE $RELEASE_NAME skypilot/skypilot-nightly --devel --reuse-values \
--set apiService.image=${IMAGE_REPO}:${VERSION}
(可选)您可以使用以下命令查看升级进度
$ kubectl get pod -l app=${RELEASE_NAME}-api --watch
NAME READY STATUS RESTARTS AGE
skypilot-demo-api-server-cf4896bdf-62c96 0/1 Init:0/2 0 7s
skypilot-demo-api-server-cf4896bdf-62c96 0/1 Init:1/2 0 24s
skypilot-demo-api-server-cf4896bdf-62c96 0/1 PodInitializing 0 26s
skypilot-demo-api-server-cf4896bdf-62c96 0/1 Running 0 27s
skypilot-demo-api-server-cf4896bdf-62c96 1/1 Running 0 50s
升级后的 API 服务器在 Pod 运行且 READY
列显示 1/1
后即可处理请求。如果之前 API 服务器已被封锁,升级后封锁将自动解除。
步骤 3:验证升级#
验证 API 服务器能够处理请求,且版本与您升级到的版本一致
$ sky api info
Using SkyPilot API server: <ENDPOINT>
├── Status: healthy, commit: 022a5c3ffe258f365764b03cb20fac70934f5a60, version: 1.0.0.dev20250410
└── User: aclice (abcd1234)
如果可能,您还可以触发依赖于 API 服务器的流水线,以验证升级后没有兼容性问题。
可选:封锁和排空 API 服务器#
以下步骤确保 API 服务器的优雅升级:(1) 拒绝新的 API 服务器请求(封锁),以及 (2) 在维护窗口期间等待旧 API 服务器上所有现有请求完成(排空)。
注意
这需要对 API 服务器 Pod 具有 patch
和 exec
(或 port-forward
)访问权限。
封锁 SkyPilot API 服务器以拒绝新请求
kubectl get pod -l app=${RELEASE_NAME}-api -oname | xargs kubectl patch --type merge -p '{"metadata": {"labels": {"skypilot.co/ready": null}}}'
注意
此步骤后,所有新请求将被 Ingress 拒绝。在继续之前,请确保没有关键服务依赖于此 API 服务器。
验证 API 服务器是否已封锁,您应该会看到以下错误
$ sky api info
sky.exceptions.ApiServerConnectionError: Could not connect to SkyPilot API server at <ENDPOINT>. Please ensure that the server is running. Try: curl <ENDPIONT>
解决早期每夜构建版本中的封锁失败问题
如果您从不支持封锁的早期每夜构建版本升级(此时 sky api info
会成功),您可以通过运行以下命令手动启用封锁支持
kubectl patch service ${RELEASE_NAME}-api-service -p '{"spec":{"selector":{"skypilot.co/ready":"true"}}}'
应用补丁后,再次验证 API 服务器是否已封锁。
排空旧的 API 服务器,等待所有当前请求完成,或者取消它们
您可以通过运行以下命令检查请求的状态
$ kubectl get po -l app=${RELEASE_NAME}-api -oname | xargs -I {} kubectl exec {} -c skypilot-api -- sky api status
sky api status
ID User Name Created Status
942f6ab3-f5b6-4a50-acd6-0e8ad64a3ec2 <USER> sky.launch a few secs ago PENDING
8c5f19ca-513c-4068-b9c9-d4b7728f46fb <USER> sky.logs 26 secs ago RUNNING
skypilot-status-refresh-daemon skypilot-system sky.status 25 mins ago RUNNING
注意
skypilot-status-refresh-daemon
是一个由 API 服务器管理的后台进程,它永远不会停止。此外,sky.logs
可以持续很长时间。这两者都可以安全地中断。
您可以通过运行以下命令取消非关键请求
$ kubectl get po -l app=${RELEASE_NAME}-api -oname | xargs -I {} kubectl exec {} -c skypilot-api -- sky api cancel ${ID}
使用 port-forward 访问 API 服务器
如果您没有对 API 服务器 Pod 的 exec
访问权限,您也可以使用 port-forward
访问 API 状态
$ kubectl get po -l app=${RELEASE_NAME}-api -oname | xargs -I {} kubectl port-forward {} 46580:46580 > /tmp/port-forward.log 2>&1 &
$ PORT_FORWARD_PID=$!
$ sky api login -e http://127.0.0.1:46580
# Polling the status
$ sky api status
# Cancel less critical requests if needed
$ sky api cancel ${ID}
# Stop the port-forward after you are satisfied with the status
$ kill $PORT_FORWARD_PID
升级部署在 VM 上的 API 服务器#
注意
VM 部署不提供优雅升级。我们建议在生产环境中使用 Helm 部署方式:部署 SkyPilot API 服务器。以下是针对 VM 部署中升级 SkyPilot API 服务器的变通方法。
假设 API 服务器的集群名称是 api-server
(这在 备选方案:在云 VM 上部署 指南中使用),您可以通过以下步骤升级 API 服务器
从 SkyPilot 每夜构建 中获取要升级到的版本。
切换到用于启动 API 服务器云 VM 的原始 API 服务器端点。通常在您按照 备选方案:在云 VM 上部署 指南运行
sky launch -c api-server skypilot-api-server.yaml
时在本地启动。
# Replace http://localhost:46580 with the real API server endpoint if you were not using the local API server to launch the API server VM instance.
sky api login -e http://localhost:46580
检查 API 服务器 VM 实例是否处于
UP
状态
$ sky status api-server
Clusters
NAME LAUNCHED RESOURCES STATUS AUTOSTOP COMMAND
api-server 41 mins ago 1x AWS(c6i.2xlarge, image_id={'us-east-1': 'docker:berkeleyskypilot/sk... UP - sky exec api-server pip i...
升级客户端
pip install -U skypilot-nightly==${VERSION}
注意
升级客户端后,在 API 服务器升级到新版本之前不应使用它们。
升级 VM 上的 SkyPilot 并重启 API 服务器
注意
升级和重启 API 服务器将中断所有待处理和正在运行的请求。
sky exec api-server "pip install -U skypilot-nightly[all] && sky api stop && sky api start --deploy"
# Alternatively, you can also upgrade to a specific version with:
sky exec api-server "pip install -U skypilot-nightly[all]==${VERSION} && sky api stop && sky api start --deploy"
切换回远程 API 服务器
ENDPOINT=$(sky status --endpoint api-server)
sky api login -e $ENDPOINT
验证 API 服务器正在运行且版本与您升级到的版本一致
$ sky api info
Using SkyPilot API server: <ENDPOINT>
├── Status: healthy, commit: 022a5c3ffe258f365764b03cb20fac70934f5a60, version: 1.0.0.dev20250410
└── User: aclice (abcd1234)