
SkyPilot SkyServe 鉴权实战为 vLLM 推理服务配置 API Key 访问控制【免费下载链接】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导读SkyServe 是 SkyPilot 内置的多云托管式服务Serve框架本文聚焦其中的副本级replica-level鉴权能力通过在服务 YAML 中声明环境变量化的鉴权 Token并将其同时注入就绪探针readiness_probe与推理引擎入口实现服务就绪检查必须携带凭据、外部请求必须携带 API Key的端到端访问控制。读完本文你将掌握sky serve up部署带鉴权服务的完整流程、secrets与envs的配合用法、带Authorization头的 curl 调用方式以及无 Key 请求如何被拒绝401。文中全部配置与命令均以 auth.rst 为骨架并以 sky/serve、sky/task.py、sky/utils/schemas.py 等仓库源码佐证实现细节。SkyServe 鉴权的设计思路鉴权下沉到副本SkyServe 自身不内置用户管理系统而是复用副本上推理引擎的原生鉴权机制。这意味着鉴权的主体是运行在副本上的服务进程如 vLLM 的静态 API Key 校验SkyServe 负责的是把 Token 安全地传递到位一处用于就绪探针一处用于服务启动参数最终访问控制由副本上的推理引擎执行——携带错误或缺失 Key 的请求会在副本侧直接返回401 Unauthorized。从 service_spec.py 的源码结构可以看出readiness_probe是ServiceSpec中一个可配置的完整对象支持path、initial_delay_seconds、timeout_seconds、headers、post_data等字段这正是把鉴权 Token 注入健康检查请求的底层机制。完整示例用 vLLM API Key 部署受保护的 Llama 服务以下auth.yaml是 auth.rst 给出的可运行配置。核心思路在envs中定义模型名在secrets中声明两个敏感变量其中AUTH_TOKEN即 API Key并把$AUTH_TOKEN同时传给readiness_probe.headers与 vLLM 的--api-key。# auth.yaml envs: MODEL_NAME: Qwen/Qwen3-0.6B secrets: HF_TOKEN: null AUTH_TOKEN: null service: readiness_probe: path: /v1/models headers: Authorization: Bearer $AUTH_TOKEN initial_delay_seconds: 1800 replicas: 1 resources: accelerators: {L4, A10g, A10, L40, A40, A100, A100-80GB} cpus: 7 memory: 20 ports: 8087 setup: | uv venv --python 3.10 --seed source .venv/bin/activate uv pip install vllm0.10.0 --torch-backendauto # Have to use triton3.2.0 to avoid https://github.com/triton-lang/triton/issues/6698 uv pip install triton3.2.0 uv pip install openai run: | source .venv/bin/activate export PATH$PATH:/sbin vllm serve $MODEL_NAME --trust-remote-code \ --host 0.0.0.0 --port 8087 \ --api-key $AUTH_TOKEN配置要点逐项拆解配置项作用说明envs.MODEL_NAME定义模型名通过$MODEL_NAME在 run 命令中引用secrets.HF_TOKENHugging Face 访问令牌值为null时表示需在sky serve up时通过--secret传入值为字符串时表示托管密钥引用secrets.AUTH_TOKEN鉴权 TokenAPI Key同时用于 readiness_probe 与 vLLM 的--api-keyservice.readiness_probe.path就绪检查端点使用 vLLM 的/v1/models需携带Authorization头才会通过service.readiness_probe.headers就绪检查附加头从 schemas.py 的 JSON Schema 看headers为字符串到字符串的对象映射这里使用Bearer $AUTH_TOKEN语法让 SkyPilot 在探针请求中自动替换环境变量service.readiness_probe.initial_delay_seconds启动宽限期模型冷启动/加载权重期间探针不判定失败resources.ports: 8087副本暴露端口必须与 vLLM 的--port 8087一致探针与入口流量都走该端口resources.accelerators/cpus/memory副本资源规格兼容多代 GPUL4/A10g/L40/A100 等保证 vLLM 可在多种云实例上调度就绪探针与鉴权的关系为什么探针也要带 Token在无鉴权的场景下readiness_probe.path: /v1/models会被 SkyServe 控制器周期性请求以判断副本是否 Ready。一旦 vLLM 开启了--api-key任何不带合法 Key 的请求都会被拒绝——包括探针请求本身。因此必须在readiness_probe.headers中带上Authorization: Bearer $AUTH_TOKEN否则副本会被判定为不健康服务永远无法进入 Serving 状态。从 service_spec.py 的ServiceSpec.from_yaml_config实现看readiness_section会被解析为initial_delay_seconds、readiness_headers等字段未显式设置时回退到 constants.py 中定义的DEFAULT_INITIAL_DELAY_SECONDS 1200秒本示例显式配置为 1800 秒为大型模型的权重加载留出更长宽限。环境变量如何进入副本secrets字段与envs字段在 task.py 中被统一管理secrets的值在 SkyPilot 内部以SecretStr封装存储部署阶段通过get_plaintext_secrets见 task.py还原为明文并注入副本环境run命令中的$AUTH_TOKEN、探针 header 中的$AUTH_TOKEN因此在同一个部署中共享同一份 Token 值从而保证探针用的 Key与服务用的 Key严格一致。部署服务通过 --secret 注入密钥与普通sky serve up不同本示例必须显式提供HF_TOKEN与AUTH_TOKENHF_TOKENxxx AUTH_TOKENyyy sky serve up auth.yaml -n auth --secret HF_TOKEN --secret AUTH_TOKEN命令要点-n auth指定服务名后续sky serve status --endpoint auth将依据该名称获取端点--secret HF_TOKEN --secret AUTH_TOKEN声明这两个键来自当前 shell 环境变量SkyPilot 会以安全方式打包并注入副本环境避免密钥出现在 YAML 或命令行历史中值的来源命令前缀HF_TOKENxxx AUTH_TOKENyyy仅在本条命令进程内生效不会污染 shell 全局环境。部署后可用sky serve status auth查看副本状态、就绪进度与端点信息。调用受保护的服务端点部署完成后先从 SkyServe 获取负载均衡端点ENDPOINT$(sky serve status --endpoint auth) AUTH_TOKENyyy带 Key 发起一次 OpenAI 兼容的对话补全请求curl $ENDPOINT/v1/chat/completions \ -H Content-Type: application/json \ -H Authorization: Bearer $AUTH_TOKEN \ -d { model: Qwen/Qwen3-0.6B, messages: [ { role: system, content: You are a helpful assistant. }, { role: user, content: Who are you? } ] } | jq正常返回可折叠的示例输出字段以实际 vLLM 版本为准{ id: chatcmpl-f5f1bffa4b504a8b8e842436f3701b3f, object: chat.completion, created: 1753994285, model: Qwen/Qwen3-0.6B, choices: [ { index: 0, message: { role: assistant, content: think\nOkay, the user is asking, \Who are you?\ I need to respond appropriately. ...\n/think\n\nIm an AI assistant designed to help with a wide range of questions and tasks. How can I assist you today? , refusal: null, annotations: null, audio: null, function_call: null, tool_calls: [], reasoning_content: null }, logprobs: null, finish_reason: stop, stop_reason: null } ], service_tier: null, system_fingerprint: null, usage: { prompt_tokens: 23, total_tokens: 128, completion_tokens: 105, prompt_tokens_details: null }, prompt_logprobs: null, kv_transfer_params: null }注意响应内容取决于模型本示例为 Qwen/Qwen3-0.6B思考型模型会输出think推理片段且请求中的model字段必须与envs.MODEL_NAME一致否则 vLLM 会返回模型不存在错误。无 Key / 错误 Key 请求401 验证鉴权是否生效可以用不带 Key 或带随机 Key 的请求直接验证。两者都会在副本侧被 vLLM 拒绝curl $ENDPOINT/v1/models # {error: Unauthorized} curl $ENDPOINT/v1/models -H Authorization: Bearer random-string # {error: Unauthorized}这一行为正是鉴权下沉到副本设计的直接体现即使请求经过了 SkyServe 的负载均衡层只要未携带副本认可的静态 API Key就会在推理引擎处得到401 Unauthorized。因此API Key 的生成与轮换完全由你控制SkyServe 不感知 Key 的具体内容若探针与服务的 Key 不一致例如--secret传入的 Token 与 header 中的$AUTH_TOKEN不是同一来源服务将因探针失败而无法 Ready排查时应优先核对两边 Key 是否一致。深入源码鉴权相关配置如何被解析与校验SkyServe 对service段配置的校验集中在 sky/utils/schemas.py。从 JSON Schema 看readiness_probe既支持简写字符串仅指定路径也支持对象形式对象必须包含path可选字段包括initial_delay_secondsnumber就绪检查开始前的宽限秒数timeout_secondsnumber单次探针超时endpoint_probe_interval_secondsnumber端点探针间隔consecutive_failure_threshold_timeoutnumber连续失败判定阈值post_datastring/objectPOST 请求体headersobject of string附加请求头——即承载Authorization: Bearer $AUTH_TOKEN的字段。而ServiceSpec在 service_spec.py 中把这些 YAML 字段映射为运行时配置readiness_headers第 209 行解析、第 242 行写入 service_config、initial_delay_seconds第 200-211 行解析缺省回退到常量 1200。这解释了本文示例为何必须同时修改两处headers解决探针有 Key--api-key解决服务有 Key二者缺一不可。小结SkyServe 的副本级鉴权本质是借力推理引擎自带的安全能力声明在secrets中声明AUTH_TOKEN及HF_TOKEN在readiness_probe.headers与 vLLM--api-key中统一引用注入通过sky serve up ... --secret从 shell 环境注入密钥密钥不落盘于 YAML验证带 Key 请求正常返回无 Key / 错误 Key 返回401 Unauthorized探针必须携带 Key 才能判定 Ready。该模式不仅适用于 vLLM也适用于任何支持静态 Token / API Key鉴权的推理引擎如 TGI、OpenAI 兼容服务等只需将引擎的鉴权参数替换为同一$AUTH_TOKEN即可。进一步的细节可参考 SkyServe 相关文档 与 service_spec.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),仅供参考