diff --git a/cluster-autoscaler/core/utils.go b/cluster-autoscaler/core/utils.go index 9e138aaf26..4f568fdee2 100644 --- a/cluster-autoscaler/core/utils.go +++ b/cluster-autoscaler/core/utils.go @@ -18,6 +18,7 @@ package core import ( "fmt" + "math/rand" "reflect" "time" @@ -26,6 +27,7 @@ import ( "k8s.io/autoscaler/cluster-autoscaler/simulator" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + api "k8s.io/kubernetes/pkg/api" apiv1 "k8s.io/kubernetes/pkg/api/v1" kube_client "k8s.io/kubernetes/pkg/client/clientset_generated/clientset" "k8s.io/kubernetes/plugin/pkg/scheduler/schedulercache" @@ -142,7 +144,12 @@ func GetNodeInfosForGroups(nodes []*apiv1.Node, cloudProvider cloudprovider.Clou } id := nodeGroup.Id() if _, found := result[id]; !found { - nodeInfo, err := simulator.BuildNodeInfoForNode(node, kubeClient) + sanitizedNode, err := sanitizeTemplateNodeLables(node) + if err != nil { + return map[string]*schedulercache.NodeInfo{}, err + } + + nodeInfo, err := simulator.BuildNodeInfoForNode(sanitizedNode, kubeClient) if err != nil { return map[string]*schedulercache.NodeInfo{}, err } @@ -152,6 +159,23 @@ func GetNodeInfosForGroups(nodes []*apiv1.Node, cloudProvider cloudprovider.Clou return result, nil } +func sanitizeTemplateNodeLables(node *apiv1.Node) (*apiv1.Node, error) { + obj, err := api.Scheme.DeepCopy(node) + if err != nil { + return nil, err + } + newNode := obj.(*apiv1.Node) + newNode.Labels = make(map[string]string, len(node.Labels)) + for k, v := range node.Labels { + if k != metav1.LabelHostname { + newNode.Labels[k] = v + } else { + newNode.Labels[k] = fmt.Sprintf("template-node-for-cluster-autoscaler-%d", rand.Int63()) + } + } + return newNode, nil +} + // Removes unregisterd nodes if needed. Returns true if anything was removed and error if such occurred. func removeOldUnregisteredNodes(unregisteredNodes []clusterstate.UnregisteredNode, context *AutoscalingContext, currentTime time.Time) (bool, error) { diff --git a/cluster-autoscaler/core/utils_test.go b/cluster-autoscaler/core/utils_test.go index 392c674df8..70128075cc 100644 --- a/cluster-autoscaler/core/utils_test.go +++ b/cluster-autoscaler/core/utils_test.go @@ -26,6 +26,7 @@ import ( "k8s.io/autoscaler/cluster-autoscaler/simulator" . "k8s.io/autoscaler/cluster-autoscaler/utils/test" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" apiv1 "k8s.io/kubernetes/pkg/api/v1" "github.com/stretchr/testify/assert" @@ -104,6 +105,16 @@ func TestRemoveOldUnregisteredNodes(t *testing.T) { assert.Equal(t, "ng1/ng1-2", deletedNode) } +func testSanitizeLabels(t *testing.T) { + node := BuildTestNode("ng1-1", 1000, 1000) + node.Labels[metav1.LabelHostname] = "abc" + node.Labels["x"] = "y" + node, err := sanitizeTemplateNodeLables(node) + assert.NoError(t, err) + assert.NotEqual(t, node.Labels[metav1.LabelHostname], "abc") + assert.Equal(t, node.Labels["x"], "y") +} + func TestRemoveFixNodeTargetSize(t *testing.T) { sizeChanges := make(chan string, 10) now := time.Now()