vllm-deploy-k8s について
YAML テンプレートを使い、Kubernetes 上に OpenAI 互換の vLLM サーバーをデプロイする Claude スキルです。既存のデプロイとトークンシークレットを確認し、ロールアウトを検証できるほか、モデルや GPU、リソース設定を変更できます。
主な機能
- 01Kubernetes Deployment と Service のテンプレート
- 02NVIDIA GPU リソース設定
- 03デプロイとトークンシークレットの確認
- 04ロールアウトと稼働状態の検証
- 05モデルとサーバーリソースのカスタマイズ
- 06デプロイ削除の手順
活用シーン
- 01Kubernetes クラスターへの vLLM デプロイ
- 02変更前の既存デプロイの確認
- 03GPU、モデル、リソース設定の変更
- 04必要に応じたデプロイリソースの削除
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ vllm-project/ vllm-skills --skill vllm-deploy-k8sインストール後、Claude Code で/vllm-deploy-k8sを入力して読み込まれたか確認します。
同梱ファイルtemplates/vllm-deployment.yamltemplates/vllm-service.yaml
詳細
vLLM の Kubernetes デプロイ
YAML テンプレートを使用して vLLM を Kubernetes にデプロイするための Claude スキルです。GPU リソースとヘルスプローブを備えた ClusterIP Service 付きの Kubernetes Deployment として、vLLM の OpenAI 互換サーバーをデプロイします。
このスキルでできること
- NVIDIA GPU に対応した Kubernetes Deployment と Service として vLLM をデプロイします
- デプロイ前に、vLLM のデプロイがすでに存在するか確認します
- Hugging Face トークンのシークレットが存在するか確認し、存在しない場合はユーザーにトークンを求めます
- デフォルトで
vllm/vllm-openai:latestイメージを使用します(ユーザーは別のバージョンを指定できます) - ユーザーがカスタマイズできる、適切なデフォルト設定を提供します(モデル、レプリカ数、GPU 数、追加の vLLM フラグなど)
前提条件
- Kubernetes クラスターへのアクセス権を持つよう
kubectlが設定されていること - NVIDIA GPU Operator またはデバイスプラグインがクラスターのノードにインストールされていること
- Hugging Face トークン(Llama などのアクセス制限付きモデルでは必須、公開モデルでは任意)
デプロイ手順
ステップ 1:HF トークンのシークレットを確認する
デプロイ前に、対象の名前空間に hf-token Kubernetes シークレットが存在するか確認します。
kubectl get secret hf-token -n <namespace>
- シークレットが存在する場合:ステップ 2 に進みます。
- シークレットが存在しない場合:ユーザーに Hugging Face トークンの入力を求めてから、シークレットを作成します。
kubectl create secret generic hf-token --from-literal=HF_TOKEN="<user-provided-token>" -n <namespace>
アクセス制限付きモデル(例:meta-llama/Meta-Llama-3.1-8B)では、これが必須です。公開モデルではシークレットは任意ですが、レート制限を避けるために推奨されます。
ステップ 2:デプロイがすでに存在するか確認する
適用前に、vLLM のデプロイがすでに存在するか確認します。
kubectl get deployment vllm -n <namespace>
- デプロイが存在する場合:デプロイがすでに存在することをユーザーに伝えます。現在のイメージとステータスを表示し、更新するかスキップするかを尋ねます。
- デプロイが存在しない場合:デプロイに進みます。
ステップ 3:デプロイする
テンプレートの YAML ファイルを適用して vLLM をデプロイします。
kubectl apply -f templates/vllm-service.yaml -n <namespace>
kubectl apply -f templates/vllm-deployment.yaml -n <namespace>
ステップ 4:待機して確認する
デプロイのロールアウトが完了するまで待ちます。
kubectl rollout status deployment/vllm -n <namespace> --timeout=600s
Pod が実行中で準備完了になっていることを確認します。
kubectl get pods -n <namespace> -l app=vllm
Pod の状態が READY 1/1 および STATUS Running であることを確認します。Pod の準備がまだ完了していない場合は、しばらく待ってから再度確認します。CrashLoopBackOff または Error の場合は、kubectl logs -n <namespace> -l app=vllm でログを確認します。
ステップ 5:デプロイの概要を表示する
Pod の準備が完了したら、次の形式で概要メッセージをユーザーに表示します(プレースホルダーは実際の値に置き換えます)。
🎉 **vLLM Deployment Successful!**
| Resource | Name | Status |
|----------|------|--------|
| Deployment | <deployment-name> | <ready>/<total> Ready |
| Service | <service-name> | ClusterIP:<port> |
| Pod | <pod-name> | Running |
| Image | <image> | |
| Model | <model> | |
**To test the API, run these two commands in your terminal:**
**1. Open a port-forward** (this connects your local port <port> to the vLLM service inside the cluster):
kubectl port-forward svc/vllm-svc <port>:<port> -n <namespace>
**2. In a separate terminal**, send a test request to the OpenAI-compatible API:
curl -s http://localhost:<port>/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{"model":"<model>","messages":[{"role":"user","content":"Hello!"}],"max_tokens":50}' | python3 -m json.tool
If everything is working, you'll get a JSON response with the model's reply.
デフォルト設定
テンプレートでは、次のデフォルト値を使用します。
| パラメーター | デフォルト値 |
|---|---|
| イメージ | vllm/vllm-openai:latest |
| モデル | Qwen/Qwen2.5-1.5B-Instruct |
| ポート | 8000 |
| レプリカ数 | 1 |
| GPU 数 | 1 |
| GPU メモリ使用率 | 0.85 |
| テンソル並列サイズ | 1 |
| CPU リクエスト/上限 | 12 / 128 |
| メモリリクエスト/上限 | 100Gi / 400Gi |
| 共有メモリ(dshm) | 80Gi |
カスタマイズ
ユーザーから変更を依頼された場合は、適用する前にテンプレート YAML ファイルを変更してください。以下をカスタマイズできます。
- イメージのバージョン:
templates/vllm-deployment.yamlのimage: vllm/vllm-openai:<version>を変更します(デフォルト:latest)。ユーザーから指定された場合は、v0.17.1のような特定のバージョンタグを使用してください。 - モデル:Deployment の
args内にあるvllm serveコマンドのモデル名を変更します。 - 追加の vLLM フラグ:Deployment の
args内にあるvllm serveコマンドに追加のフラグを追記します(例:--max-model-len 4096、--kv-cache-dtype fp8、--enforce-eager、--generation-config vllm)。 - レプリカ数:Deployment 仕様の
replicas:を変更します。 - GPU 数:リソースの
requestsとlimitsの両方でnvidia.com/gpuを変更します。 - テンソル並列サイズ:GPU 数に合わせて
--tensor-parallel-sizeフラグを変更します。 - CPU/メモリリソース:
requestsとlimitsのcpuおよびmemoryの値を変更します。 - ポート:Deployment の
containerPort、Service のport/targetPort、すべてのヘルスプローブ(liveness、readiness、startup)のportを変更し、さらにargs内のvllm serveコマンドに--port <port>を追加します。4 か所すべてを一致させてください。 - Namespace:
-n <namespace>を使用して、特定の Namespace に適用します。 - 共有メモリサイズ:
dshmemptyDir ボリュームのsizeLimitを変更します。
Edit ツールを使用してテンプレートファイルを編集し、変更したテンプレートを適用してください。
ステータスの確認
kubectl get deployment,svc,pods -n <namespace> -l app=vllm
クリーンアップ
ユーザーから vLLM デプロイメントのクリーンアップまたは削除を依頼された場合は、次の手順を実行してください。
- Deployment と Service を削除します。
kubectl delete -f templates/vllm-deployment.yaml -n <namespace>
kubectl delete -f templates/vllm-service.yaml -n <namespace>
- HF トークンシークレットも削除するかユーザーに確認します。削除する場合:
kubectl delete secret hf-token -n <namespace>
- すべてがクリーンアップされたことを確認します。
kubectl get deployment,svc,pods -n <namespace> -l app=vllm
- ユーザーに概要メッセージを表示します。
vLLM deployment has been cleaned up from namespace <namespace>.
Deleted: Deployment/vllm, Service/vllm-svc
HF token secret: <kept/deleted>
トラブルシューティング
- Pod が Pending のままになる:GPU ノードがありません。スケジューリングエラーを確認するには、
kubectl describe pod <pod-name>を実行します。NVIDIA GPU Operator またはデバイスプラグインがインストールされていることを確認してください。 - Pod が OOMKilled になる:Deployment の
memory制限を増やすか、より小さなモデルを使用します。 - ImagePullBackOff:イメージ名とタグを確認します。ノードから Docker Hub/コンテナレジストリにアクセスできることを確認してください。
- Startup probe の失敗(CrashLoopBackOff):モデルのダウンロードに時間がかかっている可能性があります。
kubectl logs <pod-name>でログを確認します。アクセス制限付きモデルの場合は、hf-tokenシークレットが存在することを確認してください。必要に応じて、startup probe のfailureThresholdを増やします。 - HF_TOKEN が機能しない:シークレットが存在することを確認します:
kubectl get secret hf-token -n <namespace>。トークンが有効であることを確認してください。 - コンテナ内で GPU が検出されない:
nvidia.com/gpuリソースが要求されており、NVIDIA デバイスプラグインがノード上で実行されていることを確認してください。