SkyPilot API Server 管理员部署指南:基于 Helm 的 Kubernetes 生产级部署实践
2026/9/15 18:05:37 网站建设 项目流程

SkyPilot API Server 管理员部署指南:基于 Helm 的 Kubernetes 生产级部署实践

【免费下载链接】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

SkyPilot API Server 是 SkyPilot 的集中式控制平面,让团队通过单一端点统一运行和管理所有 AI 工作负载与 GPU。本指南以 api-server-admin-deploy.rst 为骨架,完整覆盖从 Helm Chart 部署、接入 URL 获取、多云凭据配置到高可用、监控与升级的运维全流程,并结合 charts/skypilot/values.yaml 与 sky/server/server.py 等源码给出底层实现依据。读完本文,你将能够独立完成一次生产级 SkyPilot API Server 的部署、加固与日常运维。

一、部署方式选型:为什么首选 Helm

SkyPilot API Server 被打包为 Helm Chart,一次部署即会同时拉起一个 ingress-nginx 控制器和 API Server 本体。官方推荐在 Kubernetes 集群上通过 Helm 部署,因为这种方式提供最佳可靠性,并解锁 OAuth2 认证、Metrics 监控等高阶能力。

除 Helm 外,官方还提供两种用于特殊场景的替代方案:

  • 云 VM 部署:适用于没有 Kubernetes 集群且不需要高阶功能的场景,见本文"备选方案"章节;
  • 单机 Docker 多用户共享:适用于不希望暴露到公网、只想在单台机器上多用户共享 API Server 的场景(如共享跳板机),见 api-server-in-docker.rst。

前置条件

依赖说明
Kubernetes 集群需要支持 LoadBalancer 或 NodePort 类型的 Service
Helm用于安装和管理 Chart,参见 Helm 官方安装文档
kubectl用于操作集群与验证部署状态

如果还没有 Kubernetes 集群,可参考仓库中的 Kubernetes 部署指南(charts/skypilot/README.md、charts/skypilot/developer.md)自行搭建。

二、Step 1:部署 API Server Helm Chart

2.1 安装命令与变量约定

# 添加并更新 helm 仓库 helm repo add skypilot https://helm.skypilot.co helm repo update # 以下变量贯穿整个指南 # NAMESPACE 是 API Server 的部署命名空间 NAMESPACE=skypilot # RELEASE_NAME 是 helm release 的名称,在命名空间内必须唯一 RELEASE_NAME=skypilot # 配置基础的 HTTP 用户名/密码认证(也可改用 OAuth2 proxy) WEB_USERNAME=skypilot WEB_PASSWORD=yourpassword AUTH_STRING=$(htpasswd -nb $WEB_USERNAME $WEB_PASSWORD) # 部署 API Server helm upgrade --install $RELEASE_NAME skypilot/skypilot-nightly --devel \ --namespace $NAMESPACE \ --create-namespace \ --set ingress.authCredentials=$AUTH_STRING

2.2 关键参数拆解

