升级 SkyPilot API 服务器#

本页提供了升级远程 SkyPilot API 服务器应遵循的步骤概述

升级使用 Helm 部署的 API 服务器#

此处介绍使用 Helm 部署 升级远程 API 服务器的步骤。

注意

升级 API 服务器会导致停机。我们建议在维护窗口期间安排升级:对旧 API 服务器进行封锁 (cordon) 和排空 (drain),然后执行升级。

步骤 1:准备升级#

  1. 在 SkyPilot 每夜构建 中查找要使用的版本。

  2. 将 SkyPilot helm 仓库更新到最新版本

helm repo update skypilot
  1. 准备版本控制环境变量。NAMESPACERELEASE_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 具有 patchexec(或 port-forward)访问权限。

  1. 封锁 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 服务器。

  1. 验证 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 服务器是否已封锁。

  1. 排空旧的 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 服务器

  1. 从 SkyPilot 每夜构建 中获取要升级到的版本。

  2. 切换到用于启动 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
  1. 检查 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...
  1. 升级客户端

pip install -U skypilot-nightly==${VERSION}

注意

升级客户端后,在 API 服务器升级到新版本之前不应使用它们。

  1. 升级 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"
  1. 切换回远程 API 服务器

ENDPOINT=$(sky status --endpoint api-server)
sky api login -e $ENDPOINT
  1. 验证 API 服务器正在运行且版本与您升级到的版本一致

$ sky api info
Using SkyPilot API server: <ENDPOINT>
├── Status: healthy, commit: 022a5c3ffe258f365764b03cb20fac70934f5a60, version: 1.0.0.dev20250410
└── User: aclice (abcd1234)