关于 gpu-kubernetes-operations
gpu-kubernetes-operations 是面向 Kubernetes 平台运维人员的 GPU 集群操作技能,涵盖设备管理、共享、监控、自动伸缩和故障排查。
主要功能
- 01部署 NVIDIA GPU Operator 或设备插件
- 02配置 MIG 分区与 GPU 时间切片
- 03监控 GPU 健康状况和指标
- 04配置 GPU 节点池与自动伸缩
- 05排查调度、驱动和显存问题
适用场景
- 01为 AI 推理或训练配置 GPU 节点池
- 02在工作负载间共享 GPU
- 03监控生产 GPU 集群并设置告警
- 04诊断 Pod 无法调度或 GPU 故障
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ bagelhole/ devops-security-agent-skills --skill gpu-kubernetes-operations安装后在 Claude Code 中输入/gpu-kubernetes-operations确认已加载。
详细介绍
GPU Kubernetes 运维
为生产环境 AI 工作负载运行高韧性、高成本效益的 GPU 集群。
适用场景
- 在 Kubernetes 中为 AI 推理或训练设置 GPU 节点池
- 配置 NVIDIA device plugin 和 GPU operator
- 实施 MIG 分区,让多个工作负载共享 GPU
- 构建 GPU 感知的自动扩缩策略
- 使用 DCGM 和 Prometheus 监控 GPU 健康状况
- 排查 GPU 调度、驱动或 OOM 问题
前提条件
- 配备 GPU 节点的 Kubernetes 1.28+ 集群
- NVIDIA GPU(A10、L4、A100、H100 或类似型号)
- 节点上已安装 NVIDIA 驱动(推荐 535+)
- 用于安装 operator 和插件的 Helm 3
- 用于收集指标的 Prometheus 技术栈
安装 NVIDIA GPU Operator
GPU Operator 可自动部署驱动、工具包、device plugin 和 DCGM。
# Add NVIDIA Helm repo
helm repo add nvidia https://helm.ngc.nvidia.com/nvidia
helm repo update
# Install GPU Operator
helm install gpu-operator nvidia/gpu-operator \
--namespace gpu-operator \
--create-namespace \
--set driver.enabled=true \
--set toolkit.enabled=true \
--set devicePlugin.enabled=true \
--set dcgmExporter.enabled=true \
--set migManager.enabled=true \
--set nodeStatusExporter.enabled=true \
--version v24.3.0
# Verify installation
kubectl get pods -n gpu-operator
kubectl get nodes -o json | jq '.items[].status.allocatable["nvidia.com/gpu"]'
NVIDIA Device Plugin(独立部署)
如果不使用 GPU Operator,可直接部署 device plugin。
# nvidia-device-plugin.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: nvidia-device-plugin
namespace: kube-system
spec:
selector:
matchLabels:
name: nvidia-device-plugin
template:
metadata:
labels:
name: nvidia-device-plugin
spec:
tolerations:
- key: nvidia.com/gpu
operator: Exists
effect: NoSchedule
priorityClassName: system-node-critical
containers:
- name: nvidia-device-plugin
image: nvcr.io/nvidia/k8s-device-plugin:v0.15.0
securityContext:
privileged: true
env:
- name: FAIL_ON_INIT_ERROR
value: "false"
- name: DEVICE_SPLIT_COUNT
value: "1"
- name: DEVICE_LIST_STRATEGY
value: "envvar"
volumeMounts:
- name: device-plugin
mountPath: /var/lib/kubelet/device-plugins
volumes:
- name: device-plugin
hostPath:
path: /var/lib/kubelet/device-plugins
MIG(多实例 GPU)分区
MIG 可以将单个 A100 或 H100 划分为相互隔离的 GPU 实例。
# mig-config.yaml - ConfigMap for MIG Manager
apiVersion: v1
kind: ConfigMap
metadata:
name: mig-parted-config
namespace: gpu-operator
data:
config.yaml: |
version: v1
mig-configs:
# 7 small instances for inference microservices
all-1g.10gb:
- devices: all
mig-enabled: true
mig-devices:
"1g.10gb": 7
# 3 medium instances for mid-size models
all-2g.20gb:
- devices: all
mig-enabled: true
mig-devices:
"2g.20gb": 3
# Mixed: 1 large + 2 small
mixed-inference:
- devices: all
mig-enabled: true
mig-devices:
"3g.40gb": 1
"1g.10gb": 4
# Full GPU for training (no partitioning)
all-disabled:
- devices: all
mig-enabled: false
# Apply MIG profile to a node
kubectl label nodes gpu-node-01 nvidia.com/mig.config=all-1g.10gb --overwrite
# Verify MIG instances
kubectl exec -it nvidia-device-plugin-xxxxx -n kube-system -- nvidia-smi mig -lgi
# Check available MIG resources
kubectl get nodes gpu-node-01 -o json | jq '.status.allocatable | with_entries(select(.key | startswith("nvidia.com")))'
在 Pod 中请求 MIG 切片
# pod-with-mig.yaml
apiVersion: v1
kind: Pod
metadata:
name: inference-small
spec:
containers:
- name: model
image: registry.internal/vllm-server:latest
resources:
limits:
nvidia.com/mig-1g.10gb: 1
# For medium slice:
# nvidia.com/mig-2g.20gb: 1
# For large slice:
# nvidia.com/mig-3g.40gb: 1
GPU 时间切片
对于不支持 MIG 的 GPU(A10、L4),可使用时间切片共享 GPU。
# time-slicing-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: time-slicing-config
namespace: gpu-operator
data:
any: |-
version: v1
flags:
migStrategy: none
sharing:
timeSlicing:
renameByDefault: false
failRequestsGreaterThanOne: false
resources:
- name: nvidia.com/gpu
replicas: 4
# Apply time-slicing config
kubectl patch clusterpolicy/cluster-policy \
--type merge \
-p '{"spec":{"devicePlugin":{"config":{"name":"time-slicing-config","default":"any"}}}}'
# After applying, each physical GPU appears as 4 virtual GPUs
kubectl get nodes -o json | jq '.items[].status.allocatable["nvidia.com/gpu"]'
# Output: "4" per physical GPU
DCGM 监控
# dcgm-servicemonitor.yaml
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: dcgm-exporter
namespace: gpu-operator
labels:
release: prometheus
spec:
selector:
matchLabels:
app: nvidia-dcgm-exporter
endpoints:
- port: gpu-metrics
interval: 15s
path: /metrics
关键 DCGM 指标和告警规则
# gpu-alerts.yaml
groups:
- name: gpu-health
rules:
- alert: GPUHighTemperature
expr: DCGM_FI_DEV_GPU_TEMP > 85
for: 5m
labels:
severity: warning
annotations:
summary: "GPU {{ $labels.gpu }} temperature above 85C on {{ $labels.node }}"
- alert: GPUMemoryPressure
expr: (DCGM_FI_DEV_FB_USED / DCGM_FI_DEV_FB_FREE) > 0.90
for: 5m
labels:
severity: warning
annotations:
summary: "GPU memory above 90% on {{ $labels.node }} GPU {{ $labels.gpu }}"
- alert: GPUECCErrors
expr: increase(DCGM_FI_DEV_ECC_DBE_VOL_TOTAL[1h]) > 0
labels:
severity: critical
annotations:
summary: "Double-bit ECC errors detected on {{ $labels.node }} GPU {{ $labels.gpu }}"
- alert: GPUXidErrors
expr: increase(DCGM_FI_DEV_XID_ERRORS[5m]) > 0
labels:
severity: warning
annotations:
summary: "Xid error on {{ $labels.node }} GPU {{ $labels.gpu }}: {{ $labels.xid }}"
- alert: GPULowUtilization
expr: DCGM_FI_DEV_GPU_UTIL < 10 and on(pod) kube_pod_status_phase{phase="Running"} == 1
for: 30m
labels:
severity: info
annotations:
summary: "GPU underutilized on {{ $labels.node }} - consider rightsizing"
- alert: GPUDriverMismatch
expr: count(count by (driver_version)(DCGM_FI_DRIVER_VERSION)) > 1
labels:
severity: warning
annotations:
summary: "Multiple GPU driver versions detected across cluster"
GPU 节点池配置
# gpu-nodepool.yaml
apiVersion: v1
kind: Node
metadata:
labels:
gpu-type: a100
gpu-memory: "80gb"
gpu-mig-capable: "true"
node-role: gpu-inference
spec:
taints:
- key: nvidia.com/gpu
value: "true"
effect: NoSchedule
---
# Inference deployment with GPU scheduling
apiVersion: apps/v1
kind: Deployment
metadata:
name: llm-inference
namespace: ai-serving
spec:
replicas: 3
selector:
matchLabels:
app: llm-inference
template:
metadata:
labels:
app: llm-inference
spec:
tolerations:
- key: nvidia.com/gpu
operator: Exists
effect: NoSchedule
nodeSelector:
gpu-type: a100
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchLabels:
app: llm-inference
topologyKey: kubernetes.io/hostname
containers:
- name: vllm
image: registry.internal/vllm-server:0.4.1
resources:
requests:
nvidia.com/gpu: 1
cpu: "4"
memory: "32Gi"
limits:
nvidia.com/gpu: 1
cpu: "8"
memory: "64Gi"
env:
- name: CUDA_VISIBLE_DEVICES
value: "all"
GPU 自动扩缩
# gpu-hpa.yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: llm-inference-hpa
namespace: ai-serving
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: llm-inference
minReplicas: 2
maxReplicas: 8
metrics:
- type: Pods
pods:
metric:
name: DCGM_FI_DEV_GPU_UTIL
target:
type: AverageValue
averageValue: "75"
- type: Pods
pods:
metric:
name: inference_queue_depth
target:
type: AverageValue
averageValue: "10"
behavior:
scaleUp:
stabilizationWindowSeconds: 60
policies:
- type: Pods
value: 2
periodSeconds: 120
scaleDown:
stabilizationWindowSeconds: 300
policies:
- type: Pods
value: 1
periodSeconds: 300
---
# Cluster Autoscaler config for GPU node pools
apiVersion: v1
kind: ConfigMap
metadata:
name: cluster-autoscaler-config
namespace: kube-system
data:
config: |
expander: priority
scale-down-delay-after-add: 10m
scale-down-unneeded-time: 10m
skip-nodes-with-local-storage: false
balance-similar-node-groups: true
expendable-pods-priority-cutoff: -10
gpu-total:
- min: 2
max: 16
gpu: nvidia.com/gpu
调度模式
- 按 GPU 类型(A10/L4/A100/H100)使用节点亲和性。
- 将延迟敏感型推理与批量训练分开。
- 为副本设置反亲和性,确保可用性。
- 为故障转移和滚动更新预留余量。
成本优化
- 对较小的推理服务优先使用 MIG 切片。
- 在非高峰时段安排批处理作业。
- 将低优先级流量路由到成本更低的模型层级。
- 对训练工作负载使用竞价/可抢占实例。
- 监控 GPU 利用率并合理调整部署规模。
故障排除
| 症状 | 检查项 | 解决方法 |
|---|---|---|
| Pod 卡在 Pending 状态 | 使用 kubectl describe pod 检查 GPU 资源事件 | 确认节点有可分配的 GPU,并检查污点/容忍度 |
| 推理期间 CUDA OOM | 模型超出 GPU 显存容量 | 减小批量大小、使用量化或使用 MIG 切片 |
| 缺少 DCGM 指标 | ServiceMonitor 标签是否匹配 | 确认 DCGM exporter Pod 正在运行,并检查抓取配置 |
| 升级后驱动不匹配 | 在每个节点上运行 nvidia-smi | 封锁节点、排空节点、升级驱动,然后解除封锁 |
| 未检测到 GPU | Device plugin Pod 日志 | 重启 device plugin,并检查 NVIDIA container toolkit |
| 时间切片未生效 | ConfigMap 已应用,但没有额外 GPU | 配置变更后重启 device plugin Pod |
| ECC 错误增加 | nvidia-smi -q -d ECC | 安排排空节点并更换硬件 |
相关技能
- llm-inference-scaling - 自动扩缩推理工作负载
- model-serving-kubernetes - 生产环境模型服务模式
- gpu-server-management - 主机级 GPU 管理基础知识
- multi-tenant-llm-hosting - 多租户 GPU 共享
- llm-cost-optimization - 成本优化策略
评论
支持 Markdown