生产环境部署
已发行
生产环境部署需要关注高可用、安全、容量规划和升级策略,确保 GPU 资源管理平台的稳定运行。
生产环境架构
推荐拓扑
┌─────────────────────────────────────────────────────┐
│ Kubernetes Control Plane │
└─────────────────────────────────────────────────────┘
│
┌──────────────┼──────────────┐
▼ ▼ ▼
┌───────────┐ ┌───────────┐ ┌───────────┐
│ Master-1 │ │ Master-2 │ │ Master-3 │
│ │ │ │ │ │
│ Scheduler │ │ Scheduler │ │ Scheduler │
│ (Leader) │ │ (Standby) │ │ (Standby) │
│ Webhook │ │ Webhook │ │ Webhook │
│ Monitor │ │ │ │ │
└───────────┘ └───────────┘ └───────────┘
│ │ │
┌─────┴──────────────┴──────────────┴────┐
│ GPU Worker Nodes │
│ ┌────────┐ ┌────────┐ ┌────────┐ │
│ │ Node-1 │ │ Node-2 │ │ Node-3 │ ... │
│ │ DP+GPU │ │ DP+GPU │ │ DP+GPU │ │
│ └────────┘ └────────┘ └────────┘ │
└────────────────────────────────────────┘- 调度器:2-3 副本,领导者选举,确保高可用
- Webhook:2 副本,确保准入控制不中断
- 设备插件:DaemonSet,每个加速器节点一个
- Monitor:1-2 副本,指标采集
资源规划
| 组件 | CPU | 内存 | 副本数 |
|---|---|---|---|
| Scheduler | 500m-1000m | 512Mi-1Gi | 2-3 |
| Device Plugin | 200m-500m | 256Mi-512Mi | DaemonSet |
| Webhook | 200m-500m | 256Mi-512Mi | 2 |
| Monitor | 200m-500m | 256Mi-512Mi | 1-2 |
高可用配置
调度器高可用
scheduler:
replicas: 3
# 领导者选举(默认启用)
leaderElection:
enabled: true
leaseDuration: 15s
renewDeadline: 10s
retryPeriod: 2s
# 反亲和性,调度器 Pod 分散到不同节点
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchLabels:
app: hami-scheduler
topologyKey: kubernetes.io/hostname
# 资源限制
resources:
requests:
cpu: 500m
memory: 512Mi
limits:
cpu: "1"
memory: 1GiWebhook 高可用
webhook:
replicas: 2
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchLabels:
app: hami-webhook
topologyKey: kubernetes.io/hostname设备插件
设备插件以 DaemonSet 运行,天然具备高可用,节点级别的故障不影响其他节点。
devicePlugin:
# DaemonSet 自动调度到每个 GPU 节点
tolerations:
- key: nvidia.com/gpu
operator: Exists
effect: NoSchedule安全配置
RBAC 权限
HAMi 自动创建所需 RBAC 权限:
# 调度器需要的权限
rules:
- apiGroups: [""]
resources: ["pods", "nodes", "namespaces"]
verbs: ["get", "list", "watch"]
- apiGroups: [""]
resources: ["pods/binding"]
verbs: ["create"]
- apiGroups: [""]
resources: ["pods"]
verbs: ["patch", "update"]TLS 证书
webhook:
certManager:
enabled: true # 推荐:自动签发和轮换证书网络策略
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: hami-system-policy
namespace: hami-system
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
ingress:
- from:
- namespaceSelector:
matchLabels:
name: hami-system
- namespaceSelector:
matchLabels:
name: monitoring
egress:
- to:
- namespaceSelector: {} # 允许访问 API Server生产级 Helm 配置
# production-values.yaml
global:
imageRegistry: ""
imagePullSecrets: []
scheduler:
enabled: true
replicas: 3
image:
repository: projecthami/hami
tag: v2.5.0
pullPolicy: IfNotPresent
policy:
nodeSchedulerPolicy: binpack
gpuSchedulerPolicy: binpack
overcommit:
enabled: true
deviceMemoryScaling: 1.0
resources:
requests:
cpu: 500m
memory: 512Mi
limits:
cpu: "1"
memory: 1Gi
priorityClassName: system-cluster-critical
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchLabels:
app: hami-scheduler
topologyKey: kubernetes.io/hostname
devicePlugin:
enabled: true
image:
repository: projecthami/hami
tag: v2.5.0
nvidia:
enabled: true
splitCount: 10
memory:
scaling: 1.0
migStrategy: "none"
resources:
requests:
cpu: 200m
memory: 256Mi
limits:
cpu: 500m
memory: 512Mi
webhook:
enabled: true
replicas: 2
certManager:
enabled: true
resources:
requests:
cpu: 200m
memory: 256Mi
limits:
cpu: 500m
memory: 512Mi
monitor:
enabled: true
serviceMonitor:
enabled: true
namespace: monitoring
interval: 15s
resources:
requests:
cpu: 200m
memory: 256Mi
limits:
cpu: 500m
memory: 512Mi容量规划
GPU 资源评估
评估公式:
所需 GPU 数量 = SUM(每种场景的 Pod 数 × 每 Pod 显存) / (每张 GPU 显存 × 目标利用率)
示例:
- 推理场景:100 Pod × 4GB = 400GB
- A100 GPU:80GB × 80% 利用率 = 64GB 可用
- 所需 GPU = 400GB / 64GB ≈ 7 张调度器性能估算
| 集群规模 | 节点数 | GPU 数 | 调度器 CPU | 调度器内存 |
|---|---|---|---|---|
| 小型 | < 10 | < 20 | 500m | 512Mi |
| 中型 | 10-50 | 20-100 | 1 core | 1Gi |
| 大型 | 50-200 | 100-500 | 2 core | 2Gi |
| 超大 | > 200 | > 500 | 4 core | 4Gi |
升级策略
滚动升级
# 升级前检查
helm list -n hami-system
kubectl get pods -n hami-system
# 执行升级
helm repo update
helm upgrade hami hami-charts/hami -n hami-system -f production-values.yaml
# 监控升级过程
kubectl rollout status deployment/hami-scheduler -n hami-system
kubectl rollout status deployment/hami-webhook -n hami-system回滚
# 查看历史版本
helm history hami -n hami-system
# 回滚到指定版本
helm rollback hami 1 -n hami-system升级注意事项
- 调度器滚动升级期间,正在运行的 Pod 不受影响
- 设备插件升级会导致该节点 GPU 短暂不可用,逐节点升级
- Webhook 升级期间新 Pod 创建可能短暂失败
- 升级前在测试环境验证
最佳实践清单
- 调度器 2-3 副本 + 反亲和性
- Webhook 2 副本 + 反亲和性
- cert-manager 自动管理 TLS 证书
- 配置资源限制(CPU/内存)
- 设置 priorityClassName 为 system-cluster-critical
- 启用 ServiceMonitor 对接 Prometheus
- 配置 Pod 反亲和性分散部署
- 规划命名空间配额
- 准备告警规则
- 升级前备份 values.yaml
小结
本章介绍了 HAMi 的生产环境部署:
- 高可用架构:多副本 + 领导者选举 + 反亲和性
- 安全配置:RBAC、TLS、网络策略
- 容量规划:GPU 资源评估和调度器性能估算
- 升级策略:Helm 滚动升级和回滚
- 最佳实践:生产部署检查清单