- Notifications
You must be signed in to change notification settings - Fork 1.6k
Description
Related Problem
When deploying a multi-cluster EKS environment that shares services via the Multi-Cluster Services (MCS) API, multiple EndpointSlices may be created for a single Service. Currently, in “target-type: ip” mode, the AWS Load Balancer Controller only registers Pod IPs of locally running Pods. It does not register:
- Pod IPs from other clusters exposed via the MCS API and listed in EndpointSlices; or
- External IPs included in EndpointSlices whose TargetRef.Kind is not "Pod."
This behavior forces users to employ workarounds—such as using “target-type: instance” and routing traffic through NodePorts—which can introduce suboptimal routing and increase the risk of disruptions if a Node is scaled in or replaced.
Proposed Unified Solution
Enhance the AWS Load Balancer Controller to directly register IP addresses from EndpointSlices in “target-type: ip” mode, even if those addresses are intended for multi-cluster usage (MCS) or represent external endpoints. This can be done by:
- Recognizing that an EndpointSlice may contain additional or external IP addresses (for instance, based on TargetRef.Kind != "Pod").
- Incorporating these addresses into the Target Group, alongside the local cluster Pod IPs already handled.
A relevant part of the AWS Load Balancer Controller’s current design is located here:
aws-load-balancer-controller/pkg/backend/endpoint_resolver.go
Lines 155 to 157 in c701a42
| if ep.TargetRef == nil || ep.TargetRef.Kind != "Pod" { | |
| continue | |
| } |
Here, the logic could be extended to handle these alternative address types. For example, if the endpointslice.kubernetes.io/managed-by: endpointslice-controller.k8s.io label is missing, the Controller might treat the EndpointSlice’s IP addresses as external IPs; or if EndpointSlice.Endpoints[].TargetRef.Kind != "Pod", the Controller might interpret them as external endpoints.
In both cases, the goal remains the same: provide direct integration with new or external IP addresses listed in EndpointSlices, reducing complexity and offering more efficient traffic routing.
Alternatives Considered
Using “target-type: instance”
- This solution leads to indirect routing (through NodePorts) and higher susceptibility to disruptions upon Node scale-in or replacement.
Example: MCS with Additional Cluster IPs
Below is a sample configuration demonstrating how MCS might export a Service, creating an EndpointSlice in one cluster with Pod IPs from another cluster:
apiVersion: v1 kind: Service metadata: name: example-service namespace: default spec: selector: app: example ports: - name: http port: 80 protocol: TCP type: ClusterIP --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: example-ingress namespace: default annotations: kubernetes.io/ingress.class: alb alb.ingress.kubernetes.io/target-type: ip alb.ingress.kubernetes.io/scheme: internet-facing alb.ingress.kubernetes.io/listen-ports: '[{"HTTP":80}]' spec: rules: - http: paths: - path: /* pathType: ImplementationSpecific backend: service: name: example-service port: number: 80 --- apiVersion: discovery.k8s.io/v1 kind: EndpointSlice metadata: name: example-service-remotecluster namespace: default labels: kubernetes.io/service-name: example-service addressType: IPv4 ports: - name: "http" port: 80 protocol: TCP endpoints: - addresses: - 10.11.12.13 # Pod IP on a remote EKS cluster conditions: ready: true serving: true terminating: false nodeName: remote-node-1 zone: remote-az-1With the proposed feature enabled, the IP “10.11.12.13” would be recognized by the AWS Load Balancer Controller and automatically registered in the Target Group.