本地测试(无需 GPU)

在本地 KinD 或 Minikube 集群上,无需物理 NVIDIA GPU 即可测试 CastSlice Webhook 变更逻辑。你将在节点上模拟 GPU 容量,并验证注解触发的资源改写是否端到端正常工作。

ℹ️

本指南要求已安装 CastSlice。如尚未安装,请先参考快速开始指南。

步骤 1 — 模拟具有 nvidia.com/gpu 容量的节点

Kubernetes 不允许直接通过 kubectl patchstatus.capacity 添加任意扩展资源,因为 status 子资源受 API Server 保护。标准解决方案是通过 kubectl proxy 直接 PATCH 节点的原始 API

⚠️

此操作会修改集群中的节点状态,请仅在开发或本地集群中执行——切勿在生产环境中使用。

1
获取节点名称并启动 kubectl proxy
bash
# Get the first (or only) node name $ NODE=$(kubectl get nodes -o jsonpath='{.items[0].metadata.name}') $ echo "Patching node: $NODE" Patching node: kind-control-plane # Start proxy in background, save PID $ kubectl proxy & $ PROXY_PID=$! Starting to serve on 127.0.0.1:8001
2
Patch 节点状态以添加模拟 GPU 容量
bash
$ curl -s -X PATCH \ -H "Content-Type: application/json-patch+json" \ "http://localhost:8001/api/v1/nodes/${NODE}/status" \ --data '[ {"op":"add","path":"/status/capacity/nvidia.com~1gpu","value":"4"}, {"op":"add","path":"/status/allocatable/nvidia.com~1gpu","value":"4"} ]' # Stop the proxy $ kill $PROXY_PID

执行后,节点将宣告拥有 4 个模拟的 nvidia.com/gpu 资源。Kubernetes 会将请求 GPU 资源的 Pod 调度到此节点。

3
验证模拟容量已生效
bash
$ kubectl describe node ${NODE} | grep -A 8 "Capacity:" Capacity: nvidia.com/gpu: 4 cpu: 8 memory: 16316112Ki pods: 110 Allocatable: nvidia.com/gpu: 4
节点现在报告有 4 × nvidia.com/gpu 可用

步骤 2 — 应用测试 Pod

仓库中包含一个预制的测试 Pod,位于 docs/test-pod.yaml,它请求 GPU 并包含 castops.io/optimize: "true" 注解。

4
创建测试 Pod
bash
$ kubectl apply -f docs/test-pod.yaml pod/gpu-test-pod created

Pod 规格请求 nvidia.com/gpu: 1 并带有选择性注解。CastSlice 拦截 CREATE 准入请求,在 Pod 持久化之前完成改写。

步骤 3 — 验证变更

检查实际存储的资源规格——这是 CastSlice 写入的内容,而非你提交的内容。

5
检查存储的资源限制
bash
$ kubectl get pod gpu-test-pod \ -o jsonpath='{.spec.containers[0].resources}' | jq . { "limits": { "nvidia.com/gpu-shared": "1", "memory": "4Gi" }, "requests": { "memory": "4Gi" } }
nvidia.com/gpu 已消失——被 nvidia.com/gpu-shared: 1 替代

变更已确认。 Webhook 拦截了 CREATE 请求,检测到选择性注解,并在 Pod 持久化到 etcd 之前通过 JSON Patch 改写了资源限制。

故障排查

Pod 应用后一直处于 Pending 状态

如果模拟节点上也没有 nvidia.com/gpu-shared 资源,Pod 将无法调度(因为集群中没有任何节点拥有该资源)。如果只是测试 Webhook 变更,可以在 kubectl apply 后立即检查存储的规格——Pod 无需达到 Running 状态即可验证变更是否发生。

bash — 如果变更未发生,检查 webhook 日志
$ kubectl logs -n cast-slice deploy/cast-slice

Webhook 未执行变更

请检查以下几点:

curl: (7) Failed to connect to localhost:8001

kubectl proxy 可能已被终止,或端口不同。重新运行 kubectl proxy & 并确认其报告的端口。