К основному содержанию
скилл CX Codex

model-serving-kubernetes — скилл для Claude Code: установка

Разворачивает ML-модели и LLM в Kubernetes через KServe или NVIDIA Triton Inference Server. Помогает настроить канареечный релиз, сплит трафика и автоскейлинг.

Установить в Claude Code · Через Skills CLI (Vercel) Все способы и платформы ↓
npx skills add BagelHole/DevOps-Security-Agent-Skills --skill model-serving-kubernetes -a claude-code
Открыть на GitHub

Что делает model-serving-kubernetes

Скилл содержит готовые манифесты и команды для инференса моделей scikit-learn, ONNX, PyTorch, TensorFlow и LLM (например, Llama 3 с vLLM). Он задаёт спецификации KServe InferenceService, контейнеры-трансформаторы и запуск Triton Server с загрузкой весов из хранилища S3.

Внутри описаны канареечные выкатки через параметр canaryTrafficPercent с последующим переключением долей трафика патчами kubectl. Для автомасштабирования предлагается связка KEDA и Prometheus по метрикам входящих запросов. Для Triton даются шаблоны config.pbtxt с динамическим батчингом под GPU.

В кластере заранее нужны Kubernetes 1.28+, NVIDIA GPU Operator и настроенные утилиты kubectl с helm. Если этих компонентов нет, поды с GPU-нагрузкой просто зависнут в ожидании ресурсов.

Какие задачи решает

  • развернуть LLM и ONNX-модели в кластере Kubernetes
  • настроить канареечный релиз и деление трафика между версиями модели
  • сконфигурировать автоскейлинг подов инференса через KEDA и метрики Prometheus
  • подготовить конфигурацию Triton с динамическим батчингом под GPU

Примеры запросов агенту

  • Настрой KServe InferenceService для Llama 3.1 8B с контейнером vLLM и выделением одного GPU
  • Создай манифест ScaledObject в KEDA для масштабирования сервиса по метрике kserve_request_count
  • Покажи конфиг config.pbtxt для Triton с бэкендом onnxruntime и динамическим батчингом

Как установить model-serving-kubernetes

1Через Skills CLI (Vercel)

npx skills add BagelHole/DevOps-Security-Agent-Skills --skill model-serving-kubernetes -a claude-code

2Вручную: положить файлы

~/.claude/skills/model-serving-kubernetes/SKILL.md

Папка скилла целиком; для одного проекта — .claude/skills/model-serving-kubernetes/

По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов

Вопросы о model-serving-kubernetes

Как установить model-serving-kubernetes в Claude Code?

Выполните команду npx skills add BagelHole/DevOps-Security-Agent-Skills --skill model-serving-kubernetes -a claude-code.

Что делает model-serving-kubernetes?

Скилл даёт манифесты и CLI-инструкции для продакшен-инференса моделей в Kubernetes. Он автоматизирует запуск KServe и NVIDIA Triton, выделение GPU и канареечные релизы.

Какие требования нужны для запуска инференса на GPU?

Требуется кластер Kubernetes версии 1.28 или новее с GPU-нодами и установленным NVIDIA GPU Operator. Также понадобятся настроенные утилиты kubectl и helm.

Исходный текст

SKILL.md · MIT
---
name: model-serving-kubernetes
description: Deploy ML models on Kubernetes with KServe (formerly KFServing) and NVIDIA Triton Inference Server. Includes canary deployments, autoscaling, model versioning, A/B testing, and GPU resource management for production model serving.
license: MIT
metadata:
  author: devops-skills
  version: "1.0"
---

# Model Serving on Kubernetes

Production ML model serving with KServe and Triton — canary deployments, autoscaling, and GPU-aware scheduling.

## When to Use This Skill

