TargetGroupBinding¶
TargetGroupBinding is a custom resource (CR) that can expose your pods using an existing ALB TargetGroup or NLB TargetGroup.
This will allow you to provision the load balancer infrastructure completely outside of Kubernetes but still manage the targets with Kubernetes Service.
usage to support Ingress and Service
The AWS LoadBalancer controller internally used TargetGroupBinding to support the functionality for Ingress and Service resource as well. It automatically creates TargetGroupBinding in the same namespace of the Service used.
You can view all TargetGroupBindings in a namespace by kubectl get targetgroupbindings -n <your-namespace> -o wide
TargetType¶
TargetGroupBinding CR supports TargetGroups of either instance
or ip
TargetType.
If TargetType is not explicitly specified, a mutating webhook will automatically call AWS API to find the TargetType for your TargetGroup and set it to correct value.
Sample YAML¶
apiVersion: elbv2.k8s.aws/v1beta1
kind: TargetGroupBinding
metadata:
name: my-tgb
spec:
serviceRef:
name: awesome-service # route traffic to the awesome-service
port: 80
targetGroupARN: <arn-to-targetGroup>
VpcID¶
TargetGroupBinding CR supports the explicit definition of the Virtual Private Cloud (VPC) of your TargetGroup.
If the VpcID is not explicitly specified, a mutating webhook will automatically call AWS API to find the VpcID for your TargetGroup and set it to correct value.
Sample YAML¶
apiVersion: elbv2.k8s.aws/v1beta1
kind: TargetGroupBinding
metadata:
name: my-tgb
spec:
serviceRef:
name: awesome-service # route traffic to the awesome-service
port: 80
targetGroupARN: <arn-to-targetGroup>
vpcID: <vpcID>
NodeSelector¶
Default Node Selector¶
For TargetType: instance
, all nodes of a cluster that match the following
selector are added to the target group by default:
matchExpressions:
- key: node-role.kubernetes.io/master
operator: DoesNotExist
- key: node.kubernetes.io/exclude-from-external-load-balancers
operator: DoesNotExist
- key: alpha.service-controller.kubernetes.io/exclude-balancer
operator: DoesNotExist
- key: eks.amazonaws.com/compute-type
operator: NotIn
values: ["fargate"]
Custom Node Selector¶
TargetGroupBinding CR supports NodeSelector
which is a
LabelSelector. This will select nodes to attach to the
instance
TargetType target group and is merged with the default node
selector above.
apiVersion: elbv2.k8s.aws/v1beta1
kind: TargetGroupBinding
metadata:
name: my-tgb
spec:
nodeSelector:
matchLabels:
foo: bar
...
MultiCluster Target Group¶
TargetGroupBinding CRD supports sharing the same target group ARN among multiple clusters. Setting this flag will ensure the controller only operates on targets within the cluster.
The default value is false, meaning that the controller assumes full control over the target group ARN and will deregister any targets that are not found within the cluster. To set this flag for TGBs managed by the controller use either: ALB: alb.ingress.kubernetes.io/multi-cluster-target-group: "true" NLB: service.beta.kubernetes.io/aws-load-balancer-multi-cluster-target-group: "true"
It is not recommended to change this value after TGB creation. Changing between shared / not shared might lead to leaked targets.
Only use this flag if you intend to share the target group ARN in multiple clusters. This flag will slow down reconciles and put a small additonal load on the kubernetes control plane.
Sample YAML¶
apiVersion: elbv2.k8s.aws/v1beta1
kind: TargetGroupBinding
metadata:
name: my-tgb
spec:
serviceRef:
name: awesome-service # route traffic to the awesome-service
port: 80
targetGroupARN: <arn-to-targetGroup>
multiClusterTargetGroup: "true"
Reference¶
See the reference for TargetGroupBinding CR