Skip to content

Commit 17715b2

Browse files
M00nF1shTimothy-Dougherty
authored andcommitted
add PD support (kubernetes-sigs#2137)
1 parent 28ee493 commit 17715b2

15 files changed

+3464
-103
lines changed

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ module sigs.k8s.io/aws-load-balancer-controller
33
go 1.16
44

55
require (
6-
github.com/aws/aws-sdk-go v1.38.67
6+
github.com/aws/aws-sdk-go v1.40.7
77
github.com/go-logr/logr v0.4.0
88
github.com/golang/mock v1.6.0
99
github.com/google/go-cmp v0.5.6

go.sum

Lines changed: 263 additions & 0 deletions
Large diffs are not rendered by default.

main.go

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -99,15 +99,13 @@ func main() {
9999

100100
podInfoRepo := k8s.NewDefaultPodInfoRepo(clientSet.CoreV1().RESTClient(), rtOpts.Namespace, ctrl.Log)
101101
finalizerManager := k8s.NewDefaultFinalizerManager(mgr.GetClient(), ctrl.Log)
102-
podENIResolver := networking.NewDefaultPodENIInfoResolver(cloud.EC2(), cloud.VpcID(), ctrl.Log)
103-
nodeENIResolver := networking.NewDefaultNodeENIInfoResolver(cloud.EC2(), ctrl.Log)
104102
sgManager := networking.NewDefaultSecurityGroupManager(cloud.EC2(), ctrl.Log)
105103
sgReconciler := networking.NewDefaultSecurityGroupReconciler(sgManager, ctrl.Log)
106104
azInfoProvider := networking.NewDefaultAZInfoProvider(cloud.EC2(), ctrl.Log.WithName("az-info-provider"))
107105
subnetResolver := networking.NewDefaultSubnetsResolver(azInfoProvider, cloud.EC2(), cloud.VpcID(), controllerCFG.ClusterName, ctrl.Log.WithName("subnets-resolver"))
108106
vpcResolver := networking.NewDefaultVPCResolver(cloud.EC2(), cloud.VpcID(), ctrl.Log.WithName("vpc-resolver"))
109-
tgbResManager := targetgroupbinding.NewDefaultResourceManager(mgr.GetClient(), cloud.ELBV2(),
110-
podInfoRepo, podENIResolver, nodeENIResolver, sgManager, sgReconciler, cloud.VpcID(), controllerCFG.ClusterName, mgr.GetEventRecorderFor("targetGroupBinding"), ctrl.Log)
107+
tgbResManager := targetgroupbinding.NewDefaultResourceManager(mgr.GetClient(), cloud.ELBV2(), cloud.EC2(),
108+
podInfoRepo, sgManager, sgReconciler, cloud.VpcID(), controllerCFG.ClusterName, mgr.GetEventRecorderFor("targetGroupBinding"), ctrl.Log)
111109
ingGroupReconciler := ingress.NewGroupReconciler(cloud, mgr.GetClient(), mgr.GetEventRecorderFor("ingress"),
112110
finalizerManager, sgManager, sgReconciler, subnetResolver,
113111
controllerCFG, ctrl.Log.WithName("controllers").WithName("ingress"))

pkg/aws/services/ec2_mocks.go

Lines changed: 616 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/k8s/pod_info.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ type PodInfo struct {
2121
ContainerPorts []corev1.ContainerPort
2222
ReadinessGates []corev1.PodReadinessGate
2323
Conditions []corev1.PodCondition
24+
NodeName string
2425
PodIP string
2526

2627
ENIInfos []PodENIInfo
@@ -101,6 +102,7 @@ func buildPodInfo(pod *corev1.Pod) PodInfo {
101102
ContainerPorts: containerPorts,
102103
ReadinessGates: pod.Spec.ReadinessGates,
103104
Conditions: pod.Status.Conditions,
105+
NodeName: pod.Spec.NodeName,
104106
PodIP: pod.Status.PodIP,
105107

106108
ENIInfos: podENIInfos,

pkg/k8s/pod_info_test.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -327,6 +327,7 @@ func Test_buildPodInfo(t *testing.T) {
327327
UID: "pod-uuid",
328328
},
329329
Spec: corev1.PodSpec{
330+
NodeName: "ip-192-168-13-198.us-west-2.compute.internal",
330331
Containers: []corev1.Container{
331332
{
332333
Ports: []corev1.ContainerPort{
@@ -408,7 +409,8 @@ func Test_buildPodInfo(t *testing.T) {
408409
Status: corev1.ConditionTrue,
409410
},
410411
},
411-
PodIP: "192.168.1.1",
412+
NodeName: "ip-192-168-13-198.us-west-2.compute.internal",
413+
PodIP: "192.168.1.1",
412414
},
413415
},
414416
{
@@ -424,6 +426,7 @@ func Test_buildPodInfo(t *testing.T) {
424426
},
425427
},
426428
Spec: corev1.PodSpec{
429+
NodeName: "ip-192-168-13-198.us-west-2.compute.internal",
427430
Containers: []corev1.Container{
428431
{
429432
Ports: []corev1.ContainerPort{
@@ -505,7 +508,8 @@ func Test_buildPodInfo(t *testing.T) {
505508
Status: corev1.ConditionTrue,
506509
},
507510
},
508-
PodIP: "192.168.1.1",
511+
NodeName: "ip-192-168-13-198.us-west-2.compute.internal",
512+
PodIP: "192.168.1.1",
509513
ENIInfos: []PodENIInfo{
510514
{
511515
ENIID: "eni-06a712e1622fda4a0",

pkg/networking/node_eni_info_resolver.go

Lines changed: 14 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,6 @@ import (
99
corev1 "k8s.io/api/core/v1"
1010
"k8s.io/apimachinery/pkg/types"
1111
"k8s.io/apimachinery/pkg/util/cache"
12-
"k8s.io/apimachinery/pkg/util/sets"
13-
"sigs.k8s.io/aws-load-balancer-controller/pkg/aws/services"
1412
"sigs.k8s.io/aws-load-balancer-controller/pkg/k8s"
1513
"sync"
1614
"time"
@@ -26,9 +24,9 @@ type NodeENIInfoResolver interface {
2624
}
2725

2826
// NewDefaultNodeENIInfoResolver constructs new defaultNodeENIInfoResolver.
29-
func NewDefaultNodeENIInfoResolver(ec2Client services.EC2, logger logr.Logger) *defaultNodeENIInfoResolver {
27+
func NewDefaultNodeENIInfoResolver(nodeInfoProvider NodeInfoProvider, logger logr.Logger) *defaultNodeENIInfoResolver {
3028
return &defaultNodeENIInfoResolver{
31-
ec2Client: ec2Client,
29+
nodeInfoProvider: nodeInfoProvider,
3230
logger: logger,
3331
nodeENIInfoCache: cache.NewExpiring(),
3432
nodeENIInfoCacheMutex: sync.RWMutex{},
@@ -40,8 +38,8 @@ var _ NodeENIInfoResolver = &defaultNodeENIInfoResolver{}
4038

4139
// default implementation for NodeENIInfoResolver.
4240
type defaultNodeENIInfoResolver struct {
43-
// ec2 client
44-
ec2Client services.EC2
41+
// nodeInfoProvider
42+
nodeInfoProvider NodeInfoProvider
4543
// logger
4644
logger logr.Logger
4745

@@ -53,11 +51,11 @@ type defaultNodeENIInfoResolver struct {
5351
func (r *defaultNodeENIInfoResolver) Resolve(ctx context.Context, nodes []*corev1.Node) (map[types.NamespacedName]ENIInfo, error) {
5452
eniInfoByNodeKey := r.fetchENIInfosFromCache(nodes)
5553
nodesWithoutENIInfo := computeNodesWithoutENIInfo(nodes, eniInfoByNodeKey)
56-
eniInfoByNodeKeyViaLookup, err := r.resolveViaInstanceID(ctx, nodesWithoutENIInfo)
57-
if err != nil {
58-
return nil, err
59-
}
60-
if len(eniInfoByNodeKeyViaLookup) > 0 {
54+
if len(nodesWithoutENIInfo) > 0 {
55+
eniInfoByNodeKeyViaLookup, err := r.resolveViaInstanceID(ctx, nodesWithoutENIInfo)
56+
if err != nil {
57+
return nil, err
58+
}
6159
r.saveENIInfosToCache(nodesWithoutENIInfo, eniInfoByNodeKeyViaLookup)
6260
for nodeKey, eniInfo := range eniInfoByNodeKeyViaLookup {
6361
eniInfoByNodeKey[nodeKey] = eniInfo
@@ -113,39 +111,18 @@ func (r *defaultNodeENIInfoResolver) saveENIInfosToCache(nodes []*corev1.Node, e
113111
}
114112

115113
func (r *defaultNodeENIInfoResolver) resolveViaInstanceID(ctx context.Context, nodes []*corev1.Node) (map[types.NamespacedName]ENIInfo, error) {
116-
nodeKeysByInstanceID := make(map[string][]types.NamespacedName)
117-
for _, node := range nodes {
118-
instanceID, err := k8s.ExtractNodeInstanceID(node)
119-
if err != nil {
120-
return nil, err
121-
}
122-
nodeKey := k8s.NamespacedName(node)
123-
nodeKeysByInstanceID[instanceID] = append(nodeKeysByInstanceID[instanceID], nodeKey)
124-
}
125-
if len(nodeKeysByInstanceID) == 0 {
126-
return nil, nil
127-
}
128-
129-
instanceIDs := sets.StringKeySet(nodeKeysByInstanceID).List()
130-
req := &ec2sdk.DescribeInstancesInput{
131-
InstanceIds: awssdk.StringSlice(instanceIDs),
132-
}
133-
instances, err := r.ec2Client.DescribeInstancesAsList(ctx, req)
114+
nodeInstanceByNodeKey, err := r.nodeInfoProvider.FetchNodeInstances(ctx, nodes)
134115
if err != nil {
135116
return nil, err
136117
}
137-
138-
eniInfoByNodeKey := make(map[types.NamespacedName]ENIInfo)
139-
for _, instance := range instances {
140-
instanceID := awssdk.StringValue(instance.InstanceId)
141-
primaryENI, err := findInstancePrimaryENI(instance.NetworkInterfaces)
118+
eniInfoByNodeKey := make(map[types.NamespacedName]ENIInfo, len(nodeInstanceByNodeKey))
119+
for nodeKey, nodeInstance := range nodeInstanceByNodeKey {
120+
primaryENI, err := findInstancePrimaryENI(nodeInstance.NetworkInterfaces)
142121
if err != nil {
143122
return nil, err
144123
}
145124
eniInfo := buildENIInfoViaInstanceENI(primaryENI)
146-
for _, nodeKey := range nodeKeysByInstanceID[instanceID] {
147-
eniInfoByNodeKey[nodeKey] = eniInfo
148-
}
125+
eniInfoByNodeKey[nodeKey] = eniInfo
149126
}
150127
return eniInfoByNodeKey, nil
151128
}

0 commit comments

Comments
 (0)