Use this skill when:
- Serving scikit-learn, PyTorch, TensorFlow, or ONNX models at scale
- Implementing canary deployments and A/B testing for ML models
- Autoscaling inference pods based on request rate or GPU metrics
- Deploying LLMs with Triton or KServe on Kubernetes
- Managing multiple model versions with traffic splitting

## Prerequisites

- Kubernetes 1.28+ with GPU nodes
- KServe installed (or Triton standalone)
- `kubectl` and `helm` configured
- NVIDIA GPU Operator installed on cluster

## KServe Installation

```bash
# Install KServe with Helm
helm repo add kserve https://kserve.github.io/helm-charts
helm repo update

helm install kserve kserve/kserve \
  --namespace kserve \
  --create-namespace \
  --set kserve.controller.gateway.ingressGateway.className=nginx

# Verify
kubectl get pods -n kserve
kubectl get crd | grep kserve
```

## Basic InferenceService (KServe)

```yaml
apiVersion: serving.kserve.io/v1beta1
kind: InferenceService
metadata:
  name: sklearn-iris
  namespace: models
spec:
  predictor:
    sklearn:
      storageUri: gs://kfserving-examples/models/sklearn/1.0/model
      resources:
        requests:
          cpu: "1"
          memory: 2Gi
        limits:
          cpu: "2"
          memory: 4Gi
```

```bash
kubectl apply -f inference-service.yaml

# Get inference service URL
kubectl get inferenceservice sklearn-iris -n models
# NAME           URL                                          READY   ...
# sklearn-iris   http://sklearn-iris.models.example.com       True

# Test prediction
curl -X POST http://sklearn-iris.models.example.com/v1/models/sklearn-iris:predict \
  -H "Content-Type: application/json" \
  -d '{"instances": [[6.8, 2.8, 4.8, 1.4]]}'
```

## GPU-Enabled LLM InferenceService

```yaml
apiVersion: serving.kserve.io/v1beta1
kind: InferenceService
metadata:
  name: llama-3-8b
  namespace: models
  annotations:
    serving.kserve.io/enable-prometheus-scraping: "true"
spec:
  predictor:
    containers:
    - name: vllm-container
      image: vllm/vllm-openai:latest
      args:
      - "--model"
      - "meta-llama/Llama-3.1-8B-Instruct"
      - "--tensor-parallel-size"
      - "1"
      - "--gpu-memory-utilization"
      - "0.90"
      ports:
      - containerPort: 8080
        protocol: TCP
      resources:
        requests:
          nvidia.com/gpu: "1"
          memory: "20Gi"
          cpu: "4"
        limits:
          nvidia.com/gpu: "1"
          memory: "24Gi"
          cpu: "8"
      readinessProbe:
        httpGet:
          path: /health
          port: 8080
        initialDelaySeconds: 60
        periodSeconds: 10
      env:
      - name: HUGGING_FACE_HUB_TOKEN
        valueFrom:
          secretKeyRef:
            name: hf-token
            key: token
    nodeSelector:
      nvidia.com/gpu.present: "true"
  transformer:
    containers:
    - name: kserve-container
      image: kserve/kserve-transformer:latest
```

## Canary Deployment (Traffic Splitting)

```yaml
apiVersion: serving.kserve.io/v1beta1
kind: InferenceService
metadata:
  name: llama-3-8b
  namespace: models
spec:
  predictor:
    canaryTrafficPercent: 20    # 20% to new version, 80% to stable
    containers:
    - name: vllm-container
      image: vllm/vllm-openai:latest
      args:
      - "--model"
      - "meta-llama/Llama-3.1-8B-Instruct-v2"  # new model version
      resources:
        limits:
          nvidia.com/gpu: "1"
```

```bash
# Gradually increase canary traffic
kubectl patch inferenceservice llama-3-8b -n models \
  --type='json' \
  -p='[{"op":"replace","path":"/spec/predictor/canaryTrafficPercent","value":50}]'

# Promote canary to stable
kubectl patch inferenceservice llama-3-8b -n models \
  --type='json' \
  -p='[{"op":"remove","path":"/spec/predictor/canaryTrafficPercent"}]'
```

