@@ -26,7 +26,8 @@ const (
2626 // EC2:DescribeNetworkInterface supports up to 200 filters per call.
2727 describeNetworkInterfacesFiltersLimit = 200
2828
29- labelEKSComputeType = "eks.amazonaws.com/compute-type"
29+ labelEKSComputeType = "eks.amazonaws.com/compute-type"
30+ labelSageMakerComputeType = "sagemaker.amazonaws.com/compute-type"
3031)
3132
3233// PodENIInfoResolver is responsible for resolve the AWS VPC ENI that supports pod network.
@@ -141,20 +142,20 @@ func (r *defaultPodENIInfoResolver) saveENIInfosToCache(pods []k8s.PodInfo, eniI
141142}
142143
143144func (r * defaultPodENIInfoResolver ) resolvePodsViaCascadedLookup (ctx context.Context , pods []k8s.PodInfo ) (map [types.NamespacedName ]ENIInfo , error ) {
144- podsOnEc2 , podsOnFargate , err := r .classifyPodsByComputeType (ctx , pods )
145+ podsByComputeType , err := r .classifyPodsByComputeType (ctx , pods )
145146 if err != nil {
146147 return nil , err
147148 }
148149 eniInfoByPodKey := make (map [types.NamespacedName ]ENIInfo )
149- if len (podsOnEc2 ) > 0 {
150- eniInfoByPodKeyEc2 , err := r .resolveViaCascadedLookup (ctx , podsOnEc2 , false )
150+ if len (podsByComputeType . ec2Pods ) > 0 {
151+ eniInfoByPodKeyEc2 , err := r .resolveViaCascadedLookup (ctx , podsByComputeType . ec2Pods , false )
151152 if err != nil {
152153 return nil , err
153154 }
154155 eniInfoByPodKey = eniInfoByPodKeyEc2
155156 }
156- if len (podsOnFargate ) > 0 {
157- eniInfoByPodKeyFargate , err := r .resolveViaCascadedLookup (ctx , podsOnFargate , true )
157+ if len (podsByComputeType . fargatePods ) > 0 {
158+ eniInfoByPodKeyFargate , err := r .resolveViaCascadedLookup (ctx , podsByComputeType . fargatePods , true )
158159 if err != nil {
159160 return nil , err
160161 }
@@ -164,17 +165,28 @@ func (r *defaultPodENIInfoResolver) resolvePodsViaCascadedLookup(ctx context.Con
164165 }
165166 }
166167 }
168+ if len (podsByComputeType .sageMakerHyperPodPods ) > 0 {
169+ eniInfoByPodKeySageMakerHyperPod , err := r .resolveViaCascadedLookup (ctx , podsByComputeType .sageMakerHyperPodPods , true )
170+ if err != nil {
171+ return nil , err
172+ }
173+ if len (eniInfoByPodKeySageMakerHyperPod ) > 0 {
174+ for podKey , eniInfo := range eniInfoByPodKeySageMakerHyperPod {
175+ eniInfoByPodKey [podKey ] = eniInfo
176+ }
177+ }
178+ }
167179 return eniInfoByPodKey , nil
168180}
169181
170- func (r * defaultPodENIInfoResolver ) resolveViaCascadedLookup (ctx context.Context , pods []k8s.PodInfo , isFargateNode bool ) (map [types.NamespacedName ]ENIInfo , error ) {
182+ func (r * defaultPodENIInfoResolver ) resolveViaCascadedLookup (ctx context.Context , pods []k8s.PodInfo , isNonEc2Pod bool ) (map [types.NamespacedName ]ENIInfo , error ) {
171183 eniInfoByPodKey := make (map [types.NamespacedName ]ENIInfo )
172184 resolveFuncs := []func (ctx context.Context , pods []k8s.PodInfo ) (map [types.NamespacedName ]ENIInfo , error ){
173185 r .resolveViaPodENIAnnotation ,
174186 r .resolveViaNodeENIs ,
175187 // TODO, add support for kubenet CNI plugin(kops) by resolve via routeTable.
176188 }
177- if isFargateNode {
189+ if isNonEc2Pod {
178190 resolveFuncs = []func (ctx context.Context , pods []k8s.PodInfo ) (map [types.NamespacedName ]ENIInfo , error ){
179191 r .resolveViaVPCENIs ,
180192 }
@@ -281,6 +293,7 @@ func (r *defaultPodENIInfoResolver) resolveViaNodeENIs(ctx context.Context, pods
281293
282294// resolveViaVPCENIs tries to resolve pod ENI by matching podIP against ENIs in vpc.
283295// with EKS fargate pods, podIP is supported by an ENI in vpc.
296+ // with SageMaker HyperPod pods, podIP is supported by the visible cross-account ENI in customer vpc.
284297func (r * defaultPodENIInfoResolver ) resolveViaVPCENIs (ctx context.Context , pods []k8s.PodInfo ) (map [types.NamespacedName ]ENIInfo , error ) {
285298 podKeysByIP := make (map [string ][]types.NamespacedName , len (pods ))
286299 for _ , pod := range pods {
@@ -388,33 +401,45 @@ func (r *defaultPodENIInfoResolver) isPodSupportedByNodeENI(pod k8s.PodInfo, nod
388401 return false
389402}
390403
391- // classifyPodsByComputeType classifies in to ec2 and fargate groups
392- func (r * defaultPodENIInfoResolver ) classifyPodsByComputeType (ctx context.Context , pods []k8s.PodInfo ) ([]k8s.PodInfo , []k8s.PodInfo , error ) {
393- podsOnFargate := make ([]k8s.PodInfo , 0 , len (pods ))
394- podsOnEc2 := make ([]k8s.PodInfo , 0 , len (pods ))
404+ // PodsByComputeType groups pods based on their compute type (EC2, Fargate, SageMaker HyperPod)
405+ type PodsByComputeType struct {
406+ ec2Pods []k8s.PodInfo
407+ fargatePods []k8s.PodInfo
408+ sageMakerHyperPodPods []k8s.PodInfo
409+ }
410+
411+ // classifyPodsByComputeType classifies in to ec2, fargate and sagemaker-hyperpod groups
412+ func (r * defaultPodENIInfoResolver ) classifyPodsByComputeType (ctx context.Context , pods []k8s.PodInfo ) (PodsByComputeType , error ) {
413+ var podsByComputeType PodsByComputeType
395414 nodeNameByComputeType := make (map [string ]string )
396415 for _ , pod := range pods {
397416 if _ , exists := nodeNameByComputeType [pod .NodeName ]; exists {
398417 if nodeNameByComputeType [pod .NodeName ] == "fargate" {
399- podsOnFargate = append (podsOnFargate , pod )
418+ podsByComputeType .fargatePods = append (podsByComputeType .fargatePods , pod )
419+ } else if nodeNameByComputeType [pod .NodeName ] == "sagemaker-hyperpod" {
420+ podsByComputeType .sageMakerHyperPodPods = append (podsByComputeType .sageMakerHyperPodPods , pod )
400421 } else {
401- podsOnEc2 = append (podsOnEc2 , pod )
422+ podsByComputeType . ec2Pods = append (podsByComputeType . ec2Pods , pod )
402423 }
403424 }
425+
404426 nodeKey := types.NamespacedName {Name : pod .NodeName }
405427 node := & corev1.Node {}
406428 if err := r .k8sClient .Get (ctx , nodeKey , node ); err != nil {
407- return nil , nil , err
429+ return PodsByComputeType {} , err
408430 }
409431 if node .Labels [labelEKSComputeType ] == "fargate" {
410- podsOnFargate = append (podsOnFargate , pod )
432+ podsByComputeType . fargatePods = append (podsByComputeType . fargatePods , pod )
411433 nodeNameByComputeType [pod .NodeName ] = "fargate"
434+ } else if node .Labels [labelSageMakerComputeType ] == "hyperpod" {
435+ podsByComputeType .sageMakerHyperPodPods = append (podsByComputeType .sageMakerHyperPodPods , pod )
436+ nodeNameByComputeType [pod .NodeName ] = "sagemaker-hyperpod"
412437 } else {
413- podsOnEc2 = append (podsOnEc2 , pod )
438+ podsByComputeType . ec2Pods = append (podsByComputeType . ec2Pods , pod )
414439 nodeNameByComputeType [pod .NodeName ] = "ec2"
415440 }
416441 }
417- return podsOnEc2 , podsOnFargate , nil
442+ return podsByComputeType , nil
418443}
419444
420445// computePodENIInfoCacheKey computes the cacheKey for pod's ENIInfo cache.
0 commit comments