diff --git a/pkg/backend/endpoint_utils.go b/pkg/backend/endpoint_utils.go index 57bea8ac0f..dda86c02fa 100644 --- a/pkg/backend/endpoint_utils.go +++ b/pkg/backend/endpoint_utils.go @@ -13,7 +13,8 @@ const ( labelAlphaNodeRoleExcludeBalancer = "alpha.service-controller.kubernetes.io/exclude-balancer" labelEKSComputeType = "eks.amazonaws.com/compute-type" - toBeDeletedByCATaint = "ToBeDeletedByClusterAutoscaler" + toBeDeletedByCATaint = "ToBeDeletedByClusterAutoscaler" + toBeDeletedByKarpenterTaint = "karpenter.sh/disrupted" ) var ( @@ -61,12 +62,17 @@ func GetTrafficProxyNodeSelector(tgb *elbv2api.TargetGroupBinding) (labels.Selec // IsNodeSuitableAsTrafficProxy check whether node is suitable as a traffic proxy. // This should be checked in additional to the nodeSelector defined in TargetGroupBinding. func IsNodeSuitableAsTrafficProxy(node *corev1.Node) bool { - // ToBeDeletedByClusterAutoscaler taint is added by cluster autoscaler before removing node from cluster - // Marking the node as unsuitable for traffic once the taint is observed on the node for _, taint := range node.Spec.Taints { + // ToBeDeletedByClusterAutoscaler taint is added by cluster autoscaler before removing node from cluster + // Marking the node as unsuitable for traffic once the taint is observed on the node if taint.Key == toBeDeletedByCATaint { return false } + // karpenter.sh/disrupted:NoSchedule taint is added by karpenter before removing node from cluster + // Marking the node as unsuitable for traffic once the taint is observed on the node + if taint.Key == toBeDeletedByKarpenterTaint && taint.Effect == corev1.TaintEffectNoSchedule { + return false + } } return true diff --git a/pkg/backend/endpoint_utils_test.go b/pkg/backend/endpoint_utils_test.go index 21cd59e728..fb376ff938 100644 --- a/pkg/backend/endpoint_utils_test.go +++ b/pkg/backend/endpoint_utils_test.go @@ -131,6 +131,31 @@ func TestIsNodeSuitableAsTrafficProxy(t *testing.T) { }, want: false, }, + { + name: "node is ready but tainted with karpenter.sh/disrupted", + args: args{ + node: &corev1.Node{ + Status: corev1.NodeStatus{ + Conditions: []corev1.NodeCondition{ + { + Type: corev1.NodeReady, + Status: corev1.ConditionTrue, + }, + }, + }, + Spec: corev1.NodeSpec{ + Unschedulable: false, + Taints: []corev1.Taint{ + { + Key: toBeDeletedByKarpenterTaint, + Effect: corev1.TaintEffectNoSchedule, + }, + }, + }, + }, + }, + want: false, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) {