本地测试(无需 GPU)
在本地 KinD 或 Minikube 集群上,无需物理 NVIDIA GPU 即可测试 CastSlice Webhook 变更逻辑。你将在节点上模拟 GPU 容量,并验证注解触发的资源改写是否端到端正常工作。
本指南要求已安装 CastSlice。如尚未安装,请先参考快速开始指南。
步骤 1 — 模拟具有 nvidia.com/gpu 容量的节点
Kubernetes 不允许直接通过 kubectl patch 向 status.capacity 添加任意扩展资源,因为 status 子资源受 API Server 保护。标准解决方案是通过 kubectl proxy 直接 PATCH 节点的原始 API。
此操作会修改集群中的节点状态,请仅在开发或本地集群中执行——切勿在生产环境中使用。
执行后,节点将宣告拥有 4 个模拟的 nvidia.com/gpu 资源。Kubernetes 会将请求 GPU 资源的 Pod 调度到此节点。
nvidia.com/gpu 可用步骤 2 — 应用测试 Pod
仓库中包含一个预制的测试 Pod,位于 docs/test-pod.yaml,它请求 GPU 并包含 castops.io/optimize: "true" 注解。
Pod 规格请求 nvidia.com/gpu: 1 并带有选择性注解。CastSlice 拦截 CREATE 准入请求,在 Pod 持久化之前完成改写。
步骤 3 — 验证变更
检查实际存储的资源规格——这是 CastSlice 写入的内容,而非你提交的内容。
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 状态即可验证变更是否发生。
Webhook 未执行变更
请检查以下几点:
- Pod(或 Pod 模板)的
metadata.annotations中包含castops.io/optimize: "true" - CastSlice 正在运行:
kubectl get pods -n cast-slice - Webhook 已注册:
kubectl get mutatingwebhookconfigurations - cert-manager 已签发证书:
kubectl get certificate -n cast-slice
curl: (7) Failed to connect to localhost:8001
kubectl proxy 可能已被终止,或端口不同。重新运行 kubectl proxy & 并确认其报告的端口。