从云原生走向 AI 原生:一套面向未来的架构方法论 → 阅读《AI 原生基础设施》

生产环境部署

已发行

生产环境部署需要关注高可用、安全、容量规划和升级策略,确保 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内存副本数
Scheduler500m-1000m512Mi-1Gi2-3
Device Plugin200m-500m256Mi-512MiDaemonSet
Webhook200m-500m256Mi-512Mi2
Monitor200m-500m256Mi-512Mi1-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: 1Gi

Webhook 高可用

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< 20500m512Mi
中型10-5020-1001 core1Gi
大型50-200100-5002 core2Gi
超大> 200> 5004 core4Gi

升级策略

滚动升级

# 升级前检查
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 滚动升级和回滚
  • 最佳实践:生产部署检查清单

参考资料

创建于 2026/06/04 更新于 2026/06/05 1543 字 阅读约 4 分钟