## Autoscaling with KEDA

```yaml
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: llama-scaler
  namespace: models
spec:
  scaleTargetRef:
    apiVersion: serving.kserve.io/v1beta1
    kind: InferenceService
    name: llama-3-8b
  minReplicaCount: 1
  maxReplicaCount: 5
  triggers:
  - type: prometheus
    metadata:
      serverAddress: http://prometheus-server.monitoring:9090
      metricName: kserve_request_count
      threshold: "10"
      query: |
        sum(rate(kserve_request_count_total{namespace="models",
            service="llama-3-8b"}[1m]))
```

## NVIDIA Triton Inference Server

```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: triton-server
  namespace: models
spec:
  replicas: 2
  selector:
    matchLabels:
      app: triton
  template:
    metadata:
      labels:
        app: triton
    spec:
      containers:
      - name: triton
        image: nvcr.io/nvidia/tritonserver:24.05-py3
        args:
        - "tritonserver"
        - "--model-store=s3://my-model-store/models"
        - "--model-control-mode=poll"        # auto-load new model versions
        - "--repository-poll-secs=30"
        - "--metrics-port=8002"
        ports:
        - containerPort: 8000   # HTTP
        - containerPort: 8001   # gRPC
        - containerPort: 8002   # Metrics
        resources:
          limits:
            nvidia.com/gpu: "1"
        readinessProbe:
          httpGet:
            path: /v2/health/ready
            port: 8000
          initialDelaySeconds: 30
```

## Triton Model Repository Structure

```
s3://my-model-store/models/
├── text-classifier/
│   ├── config.pbtxt
│   ├── 1/
│   │   └── model.onnx
│   └── 2/
│       └── model.onnx          # new version; auto-loaded
├── embedding-model/
│   ├── config.pbtxt
│   └── 1/
│       └── model.onnx
```

```protobuf
# config.pbtxt for ONNX model
name: "text-classifier"
backend: "onnxruntime"
max_batch_size: 64
dynamic_batching {
  preferred_batch_size: [16, 32]
  max_queue_delay_microseconds: 1000
}
input [
  { name: "input_ids" data_type: TYPE_INT64 dims: [-1] }
  { name: "attention_mask" data_type: TYPE_INT64 dims: [-1] }
]
output [
  { name: "logits" data_type: TYPE_FP32 dims: [-1] }
]
instance_group [
  { kind: KIND_GPU count: 2 }   # 2 model instances on GPU
]
```

## Model Management Commands

```bash
# List loaded models (Triton)
curl http://triton:8000/v2/models

# Load a new model version
curl -X POST http://triton:8000/v2/repository/models/text-classifier/load

# Unload a model
curl -X POST http://triton:8000/v2/repository/models/text-classifier/unload

# KServe — watch rollout status
kubectl rollout status deployment/llama-3-8b-predictor -n models
kubectl get inferenceservice llama-3-8b -n models -w
```

## Common Issues

| Issue | Cause | Fix |
|-------|-------|-----|
| `InferenceService not ready` | Model loading or OOM | Check predictor pod logs; increase memory limits |
| Canary stuck at 0% | KNative routing issue | Check `kubectl get ksvc -n models` |
| Triton missing model | S3 permissions or path | Verify IAM role; check `--model-store` path |
| Low GPU utilization | Dynamic batching off | Enable `dynamic_batching` in Triton config |
| Autoscaler not triggering | Prometheus query wrong | Test query in Prometheus UI |

## Best Practices

- Use canary deployments for all model updates — roll back in seconds if metrics degrade.
- Enable Triton dynamic batching — it can increase GPU throughput 5–10× for small models.
- Store models in S3/GCS with versioned paths (`s3://bucket/model/v1/`, `v2/`).
- Pin GPU node selectors to prevent model pods landing on CPU-only nodes.
- Monitor p99 latency and error rates per model version during canary rollouts.

