

总的来说,Karpenter 是一个强大的工具,能够帮助用户更高效、更经济地管理 Kubernetes 集群的资源配置。
在 AKS 的深度学习推理中,我们可以用 SpotVM 当成 AKS 的 worker 节点。

把多个 SpotVM 作为 AKS 的 worker node,然后针对 GPU 推理的 K8S SVC 在多个 worker node 上创建多个副本,那么即使一个 worker node 被驱逐,业务也不受影响;如果能承受短时可能的短暂的业务中断,一个 pod 也可以,Karpenter 发现 worker 节点被驱逐,能将 pod 在其他节点重启。多 pod 副本需要使用 SVC 和 K8S 的 ingress。

创建多个 Node pool,其中一个 node pool 使用 spotvm,另外一个 nodepool 可以使用正常的 GPU VM。然后针对不同的 nodepool 设置不同的 weight。这样 GPU pod 的 deployment 就会先选择 weight 高的 pool 进行部署。
参照如下链接部署好一个支持Karpenter的AKS。
🔗 https://learn.microsoft.com/en-us/azure/aks/node-autoprovision?tabs=azure-cli
然后创建一个GPU pod的deployment,初始副本数设置为1:
xinyu [ ~ ]$ kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGEsamples-gpu 0/1 1 0 2m24s
此时 Azure 开始创建 spot gpu vm,如下所示:

xinyu [ ~ ]$ kubectl get nodeclaims.karpenter.sh
NAME TYPE ZONE NODE READY AGEgpu-spot-57p8w Standard_NC24ads_A100_v4 southeastasia-2 False 2m18s
xinyu [ ~ ]$ kubectl describe deployment samples-gpu
Name: samples-gpuNamespace: defaultCreationTimestamp: Sun, 24 Mar 2024 02:06:56 +0000Labels: app=samples-tf-mnist-demoAnnotations: deployment.kubernetes.io/revision: 1Selector: app=samples-tf-mnist-demoReplicas: 1 desired | 1 updated | 1 total | 0 available | 1 unavailableStrategyType: RollingUpdateMinReadySeconds: 0RollingUpdateStrategy: 25% max unavailable, 25% max surgePod Template:Labels: app=samples-tf-mnist-demoContainers:samples-tf-mnist-demo:Image: mcr.microsoft.com/azuredocs/samples-tf-mnist-demo:gpuPort: <none>Host Port: <none>Args:--max_steps50000Limits:nvidia.com/gpu: 1Environment: <none>Mounts: <none>Volumes: <none>Conditions:Type Status Reason---- ------ ------Available False MinimumReplicasUnavailableProgressing True ReplicaSetUpdatedOldReplicaSets: <none>NewReplicaSet: samples-gpu-95b9c58b6 (1/1 replicas created)Events:Type Reason Age From Message---- ------ ---- ---- -------Normal ScalingReplicaSet 2m42s deployment-controller Scaled up replica set samples-gpu-95b9c58b6 to 1
大约2-3分钟,查看 AKS 节点,已经多个一个 GPU VM。
xinyu [ ~ ]$ kubectl get nodes
NAME STATUS ROLES AGE VERSIONaks-gpu-spot-57p8w Ready agent 33s v1.27.9aks-nodepool1-34768744-vmss000000 Ready agent 54m v1.27.9aks-nodepool1-34768744-vmss000001 Ready agent 54m v1.27.9aks-nodepool1-34768744-vmss000002 Ready agent 54m v1.27.9
xinyu [ ~ ]$ kubectl get pods
NAME READY STATUS RESTARTS AGEsamples-gpu-95b9c58b6-nbg8g 1/1 Running 0 4m10s
登录 pod,查看其中的 GPU 资源:
xinyu [ ~ ]$ kubectl exec -ti samples-gpu-95b9c58b6-nbg8g -- bin/sh
NAME READY UP-TO-DATE AVAILABLE AGEsamples-gpu 0/1 1 0 2m24s

xinyu [ ~ ]$ kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGEsamples-gpu 1/1 1 1 4m56s
将 GPU Pod 的副本数增加为2:
xinyu [ ~ ]$ kubectl scale deployment samples-gpu --replicas=2
deployment.apps/samples-gpu scaled
xinyu [ ~ ]$ kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGEsamples-gpu 1/2 2 1 7m28s
过了1-2分钟,增加完毕:
xinyu [ ~ ]$ kubectl exec -ti samples-gpu-95b9c58b6-nbg8g -- bin/sh
NAME READY UP-TO-DATE AVAILABLE AGEsamples-gpu 2/2 2 2 11m
再次查看 AKS 节点,又多了一个 GPU VM。
xinyu [ ~ ]$ kubectl get nodes
NAME STATUS ROLES AGE VERSIONaks-gpu-spot-57p8w Ready agent 10m v1.27.9aks-gpu-spot-p9vh8 Ready agent 3m1s v1.27.9aks-nodepool1-34768744-vmss000000 Ready agent 63m v1.27.9aks-nodepool1-34768744-vmss000001 Ready agent 63m v1.27.9aks-nodepool1-34768744-vmss000002 Ready agent 63m v1.27.9
查看 karpenter 对应的三个 CRD:
xinyu [ ~ ]$ kubectl get crd |grep -i kar
aksnodeclasses.karpenter.azure.com 2024-03-24T01:18:01Znodeclaims.karpenter.sh 2024-03-24T01:18:01Znodepools.karpenter.sh 2024-03-24T01:18:01Z
查看 karpenter claim 的节点,有两个:
xinyu [ ~ ]$ kubectl get nodeclaims.karpenter.sh
NAME TYPE ZONE NODE READY AGEgpu-spot-57p8w Standard_NC24ads_A100_v4 southeastasia-2 aks-gpu-spot-57p8w True 15mgpu-spot-p9vh8 Standard_NC24ads_A100_v4 southeastasia-2 aks-gpu-spot-p9vh8 True 8m11s
此时查看 Azure VM,有两个 GPU SpotVM:



将 deployments 副本数设置为0,AKS 会剔除对应节点,Azure 也会删除 GPU SpotVM。
xinyu [ ~ ]$ kubectl scale deployment samples-gpu --replicas=0
deployment.apps/samples-gpu scaled
xinyu [ ~ ]$ kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGEsamples-gpu 0/0 0 0 26m


本文作者

魏新宇
微软资深云解决方案架构师
《OpenShift在企业中的实战:PaaS DevOps微服务》、《云原生应用构建:基于OpenShift》、《金融级IT架构与运维》书第一作者。在云原生、加速计算方面有着丰富的经验。