参数含义
upgrade --install若 API Server 已存在则升级,不存在则安装
--devel使用最新开发版 Helm Chart;如需固定版本,追加--version(如--version 0.1.0
--namespace $NAMESPACE指定部署命名空间
--create-namespace命名空间不存在时自动创建
--set ingress.authCredentials=$AUTH_STRING为 API Server 配置基础认证凭据

注意:上述命令默认会安装 ingress-nginx 控制器,这可能与其他安装产生冲突。多套 API Server 部署请参见"复用 ingress 控制器"章节;使用其他 ingress 控制器请参见"使用自定义 ingress 控制器"章节。

默认部署的 API Server 会使用宿主 Kubernetes 集群来启动任务(kubernetesCredentials.useApiServerCluster=true),相关云与集群凭据的配置见下文"可选:配置云账号"。

2.3 验证部署状态

kubectl get pods --namespace $NAMESPACE -l app=${RELEASE_NAME}-api --watch

正常情况下 pod 会从初始化逐步变为RunningREADY1/1。若异常,可参考 api-server-troubleshooting.rst 排查(例如用kubectl describe pod查看FailedScheduling原因)。

提示:上述方式使用的是 Nginx 提供的基础认证。如需高级 OAuth2 认证,见"可选:配置 OAuth"。

从源码看,/api/health探针在 sky/server/server.py 的BasicAuthMiddleware中被放行(允许未认证请求),这保证了探活与健康检查不会因认证而误报;探针配置(liveness/readiness,路径/api/health、端口 46580)定义于 charts/skypilot/templates/api-deployment.yaml。

三、Step 2:获取 API Server URL

Chart 默认使用 nginx ingress 暴露 API Server,并通过 LoadBalancer Service 接入公网。不支持 LoadBalancer 的集群可使用 NodePort 方案。

3.1 LoadBalancer 方式(默认)

$ HOST=$(kubectl get svc ${RELEASE_NAME}-ingress-nginx-controller --namespace $NAMESPACE -o jsonpath='{.status.loadBalancer.ingress[0].ip}') $ ENDPOINT=http://${WEB_USERNAME}:${WEB_PASSWORD}@${HOST} $ echo $ENDPOINT http://skypilot:yourpassword@1.1.1.1

如果输出中 IP 为空,说明集群不支持 LoadBalancer,请改用 NodePort 方案。

对于 LoadBalancer Service 的精细化控制,可参考 ingress-nginx 的 helm values,所有值需加ingress-nginx.前缀(因为 ingress-nginx 以子 chart 形式安装)。默认的 LoadBalancer 注解在 charts/skypilot/values.yaml 中可见(AWS 使用 NLB、GKE 启用 L4 RBS、Azure 使用 TCP 健康检查协议)。

3.2 NodePort 方式

  1. 在节点上选择两个未占用且放行入站流量的端口(示例使用 30050 和 30051):
helm upgrade --namespace $NAMESPACE $RELEASE_NAME skypilot/skypilot-nightly --devel \ --reuse-values \ --set ingress-nginx.controller.service.type=NodePort \ --set ingress-nginx.controller.service.nodePorts.http=30050 \ --set ingress-nginx.controller.service.nodePorts.https=30051
  1. 获取控制器 URL:
$ NODE_PORT=$(kubectl get svc ${RELEASE_NAME}-ingress-controller-np --namespace $NAMESPACE -o jsonpath='{.spec.ports[?(@.name=="http")].nodePort}') $ NODE_IP=$(kubectl get nodes -o jsonpath='{ $.items[0].status.addresses[?(@.type=="ExternalIP")].address }') $ HOST=${NODE_IP}:${NODE_PORT} $ ENDPOINT=http://${WEB_USERNAME}:${WEB_PASSWORD}@${HOST} $ echo $ENDPOINT http://skypilot:yourpassword@1.1.1.1:30050

可省略nodePorts.http/https以使用 NodePort 范围内的随机端口(默认 30000-32767),但需确保这些端口在节点上开放。为避免云厂商频繁更换节点 IP,可为节点绑定静态 IP,并将该 IP 用作上述NODE_IP

四、Step 3:测试 API Server

$ curl ${ENDPOINT}/api/health {"status":"healthy","api_version":"1","commit":"ba7542c6dcd08484d83145d3e63ec9966d5909f3-dirty","version":"1.0.0-dev0"}

返回healthy即部署成功,接下来可用sky api login连接 API Server 并开始使用。健康检查端点的实现在 sky/server/server.py 中,返回内容包含状态、API 版本、commit 与 SkyPilot 版本号。

五、可选:配置云账号

API Server 的所有云凭据都存储在 Kubernetes Secrets 中。若在部署完成后再配置凭据,会自动触发 API Server 重启以应用新凭据(相关停机影响与缓解见 api-server-upgrade.rst)。

各云账号对应的 Helm values 在 charts/skypilot/values.yaml 中统一管理(awsCredentialsgcpCredentialsrunpodCredentialslambdaCredentialsvastCredentialsnebiusCredentialsdigitaloceanCredentialsr2CredentialscoreweaveCredentialsslurmCredentials等)。

5.1 Kubernetes 凭据

API Server 默认被授予使用宿主 Kubernetes 集群的权限,任务会在 API Server 同一命名空间启动:

  • 禁用宿主集群:设置kubernetesCredentials.useApiServerCluster=false
  • 使用其他命名空间:设置kubernetesCredentials.inclusterNamespace=<namespace>

为其他集群配置认证时,先用 kubeconfig 创建 Secret:

kubectl create secret generic kube-credentials \ --namespace $NAMESPACE \ --from-file=config=$HOME/.kube/config

再启用:

helm upgrade --install $RELEASE_NAME skypilot/skypilot-nightly --devel \ --namespace $NAMESPACE \ --reuse-values \ --set kubernetesCredentials.useKubeconfig=true \ --set kubernetesCredentials.kubeconfigSecretName=kube-credentials

exec 型 kubeconfig 转换:若 kubeconfig 使用 exec 认证(如 GKE 的gke-gcloud-auth-plugin、Nebius Managed Kubernetes、OCI 等),需先生成静态认证的 kubeconfig。仓库已提供脚本 sky/utils/kubernetes/generate_kubeconfig.sh:

export KUBECONFIG=$HOME/.kube/config ./generate_kubeconfig.sh

然后用生成的./kubeconfig创建 Secret。

使用多个 Kubernetes 集群时,需要在 SkyPilot config 的allowed_contexts中声明各 context:

kubernetes: allowed_contexts: - in-cluster # 宿主集群(若 useApiServerCluster=false 则不可设置) - context1 # kubeconfig 中的其他 context - context2

5.2 AWS 凭据

方案一:单 profile(默认)

kubectl create secret generic aws-credentials \ --namespace $NAMESPACE \ --from-literal=aws_access_key_id=YOUR_ACCESS_KEY_ID \ --from-literal=aws_secret_access_key=YOUR_SECRET_ACCESS_KEY helm upgrade --install $RELEASE_NAME skypilot/skypilot-nightly --devel \ --namespace $NAMESPACE \ --reuse-values \ --set awsCredentials.enabled=true

方案二:多 profile(多 workspace)

kubectl create secret generic aws-credentials \ --namespace $NAMESPACE \ --from-file=credentials=$HOME/.aws helm upgrade --install $RELEASE_NAME skypilot/skypilot-nightly --devel \ --namespace $NAMESPACE \ --reuse-values \ --set awsCredentials.enabled=true \ --set awsCredentials.useCredentialsFile=true

注意:凭据文件中被引用的非默认 profile 必须在 config 文件中一并声明。也可以复用已有 Secret(通过awsCredentials.awsSecretNameawsCredentials.accessKeyIdKeyNameawsCredentials.secretAccessKeyKeyName指定键名),或使用新名字的 Secret 后重新指向。更新后可用kubectl exec进 pod 执行cat /root/.aws/credentials验证。

5.3 GCP 凭据

GCP 使用服务账号认证。将 JSON key 存入 Secret 后启用:

kubectl create secret generic gcp-credentials \ --namespace $NAMESPACE \ --from-file=gcp-cred.json=YOUR_SERVICE_ACCOUNT_JSON_KEY.json helm upgrade --install $RELEASE_NAME skypilot/skypilot-nightly --devel \ --namespace $NAMESPACE \ --reuse-values \ --set gcpCredentials.enabled=true \ --set gcpCredentials.projectId=YOUR_PROJECT_ID

验证:kubectl exec $API_SERVER_POD_NAME -n $NAMESPACE -- ls -lart /root/.config/gcloud

5.4 API Key 型云(RunPod / Lambda / Vast / DigitalOcean)

这几家均使用 API Key 认证,模式完全一致:

kubectl create secret generic runpod-credentials \ --namespace $NAMESPACE \ --from-literal api_key=YOUR_API_KEY helm upgrade --install $RELEASE_NAME skypilot/skypilot-nightly --devel \ --namespace $NAMESPACE \ --reuse-values \ --set runpodCredentials.enabled=true

Lambda、Vast、DigitalOcean 分别对应lambdaCredentialsvastCredentialsdigitaloceanCredentials,Secret 创建方式相同,均支持通过*SecretName复用已有 Secret。

5.5 Nebius 凭据

Nebius 使用服务账号,支持单个或多个凭据文件:

kubectl create secret generic nebius-credentials \ --namespace $NAMESPACE \ --from-file=credentials.json=$HOME/.nebius/credentials.json \ --from-file=serviceaccount-1-credentials.json=$HOME/.nebius/serviceaccount-1-credentials.json helm upgrade --install $RELEASE_NAME skypilot/skypilot-nightly --devel \ --namespace $NAMESPACE \ --reuse-values \ --set nebiusCredentials.enabled=true \ --set nebiusCredentials.tenantId=YOUR_TENANT_ID

多凭据文件可与 workspaces 配合,为不同团队绑定不同的凭据与租户:

workspaces: team-a: nebius: credentials_file_path: ~/.nebius/serviceaccount-1-credentials.json tenant_id: tenant-rrww0kh3nnfo7v0dgw team-b: nebius: credentials_file_path: ~/.nebius/serviceaccount-2-credentials.json tenant_id: tenant-52czfp5clbtq0er1ol

5.6 SSH Node Pools

若需将既有机器接入为 SSH Node Pool,先创建 配置 文件ssh_node_pools.yaml,再通过--set-file注入:

helm upgrade --install $RELEASE_NAME skypilot/skypilot-nightly --devel \ --namespace $NAMESPACE \ --reuse-values \ --set-file apiService.sshNodePools=/your/path/to/ssh_node_pools.yaml

若配置涉及 SSH 密钥,将密钥放入 Secret 并设置apiService.sshKeySecret

SECRET_NAME=apiserver-ssh-key kubectl create secret generic $SECRET_NAME \ --namespace $NAMESPACE \ --from-file=id_rsa=/path/to/id_rsa \ --from-file=other_id_rsa=/path/to/other_id_rsa helm upgrade --install $RELEASE_NAME skypilot/skypilot-nightly --devel \ --namespace $NAMESPACE \ --reuse-values \ --set apiService.sshKeySecret=$SECRET_NAME

密钥会挂载到容器~/.ssh/。更新sshNodePools不会重启 API Server,但会在数十秒内生效(用kubectl exec ... cat /root/.sky/ssh_node_pools.yaml验证)。部署后使用sky ssh up完成 Node Pool 初始化。注意:本机上的 SSH 配置对 API Server 不可见,Helm 部署时应把 SSH 密钥与口令写进ssh_node_pools.yaml

5.7 Slurm 凭据

API Server 通过 SSH 连接 Slurm 集群的登录节点,需要 SSH 密钥和 Slurm SSH 配置文件(~/.slurm/config)。

Step 1:创建 SSH 密钥 Secret

kubectl create secret generic slurm-ssh-key \ --namespace $NAMESPACE \ --from-file=id_rsa=/path/to/your/ssh/id_rsa

多个集群的多个密钥可放入同一 Secret。

Step 2:创建 Slurm SSH 配置

cat > /tmp/slurm-config <<EOF Host mycluster1 HostName login.mycluster1.myorg.com User myusername IdentityFile ~/.ssh/id_rsa Host mycluster2 HostName login.mycluster2.myorg.com User myusername IdentityFile ~/.ssh/cluster2_key EOF

HostNameUser必填;IdentityFile可选,缺省时使用 ssh-agent 或默认密钥位置(~/.ssh/id_rsa~/.ssh/id_ed25519)。

Step 3:部署

helm upgrade --install $RELEASE_NAME skypilot/skypilot-nightly --devel \ --namespace $NAMESPACE \ --reuse-values \ --set apiService.sshKeySecret=slurm-ssh-key \ --set-file slurmCredentials.config=/tmp/slurm-config

也可用 values.yaml 方式。配置完成后,从客户端运行sky check验证 Slurm 集群是否被识别。

5.8 对象存储凭据(Cloudflare R2 / CoreWeave CAIOS / VastData)

R2 使用与本地安装相同的凭据格式:

kubectl create secret generic r2-credentials \ --namespace $NAMESPACE \ --from-file=r2.credentials=$HOME/.cloudflare/r2.credentials \ --from-file=accountid=$HOME/.cloudflare/accountid helm upgrade --install $RELEASE_NAME skypilot/skypilot-nightly --devel \ --namespace $NAMESPACE \ --reuse-values \ --set r2Credentials.enabled=true \ --set r2Credentials.r2SecretName=r2-credentials

CoreWeave 与 VastData 的模式相同(Secret 内分别放置cw.config/cw.credentialsvastdata.config/vastdata.credentials),分别通过coreweaveCredentials.enabledvastdataCredentials.enabled启用。

5.9 其他云

可通过kubectl exec进入 API Server pod,执行相关的安装命令手动配置。注意:手动配置的凭据在 API Server 重启后不会保留;通过 Secret 支持更多云正在规划中。

六、可选:配置 OAuth、高可用与 SkyPilot Config

  • OAuth2 认证:在基础 HTTP 认证之上,SkyPilot 支持通过 OAuth2 安全认证用户,支持 Okta、Google Workspace 等常见提供商。可在 ingress 层使用 OAuth2 Proxy(ingress.oauth2-proxy),或使用auth.oauth(OIDC 配置项见 charts/skypilot/values.yaml,包含oidc-issuer-urlclient-idclient-secretemail-domain、session store 等)。
  • 高可用:生产环境可用外部 PostgreSQL 数据库支撑 API Server,实现无状态化,详见 api-server-upgrade.rst。
  • SkyPilot Config 管理:部署完成后,通过 Dashboard 修改全局配置:http://<api-server-url>/dashboard/config(界面见下图)。

首次部署时也可通过--set-file apiService.config=path/to/your/config.yaml注入初始配置(挂载为容器内~/.sky/config.yaml):

cat <<EOF > config.yaml admin_policy: admin_policy_examples.AddLabelsPolicy jobs: controller: resources: cpus: 2+ allowed_clouds: - aws - kubernetes kubernetes: allowed_contexts: - my-context - my-other-context EOF helm upgrade --install $RELEASE_NAME skypilot/skypilot-nightly --devel \ --namespace $NAMESPACE \ --reuse-values \ --set-file apiService.config=config.yaml

注意:apiService.config在已有配置时执行helm upgrade会被忽略(防止误覆盖),请改用 Dashboard;若配置了远程数据库(apiService.dbConnectionStringapiService.dbConnectionSecretName),则 SkyPilot config 不能在 Helm chart 中指定,只能在部署后通过 Dashboard 设置。

七、可选:GPU 监控与 Metrics

SkyPilot Dashboard 可选暴露 GPU 指标与 API Server 指标。启用方式:

helm upgrade --install $RELEASE_NAME skypilot/skypilot-nightly --devel \ --namespace $NAMESPACE \ --reuse-values \ --set apiService.metrics.enabled=true \ --set prometheus.enabled=true \ --set grafana.enabled=true

从 charts/skypilot/values.yaml 可以看到内置的 Prometheus 配置细节:默认保留 1000 天、retentionSize 43GB、为 GPU 指标与模型 serving 指标(/gpu-metrics/endpoints-metrics)内置了静态抓取任务,并支持useDedicatedScrapeConfigscrapeEndpointMetrics开关。详细的 Prometheus/Grafana 部署步骤见 api-server-metrics-setup.rst 与 api-server-gpu-metrics-setup.rst。

八、可选:服务端调试日志

客户端可通过SKYPILOT_DEBUG=1环境变量为单个请求开启调试日志:

SKYPILOT_DEBUG=1 sky status

要为所有请求开启服务端调试日志:

helm upgrade --install $RELEASE_NAME skypilot/skypilot-nightly --devel \ --namespace $NAMESPACE \ --reuse-values \ --set-string 'apiService.extraEnvs[0].name=SKYPILOT_SERVER_ENABLE_REQUEST_DEBUG_LOGGING' \ --set-string 'apiService.extraEnvs[0].value=true'

每个请求的调试日志保存在 API Server 的~/.sky/api_server/request_debug_logs/<request_id>.log,且不影响客户端看到的输出。

九、升级与卸载

9.1 升级 API Server

升级流程(含高可用、双升级策略对比与 API 兼容性保证)详见 api-server-upgrade.rst。核心要点:

  1. 确定目标版本号,helm repo update skypilot更新仓库;
  2. 先升级客户端pip install -U skypilot-nightly==${VERSION}
  3. 升级 API Server(--reuse-values至关重要,用于保留此前设置):
helm upgrade -n $NAMESPACE $RELEASE_NAME skypilot/skypilot-nightly --devel --reuse-values \ --set apiService.image=${IMAGE_REPO}:${VERSION}

升级期间 SkyPilot CLI 与 Python SDK 会自动重试请求直至新版就绪,因此升级是"优雅"的(前提是前后版本 API 兼容;自 0.10.0 起相邻 minor 版本间保证 API 兼容)。生产环境可将升级策略切换为RollingUpdate(需外部 PostgreSQL 数据库 +storage.enabled=false+ 保持 ingress 开启),实现零停机滚动升级。

9.2 卸载

helm uninstall $RELEASE_NAME --namespace $NAMESPACE --wait

--wait确保所有 API Server 相关资源删除完毕后才返回。

十、生产加固:故障容错与权限最小化

10.1 状态持久化

API Server 被设计为故障容错:pod 被终止后 Kubernetes 会自动重建。为在 pod 重建期间保留状态,Chart 使用 PersistentVolumeClaim(PVC),可自定义存储设置:

storage: # Enable/disable persistent storage enabled: true # Storage class name - leave empty to use cluster default storageClassName: "" # Access modes - ReadWriteOnce or ReadWriteMany depending on storage class support accessMode: ReadWriteOnce # Storage size size: 10Gi # Optional selector for matching specific PVs selector: {} # matchLabels: # environment: prod # Optional volume name for binding to specific PV volumeName: "" # Optional annotations annotations: {}

例如使用特定 storage class 并扩容到 20Gi:

storage: enabled: true storageClassName: "standard" size: 20Gi

应用:helm upgrade --install $RELEASE_NAME skypilot/skypilot-nightly --devel -f values.yaml

EKS 用户如缺省 storage class 不支持 PV,可安装 Amazon EBS CSI driver 使默认gp2storage class 由 EBS 支撑(需先为集群启用 OIDC 并绑定具备 EBS 创建权限的 IAM 角色),也可选用 EFS 等存储类。

10.2 通过 preDeployHook 安装 admin policy

Helm Chart 支持在 API Server 启动前安装 admin policy:

# values.yaml apiService: preDeployHook: | echo "Installing admin policy" pip install git+https://github.com/michaelvll/admin-policy-examples config: | admin_policy: admin_policy_examples.AddLabelsPolicy

应用:helm upgrade --install $RELEASE_NAME skypilot/skypilot-nightly --devel -f values.yaml。admin policy 的完整机制可参考 sky/admin_policy.py 与 examples/admin_policy 中的示例策略。

10.3 最小权限 RBAC

Helm 部署默认会为 API Server 授予访问宿主集群的权限,可通过以下方式裁剪:

  • 降低 RBAC 权限:默认 API Server 会创建 service account 与 RBAC 角色(用于给 SkyPilot 任务 Pod 授权)。若希望禁用,先在 SkyPilot config 中设置kubernetes.remote_identity为已具备足够权限的 API Server service account:

    kubernetes: remote_identity: ${RELEASE_NAME}-api-sa

    再设置rbac.manageRbacPolicies=false

    helm upgrade --install $RELEASE_NAME skypilot/skypilot-nightly --devel --reuse-values \ --set rbac.manageRbacPolicies=false
  • 禁用系统组件管理(无需对象存储挂载时可关闭,rbac.manageSystemComponents=false)。

  • 使用已有 service accountrbac.create=false+rbac.serviceAccountName=my-existing-service-account(需确保其满足 SkyPilot 所需的最小权限)。

默认 RBAC 规则(namespace 级与 cluster 级)在 charts/skypilot/values.yaml 中有完整定义,例如 pod 生命周期管理、Service/Secret/Event/ConfigMap 访问、Node 与 RuntimeClass 读取等。

十一、多 API Server 与自定义 Ingress

11.1 复用 ingress 控制器

默认安装会部署一个新的 ingress-nginx 控制器,其部分 cluster-scope 资源会在多套安装间冲突,因此同一集群部署多套 API Server 时推荐复用已有控制器:

# 第一套 API Server(假设已部署,自带 ingress-nginx 控制器,路径设为 /first-server) helm upgrade --install $RELEASE_NAME skypilot/skypilot-nightly --devel \ --namespace $NAMESPACE \ --reuse-values \ --set ingress.path=/first-server # 第二套 API Server:复用已有控制器,使用不同路径 ANOTHER_RELEASE_NAME=skypilot2 ANOTHER_NAMESPACE=skypilot2 ANOTHER_AUTH_STRING=$(htpasswd -nb $ANOTHER_WEB_USERNAME $ANOTHER_WEB_PASSWORD) helm upgrade --install $ANOTHER_RELEASE_NAME skypilot/skypilot-nightly --devel \ --namespace $ANOTHER_NAMESPACE \ --set ingress-nginx.enabled=false \ --set ingress.path=/second-server \ --set ingress.authCredentials=$ANOTHER_AUTH_STRING

两套 API Server 共享同一控制器,在同一主机的不同路径下提供服务。获取端点时,从部署了控制器的 release 取 HOST,再拼接认证与路径:

FIRST_PATH=$(kubectl get ingress ${RELEASE_NAME}-ingress --namespace $NAMESPACE -o jsonpath='{.metadata.annotations.skypilot\.co\/ingress-path}') FIRST_ENDPOINT=http://${WEB_USERNAME}:${WEB_PASSWORD}@${HOST}${FIRST_PATH} SECOND_PATH=$(kubectl get ingress ${ANOTHER_RELEASE_NAME}-ingress --namespace $ANOTHER_NAMESPACE -o jsonpath='{.metadata.annotations.skypilot\.co\/ingress-path}') SECOND_ENDPOINT=http://${ANOTHER_WEB_USERNAME}:${ANOTHER_WEB_PASSWORD}@${HOST}${SECOND_PATH}

集群中已先存在 ingress-nginx 控制器时,同样设置ingress-nginx.enabled=false与唯一的ingress.path(如/skypilot)即可。

11.2 使用自定义 ingress 控制器

禁用默认 nginx 控制器,指定ingress.ingressClassName与自定义注解:

helm upgrade --install $RELEASE_NAME skypilot/skypilot-nightly --devel \ --namespace $NAMESPACE \ --reuse-values \ --set ingress-nginx.enabled=false \ --set ingress.ingressClassName=custom-ingress-class \ --set ingress.annotations.custom-ingress-annotation=custom-ingress-annotation-value

注意:ingress.authCredentials基础认证仅在使用 ingress-nginx 控制器时受支持,使用自定义控制器时请考虑改用 OAuth2 保护 API Server。

十二、备选方案:在云 VM 上部署 API Server

注意:VM 部署不支持故障切换与优雅升级,生产环境仍推荐 Helm 部署(api-server-admin-deploy.rst)。

12.1 用 SkyPilot 在云 VM 上部署

cat <<EOF > skypilot-api-server.yaml resources: cpus: 8+ memory: 16+ ports: 46580 image_id: docker:berkeleyskypilot/skypilot-nightly:latest run: | sky api start --deploy EOF sky launch -c api-server skypilot-api-server.yaml

12.2 获取 URL 并测试

$ sky status --endpoint 46580 api-server http://a.b.c.d:46580 $ curl ${ENDPOINT}/health SkyPilot API Server: Healthy

上述 YAML 部署的 API Server 默认没有认证,建议增加认证层(如 nginx 反向代理),或改用 Kubernetes 上的 Helm Chart 以获得更安全的部署。若在同一环境安装 SkyPilot API 客户端,建议使用独立的 Python 环境(venv/conda)以避免与部署用的 SkyPilot 安装冲突。

十三、连接 API Server(管理员视角的收尾验证)

部署完成后,团队成员可用sky api login连接:

$ sky api login Enter your SkyPilot API server endpoint: http://skypilot:password@1.2.3.4:30050

连接信息保存在~/.sky/config.yaml;也可用SKYPILOT_API_SERVER_ENDPOINT环境变量覆盖。用sky api info验证:

$ sky api info Using SkyPilot API server: <ENDPOINT> ├── Status: healthy, commit: xxxxx, version: 1.0.0-dev0 └── User: skypilot-user (xxxxxx)

sky api loginsky api infosky api status/logs/cancelsky api start/stop等命令组在 sky/client/cli/command.py 中定义,是管理员日常巡检(查看请求状态、检查请求日志、取消卡住的请求)的入口。各用户默认只能看到自己的资源,管理员可用-u标志查看所有用户的集群与 job/serve 控制器(sky status -usky jobs queue -u)。更多连接细节见 api-server.rst,性能调优(并发上限、资源规划、异步提交)见 api-server-tunning.rst。

【免费下载链接】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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询