## Related Skills

- [vllm-server](../../../infrastructure/local-ai/vllm-server/) - vLLM for LLM serving
- [llm-inference-scaling](../../../infrastructure/local-ai/llm-inference-scaling/) - KEDA autoscaling
- [kubernetes-ops](../kubernetes-ops/) - Core Kubernetes operations
- [gpu-server-management](../../../infrastructure/servers/gpu-server-management/) - GPU nodes

© devops-skills · MIT · BagelHole/DevOps-Security-Agent-Skills

Похожие скиллы

Всё по теме «DevOps и инфраструктура» →
model-deployment secondsky Скилл для вывода обученной модели в прод: FastAPI-сервер, Docker, Kubernetes, мониторинг и отлов дрейфа. Пригодится, когда модель уже готова, а сервинг ещё нет. CX Codex +1 379установок tao-run-on-kubernetes NVIDIA Corporation Отправляет контейнерные джобы TAO в Kubernetes как обычные Job через kubectl. Нужен, когда обучение или инференс надо запускать на EKS, GKE, AKS или своём кластере с GPU. CX Codex +1 1 600установок mlops-engineer Seth Hobson Помогает проектировать пайплайны машинного обучения, вести реестр моделей и автоматизировать деплой в облачной инфраструктуре. Пригодится при настройке MLOps-стека на AWS, Azure, GCP или OCI. CX Codex 1 009установок machine-learning-engineer VoltAgent Community Субагент помогает разворачивать, оптимизировать и обслуживать ML-модели в production. Подходит для задач инференса, масштабирования и мониторинга. 431установок ml-pipeline Seth Hobson Слэш-команда, которая ведёт сборку ML-пайплайна от анализа данных до мониторинга, раздавая этапы профильным субагентам. CX Codex ★ 41 729звёзд репо Radar Kubernetes MCP Server skyhook-io Даёт ИИ-агенту доступ к Kubernetes через встроенный MCP-сервер: он может изучать кластер, разбираться в проблемах и выполнять операции. CX Codex +1 ★ 3 905звёзд репо

Из того же набора127

gpu-kubernetes-operations Скилл для работы с GPU-кластерами Kubernetes: планирование подов, MIG-разделение, автоскейлинг и мониторинг через DCGM. CX Codex +1 329установок fedramp-compliance Скилл для команд, которые готовят облачный сервис к FedRAMP: раскладывает требования по уровням воздействия и семьям контролей NIST 800-53. CX Codex +1 328установок llm-app-security Набор проверок и правил для защиты чат-ботов, RAG-систем и AI-функций от инъекций промптов, утечек данных и атак по классификации OWASP LLM Top 10. CX Codex +1 327установок nfs-storage Скилл для настройки NFS: экспорт каталогов на сервере, монтирование на клиентах, autofs и правка параметров. CX Codex +1 328установок ai-sre-incident-response Скилл для SRE-практик вокруг LLM: падения провайдера, просадка качества, всплеск расходов на токены и срабатывания гардрейлов. CX Codex +1 328установок ai-security-hardening Защищает приложения на базе LLM от prompt injection, утечек данных и атак на цепочку поставок. Пригодится при выводе моделей в прод и подготовке к аудитам SOC2 или ISO 27001. CX Codex +1 326установок block-storage Скилл для работы с блочными устройствами: разметка дисков, LVM, файловые системы, снапшоты и тома AWS EBS. Пригодится, когда нужно расширить раздел на живом сервере. CX Codex +1 327установок pci-dss-compliance Скилл помогает разложить требования PCI DSS v4.0 по вашему проекту: выбрать SAQ, очертить CDE и настроить контроль доступа. CX Codex +1 327установок

Спонсоры проекта

Компании, которые помогают держать аналитику открытой