在 DigitalOcean Kubernetes Service (DOKS) 上运行 llm-d
本文档涵盖了为使用 llm-d 运行高性能 LLM 推理而配置 DOKS 集群的内容。
先决条件
llm-d 在 DOKS 上已针对以下配置进行了测试
- GPU 类型:NVIDIA H100, NVIDIA RTX 6000 Ada, NVIDIA RTX 4000 Ada, NVIDIA L40S
- 版本:DOKS 1.33.1-do.3
- 网络:VPC 原生集群(必需)
配置架构
DigitalOcean 部署遵循清晰的配置原则
- 基础配置:
values.yaml文件保持原始设计意图,采用高端规格 - 平台覆盖:
digitalocean-values.yaml文件仅包含针对 DigitalOcean 的特定修改 - 条件加载:通过使用
digitalocean环境选择性地应用 DigitalOcean 覆盖配置
这种方法可确保:
- 其他平台的原始配置保持不变
- DigitalOcean 的优化是隔离且易于维护的
- 基础架构与平台适配之间界限清晰
集群配置
DOKS 集群应配置以下设置
- 启用 GPU 的节点池,至少包含 2 个 GPU 节点
- VPC 原生网络(新集群的默认设置)
- 已配置 kubectl 用于集群访问
GPU 驱动管理
DigitalOcean 会在 DOKS 集群上自动安装并管理 GPU 驱动
- NVIDIA 设备插件:自动安装,用于 GPU 发现和调度
- 驱动更新:与集群更新同步进行托管
- GPU 监控:通过 DCGM Exporter 进行内置指标收集
验证 GPU 自动设置
kubectl get pods -n nvidia-device-plugin-system
kubectl get nodes -o custom-columns="NAME:.metadata.name,GPU:.status.allocatable.nvidia\.com/gpu"
快速入门
步骤 1:安装先决条件
在部署 llm-d 工作负载之前,请安装所需的组件
# Navigate to gateway provider prerequisites
cd guides/prereq/gateway-provider
# Install Gateway API and Inference Extension CRDs
./install-gateway-provider-dependencies.sh
# Install Istio control plane
helmfile apply -f istio.helmfile.yaml
步骤 2:集群验证
验证您的集群设置
# Verify cluster access and GPU nodes
kubectl cluster-info
kubectl get nodes -l doks.digitalocean.com/gpu-brand=nvidia
# Verify components are ready
kubectl get pods -n istio-system
步骤 3:部署工作负载
使用 digitalocean 环境自动加载 DigitalOcean 特定的值覆盖
# For inference scheduling (2 decode pods)
cd guides/inference-scheduling
export NAMESPACE=llm-d-inference-scheduling
helmfile apply -e digitalocean -n ${NAMESPACE}
自动应用的 key DigitalOcean 优化点
- 更小的模型:使用
Qwen3-0.6B(推理调度),不需要 HuggingFace 令牌 - 稳定镜像:使用生产就绪的
ghcr.io/llm-d/llm-d:v0.2.0而非开发版本 - DOKS 优化资源:降低了内存/CPU 需求,适用于 DOKS GPU 节点
- GPU 容忍度:在带有
nvidia.com/gpu污点的 DigitalOcean GPU 节点上自动调度 - 无 RDMA:移除了 DOKS 上不具备的 InfiniBand 需求
架构概览
- 推理调度:通过 InferencePool 进行智能路由的 2 个解码 Pod
步骤 4:测试
验证部署是否成功
# Check deployment status for inference scheduling
kubectl get pods -n llm-d-inference-scheduling
kubectl get gateway -n llm-d-inference-scheduling
# Test inference endpoint (inference scheduling example)
kubectl port-forward -n llm-d-inference-scheduling svc/infra-inference-scheduling-inference-gateway-istio 8080:80
curl -X POST https://:8080/v1/chat/completions \
-H "Content-Type: application/json" \
-d '`{"model": "Qwen/Qwen3-0.6B", "messages": [{"role": "user", "content": "hello"}`], "max_tokens": 20}'
监控(可选)
部署 Prometheus 和 Grafana 以实现可观测性
cd monitoring
./setup-monitoring.sh
# Access Grafana dashboard
kubectl port-forward -n llm-d-monitoring svc/prometheus-grafana 3000:80
我们建议启用监控栈以跟踪:
- 每个部署的 GPU 利用率
- 推理请求的延迟和吞吐量
- 内存使用情况和 KV 缓存效率
- 推理 Pod 之间的网络性能
DigitalOcean 特定配置详情
模型选择
DigitalOcean 部署使用更小、经过优化的模型
| 架构 | 原始模型 | DigitalOcean 模型 | 优势 |
|---|---|---|---|
| 推理调度 | Qwen3-0.6B + HF 令牌 | Qwen3-0.6B (无需令牌) | 无需身份验证 |
资源优化
DigitalOcean 部署自动为 DOKS GPU 节点优化资源分配
- 降低内存:使用 16Gi 而非 64Gi 以实现更好的节点利用率
- 优化 CPU:每个 Pod 使用 4 核而非 16 核
- 单 GPU:每个 Pod 使用 1 个 GPU(最适合 DOKS 节点规格)
- 无 RDMA:移除了 DOKS 上不具备的 InfiniBand 需求
GPU 节点配置
DigitalOcean DOKS GPU 节点使用污点 (taints) 以防止非 GPU 工作负载被调度
# Automatically applied tolerations
tolerations:
- key: "nvidia.com/gpu"
operator: "Exists"
effect: "NoSchedule"
架构差异
DOKS 上的推理调度
- 带有 InferencePool 路由的 2 个解码 Pod
- 每个 Pod 单 GPU(最适合 DOKS 节点规格)
- 智能请求分发
故障排除
常见问题
1. 部署期间出现 CRD 未找到错误
错误:resource mapping not found for name: "..." kind: "Gateway"
原因:部署前未安装所需的 CRD
解决方案:在进行任何 helmfile 部署之前先安装 CRD
cd guides/prereq/gateway-provider
./install-gateway-provider-dependencies.sh
helmfile apply -f istio.helmfile.yaml
2. LoadBalancer 处于 Pending 状态或 API 错误
错误:LoadBalancer 卡在 <pending> 状态并伴有 API 错误
原因:DigitalOcean API 速率限制或并发负载均衡器操作
解决方案:
# Check LoadBalancer status
kubectl describe svc <service-name> -n <namespace>
# Wait for API operations to complete (typically 2-3 minutes)
# Sequential deployments avoid conflicts
3. Pod 无法调度到 GPU 节点
错误:untolerated taint {nvidia.com/gpu}
原因:DigitalOcean GPU 节点具有自动污点,以防止非 GPU 工作负载
解决方案:DigitalOcean 的 values 自动包含所需的容忍度 (tolerations)。请验证它们是否已应用
kubectl describe pod <pod-name> -n <namespace> | grep Tolerations
# Should show:
# Tolerations: nvidia.com/gpu:NoSchedule op=Exists
如果缺少容忍度,请确保您使用了会加载 DigitalOcean 覆盖配置的 digitalocean 环境。
4. Gateway 未编程 (Not Programmed)
错误:Gateway 显示 PROGRAMMED: False
解决方案:验证 Istio 是否正在运行且 LoadBalancer IP 是否已分配
kubectl get pods -n istio-system
kubectl get gateway -n <namespace>
清理
# Remove specific deployment
export NAMESPACE=llm-d-inference-scheduling
helmfile destroy -e digitalocean -n ${NAMESPACE}
# Remove prerequisites (affects all deployments)
cd guides/prereq/gateway-provider
helmfile destroy -f istio.helmfile.yaml
./install-gateway-provider-dependencies.sh delete
配置文件参考
基础配置(未修改)
guides/inference-scheduling/ms-inference-scheduling/values.yaml
DigitalOcean 覆盖配置(平台特定)
guides/inference-scheduling/ms-inference-scheduling/digitalocean-values.yaml
Helmfile 配置
- 使用
digitalocean环境有条件地加载 DigitalOcean 覆盖配置 - 仅在明确使用
-e digitalocean时应用平台特定配置 - 遵循具有适当环境隔离的清晰配置架构原则
有关详细配置选项和高级设置,请参阅主 llm-d 指南。
此内容自动从 llm-d/llm-d 仓库 main 分支的 docs/infra-providers/digitalocean/README.md 同步。