diff --git a/staging/src/k8s.io/legacy-cloud-providers/azure/azure.go b/staging/src/k8s.io/legacy-cloud-providers/azure/azure.go index 466f06bfd33..2c236c0abc3 100644 --- a/staging/src/k8s.io/legacy-cloud-providers/azure/azure.go +++ b/staging/src/k8s.io/legacy-cloud-providers/azure/azure.go @@ -213,6 +213,9 @@ type Config struct { NsgCacheTTLInSeconds int `json:"nsgCacheTTLInSeconds,omitempty" yaml:"nsgCacheTTLInSeconds,omitempty"` // RouteTableCacheTTLInSeconds sets the cache TTL for route table RouteTableCacheTTLInSeconds int `json:"routeTableCacheTTLInSeconds,omitempty" yaml:"routeTableCacheTTLInSeconds,omitempty"` + + // DisableAvailabilitySetNodes disables VMAS nodes support when "VMType" is set to "vmss". + DisableAvailabilitySetNodes bool `json:"disableAvailabilitySetNodes,omitempty" yaml:"disableAvailabilitySetNodes,omitempty"` } var _ cloudprovider.Interface = (*Cloud)(nil) @@ -353,6 +356,10 @@ func (az *Cloud) InitializeCloudFromConfig(config *Config, fromSecret bool) erro config.VMType = vmTypeStandard } + if config.DisableAvailabilitySetNodes && config.VMType != vmTypeVMSS { + return fmt.Errorf("disableAvailabilitySetNodes %v is only supported when vmType is 'vmss'", config.DisableAvailabilitySetNodes) + } + if config.CloudConfigType == "" { // The default cloud config type is cloudConfigTypeMerge. config.CloudConfigType = cloudConfigTypeMerge diff --git a/staging/src/k8s.io/legacy-cloud-providers/azure/azure_test.go b/staging/src/k8s.io/legacy-cloud-providers/azure/azure_test.go index 327805e9403..b112c525394 100644 --- a/staging/src/k8s.io/legacy-cloud-providers/azure/azure_test.go +++ b/staging/src/k8s.io/legacy-cloud-providers/azure/azure_test.go @@ -1511,6 +1511,8 @@ func TestNewCloudFromJSON(t *testing.T) { "loadBalancerCacheTTLInSeconds": 100, "nsgCacheTTLInSeconds": 100, "routeTableCacheTTLInSeconds": 100, + "vmType": "vmss", + "disableAvailabilitySetNodes": true }` validateConfig(t, config) } @@ -1568,6 +1570,8 @@ vmCacheTTLInSeconds: 100 loadBalancerCacheTTLInSeconds: 100 nsgCacheTTLInSeconds: 100 routeTableCacheTTLInSeconds: 100 +vmType: vmss +disableAvailabilitySetNodes: true ` validateConfig(t, config) } @@ -1665,6 +1669,12 @@ func validateConfig(t *testing.T, config string) { if azureCloud.RouteTableCacheTTLInSeconds != 100 { t.Errorf("got incorrect value for routeTableCacheTTLInSeconds") } + if azureCloud.VMType != vmTypeVMSS { + t.Errorf("got incorrect value for vmType") + } + if !azureCloud.DisableAvailabilitySetNodes { + t.Errorf("got incorrect value for disableAvailabilitySetNodes") + } } func getCloudFromConfig(t *testing.T, config string) *Cloud { diff --git a/staging/src/k8s.io/legacy-cloud-providers/azure/azure_vmss.go b/staging/src/k8s.io/legacy-cloud-providers/azure/azure_vmss.go index 470d9b5414c..4a874be758e 100644 --- a/staging/src/k8s.io/legacy-cloud-providers/azure/azure_vmss.go +++ b/staging/src/k8s.io/legacy-cloud-providers/azure/azure_vmss.go @@ -75,9 +75,11 @@ func newScaleSet(az *Cloud) (VMSet, error) { availabilitySet: newAvailabilitySet(az), } - ss.availabilitySetNodesCache, err = ss.newAvailabilitySetNodesCache() - if err != nil { - return nil, err + if !ss.DisableAvailabilitySetNodes { + ss.availabilitySetNodesCache, err = ss.newAvailabilitySetNodesCache() + if err != nil { + return nil, err + } } ss.vmssCache, err = ss.newVMSSCache() diff --git a/staging/src/k8s.io/legacy-cloud-providers/azure/azure_vmss_cache.go b/staging/src/k8s.io/legacy-cloud-providers/azure/azure_vmss_cache.go index 2d59df140e4..8a78d5a45ee 100644 --- a/staging/src/k8s.io/legacy-cloud-providers/azure/azure_vmss_cache.go +++ b/staging/src/k8s.io/legacy-cloud-providers/azure/azure_vmss_cache.go @@ -256,6 +256,12 @@ func (ss *scaleSet) newAvailabilitySetNodesCache() (*timedCache, error) { } func (ss *scaleSet) isNodeManagedByAvailabilitySet(nodeName string, crt cacheReadType) (bool, error) { + // Assume all nodes are managed by VMSS when DisableAvailabilitySetNodes is enabled. + if ss.DisableAvailabilitySetNodes { + klog.V(2).Infof("Assuming node %q is managed by VMSS since DisableAvailabilitySetNodes is set to true", nodeName) + return false, nil + } + cached, err := ss.availabilitySetNodesCache.Get(availabilitySetNodesKey, crt) if err != nil { return false, err