Skip to content

Commit a091626

Browse files
author
t-qini
committed
Update vmss client.
1 parent 850fd0f commit a091626

File tree

11 files changed

+323
-202
lines changed

11 files changed

+323
-202
lines changed

cluster-autoscaler/cloudprovider/azure/README.md

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -244,14 +244,35 @@ Then deploy cluster-autoscaler by running
244244
kubectl create -f cluster-autoscaler-aks.yaml
245245
```
246246

247-
To deploy in AKS with `Helm 3`, please refer to [this tutorial](https://github.com/helm/charts/tree/master/stable/cluster-autoscaler#azure-aks).
247+
To deploy in AKS with `Helm 3`, please refer to [helm installation tutorial][].
248248

249249
Please see the [AKS autoscaler documentation][] for details.
250250

251+
## Rate limit and back-off retries
252+
253+
The new version of [Azure client][] supports rate limit and back-off retries when the cluster hits the throttling issue. These can be set by environment variables or cloud config file.
254+
255+
| Config Name | Default | Environment Variable | Cloud Config File |
256+
| ----------- | ------- | -------------------- | ----------------- |
257+
| CloudProviderBackoff | false | ENABLE_BACKOFF | cloudProviderBackoff |
258+
| CloudProviderBackoffRetries | 6 | BACKOFF_RETRIES | cloudProviderBackoffRetries |
259+
| CloudProviderBackoffExponent | 1.5 | BACKOFF_EXPONENT | cloudProviderBackoffExponent |
260+
| CloudProviderBackoffDuration | 5 | BACKOFF_DURATION | cloudProviderBackoffDuration |
261+
| CloudProviderBackoffJitter | 1.0 | BACKOFF_JITTER | cloudProviderBackoffJitter |
262+
| CloudProviderRateLimit * | false | CLOUD_PROVIDER_RATE_LIMIT | cloudProviderRateLimit |
263+
| CloudProviderRateLimitQPS * | 1 | | cloudProviderRateLimitQPS |
264+
| CloudProviderRateLimitBucket * | 5 | | cloudProviderRateLimitBucket |
265+
| CloudProviderRateLimitQPSWrite * | 1 | | cloudProviderRateLimitQPSWrite |
266+
| CloudProviderRateLimitBucketWrite * | 5 | | cloudProviderRateLimitBucketWrite |
267+
268+
> **_NOTE_**: * These rate limit configs can be set per-client. Customizing `QPS` and `Bucket` through environment variables is not supported.
269+
251270
[AKS]: https://docs.microsoft.com/azure/aks/
252271
[AKS autoscaler documentation]: https://docs.microsoft.com/azure/aks/autoscaler
253272
[aks-engine]: https://github.com/Azure/aks-engine
254273
[Azure CLI]: https://docs.microsoft.com/cli/azure/install-azure-cli
255274
[Azure Portal]: https://portal.azure.com
256275
[Releases]: ../../README.md#releases
257276
[service principal]: https://docs.microsoft.com/azure/active-directory/develop/app-objects-and-service-principals
277+
[helm installation tutorial]: https://github.com/helm/charts/tree/master/stable/cluster-autoscaler#azure-aks
278+
[Azure client]: https://github.com/kubernetes/kubernetes/tree/master/staging/src/k8s.io/legacy-cloud-providers/azure/clients

cluster-autoscaler/cloudprovider/azure/azure_agent_pool.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ import (
2424
"sync"
2525
"time"
2626

27-
"github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2018-10-01/compute"
27+
"github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-07-01/compute"
2828
"github.com/Azure/azure-sdk-for-go/services/resources/mgmt/2017-05-10/resources"
2929
azStorage "github.com/Azure/azure-sdk-for-go/storage"
3030
"github.com/Azure/go-autorest/autorest/to"

cluster-autoscaler/cloudprovider/azure/azure_client.go

Lines changed: 12 additions & 147 deletions
Original file line numberDiff line numberDiff line change
@@ -23,31 +23,20 @@ import (
2323
"net/http"
2424
"time"
2525

26-
"github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2018-10-01/compute"
26+
"github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-07-01/compute"
2727
"github.com/Azure/azure-sdk-for-go/services/containerservice/mgmt/2018-03-31/containerservice"
2828
"github.com/Azure/azure-sdk-for-go/services/network/mgmt/2017-09-01/network"
2929
"github.com/Azure/azure-sdk-for-go/services/resources/mgmt/2017-05-10/resources"
3030
"github.com/Azure/azure-sdk-for-go/services/storage/mgmt/2018-07-01/storage"
3131
"github.com/Azure/go-autorest/autorest"
3232
"github.com/Azure/go-autorest/autorest/adal"
3333
"github.com/Azure/go-autorest/autorest/azure"
34+
3435
"k8s.io/klog"
36+
"k8s.io/legacy-cloud-providers/azure/clients/vmssclient"
37+
"k8s.io/legacy-cloud-providers/azure/clients/vmssvmclient"
3538
)
3639

37-
// VirtualMachineScaleSetsClient defines needed functions for azure compute.VirtualMachineScaleSetsClient.
38-
type VirtualMachineScaleSetsClient interface {
39-
Get(ctx context.Context, resourceGroupName string, vmScaleSetName string) (result compute.VirtualMachineScaleSet, err error)
40-
CreateOrUpdate(ctx context.Context, resourceGroupName string, name string, parameters compute.VirtualMachineScaleSet) (resp *http.Response, err error)
41-
DeleteInstances(ctx context.Context, resourceGroupName string, vmScaleSetName string, vmInstanceIDs compute.VirtualMachineScaleSetVMInstanceRequiredIDs) (resp *http.Response, err error)
42-
List(ctx context.Context, resourceGroupName string) (result []compute.VirtualMachineScaleSet, err error)
43-
}
44-
45-
// VirtualMachineScaleSetVMsClient defines needed functions for azure compute.VirtualMachineScaleSetVMsClient.
46-
type VirtualMachineScaleSetVMsClient interface {
47-
Get(ctx context.Context, resourceGroupName string, VMScaleSetName string, instanceID string) (result compute.VirtualMachineScaleSetVM, err error)
48-
List(ctx context.Context, resourceGroupName string, virtualMachineScaleSetName string, filter string, selectParameter string, expand string) (result []compute.VirtualMachineScaleSetVM, err error)
49-
}
50-
5140
// VirtualMachinesClient defines needed functions for azure compute.VirtualMachinesClient.
5241
type VirtualMachinesClient interface {
5342
Get(ctx context.Context, resourceGroupName string, VMName string, expand compute.InstanceViewTypes) (result compute.VirtualMachine, err error)
@@ -79,134 +68,6 @@ type AccountsClient interface {
7968
ListKeys(ctx context.Context, resourceGroupName string, accountName string) (result storage.AccountListKeysResult, err error)
8069
}
8170

82-
// azVirtualMachineScaleSetsClient implements VirtualMachineScaleSetsClient.
83-
type azVirtualMachineScaleSetsClient struct {
84-
client compute.VirtualMachineScaleSetsClient
85-
}
86-
87-
func newAzVirtualMachineScaleSetsClient(subscriptionID, endpoint string, servicePrincipalToken *adal.ServicePrincipalToken) *azVirtualMachineScaleSetsClient {
88-
virtualMachineScaleSetsClient := compute.NewVirtualMachineScaleSetsClient(subscriptionID)
89-
virtualMachineScaleSetsClient.BaseURI = endpoint
90-
virtualMachineScaleSetsClient.Authorizer = autorest.NewBearerAuthorizer(servicePrincipalToken)
91-
virtualMachineScaleSetsClient.PollingDelay = 5 * time.Second
92-
configureUserAgent(&virtualMachineScaleSetsClient.Client)
93-
94-
return &azVirtualMachineScaleSetsClient{
95-
client: virtualMachineScaleSetsClient,
96-
}
97-
}
98-
99-
func (az *azVirtualMachineScaleSetsClient) CreateOrUpdate(ctx context.Context, resourceGroupName string, VMScaleSetName string, parameters compute.VirtualMachineScaleSet) (resp *http.Response, err error) {
100-
klog.V(10).Infof("azVirtualMachineScaleSetsClient.CreateOrUpdate(%q,%q): start", resourceGroupName, VMScaleSetName)
101-
defer func() {
102-
klog.V(10).Infof("azVirtualMachineScaleSetsClient.CreateOrUpdate(%q,%q): end", resourceGroupName, VMScaleSetName)
103-
}()
104-
105-
future, err := az.client.CreateOrUpdate(ctx, resourceGroupName, VMScaleSetName, parameters)
106-
if err != nil {
107-
return future.Response(), err
108-
}
109-
110-
err = future.WaitForCompletionRef(ctx, az.client.Client)
111-
return future.Response(), err
112-
}
113-
114-
func (az *azVirtualMachineScaleSetsClient) Get(ctx context.Context, resourceGroupName string, VMScaleSetName string) (result compute.VirtualMachineScaleSet, err error) {
115-
klog.V(10).Infof("azVirtualMachineScaleSetsClient.Get(%q,%q): start", resourceGroupName, VMScaleSetName)
116-
defer func() {
117-
klog.V(10).Infof("azVirtualMachineScaleSetsClient.Get(%q,%q): end", resourceGroupName, VMScaleSetName)
118-
}()
119-
120-
return az.client.Get(ctx, resourceGroupName, VMScaleSetName)
121-
}
122-
123-
func (az *azVirtualMachineScaleSetsClient) List(ctx context.Context, resourceGroupName string) (result []compute.VirtualMachineScaleSet, err error) {
124-
klog.V(10).Infof("azVirtualMachineScaleSetsClient.List(%q): start", resourceGroupName)
125-
defer func() {
126-
klog.V(10).Infof("azVirtualMachineScaleSetsClient.List(%q): end", resourceGroupName)
127-
}()
128-
129-
iterator, err := az.client.ListComplete(ctx, resourceGroupName)
130-
if err != nil {
131-
return nil, err
132-
}
133-
134-
result = make([]compute.VirtualMachineScaleSet, 0)
135-
for ; iterator.NotDone(); err = iterator.Next() {
136-
if err != nil {
137-
return nil, err
138-
}
139-
140-
result = append(result, iterator.Value())
141-
}
142-
143-
return result, nil
144-
}
145-
146-
func (az *azVirtualMachineScaleSetsClient) DeleteInstances(ctx context.Context, resourceGroupName string, vmScaleSetName string, vmInstanceIDs compute.VirtualMachineScaleSetVMInstanceRequiredIDs) (resp *http.Response, err error) {
147-
klog.V(10).Infof("azVirtualMachineScaleSetsClient.DeleteInstances(%q,%q,%v): start", resourceGroupName, vmScaleSetName, vmInstanceIDs)
148-
defer func() {
149-
klog.V(10).Infof("azVirtualMachineScaleSetsClient.DeleteInstances(%q,%q,%v): end", resourceGroupName, vmScaleSetName, vmInstanceIDs)
150-
}()
151-
152-
future, err := az.client.DeleteInstances(ctx, resourceGroupName, vmScaleSetName, vmInstanceIDs)
153-
if err != nil {
154-
return future.Response(), err
155-
}
156-
157-
err = future.WaitForCompletionRef(ctx, az.client.Client)
158-
return future.Response(), err
159-
}
160-
161-
// azVirtualMachineScaleSetVMsClient implements VirtualMachineScaleSetVMsClient.
162-
type azVirtualMachineScaleSetVMsClient struct {
163-
client compute.VirtualMachineScaleSetVMsClient
164-
}
165-
166-
func newAzVirtualMachineScaleSetVMsClient(subscriptionID, endpoint string, servicePrincipalToken *adal.ServicePrincipalToken) *azVirtualMachineScaleSetVMsClient {
167-
virtualMachineScaleSetVMsClient := compute.NewVirtualMachineScaleSetVMsClient(subscriptionID)
168-
virtualMachineScaleSetVMsClient.BaseURI = endpoint
169-
virtualMachineScaleSetVMsClient.Authorizer = autorest.NewBearerAuthorizer(servicePrincipalToken)
170-
virtualMachineScaleSetVMsClient.PollingDelay = 5 * time.Second
171-
configureUserAgent(&virtualMachineScaleSetVMsClient.Client)
172-
173-
return &azVirtualMachineScaleSetVMsClient{
174-
client: virtualMachineScaleSetVMsClient,
175-
}
176-
}
177-
178-
func (az *azVirtualMachineScaleSetVMsClient) Get(ctx context.Context, resourceGroupName string, VMScaleSetName string, instanceID string) (result compute.VirtualMachineScaleSetVM, err error) {
179-
klog.V(10).Infof("azVirtualMachineScaleSetVMsClient.Get(%q,%q,%q): start", resourceGroupName, VMScaleSetName, instanceID)
180-
defer func() {
181-
klog.V(10).Infof("azVirtualMachineScaleSetVMsClient.Get(%q,%q,%q): end", resourceGroupName, VMScaleSetName, instanceID)
182-
}()
183-
184-
return az.client.Get(ctx, resourceGroupName, VMScaleSetName, instanceID)
185-
}
186-
187-
func (az *azVirtualMachineScaleSetVMsClient) List(ctx context.Context, resourceGroupName string, virtualMachineScaleSetName string, filter string, selectParameter string, expand string) (result []compute.VirtualMachineScaleSetVM, err error) {
188-
klog.V(10).Infof("azVirtualMachineScaleSetVMsClient.List(%q,%q,%q): start", resourceGroupName, virtualMachineScaleSetName, filter)
189-
defer func() {
190-
klog.V(10).Infof("azVirtualMachineScaleSetVMsClient.List(%q,%q,%q): end", resourceGroupName, virtualMachineScaleSetName, filter)
191-
}()
192-
193-
iterator, err := az.client.ListComplete(ctx, resourceGroupName, virtualMachineScaleSetName, filter, selectParameter, expand)
194-
if err != nil {
195-
return nil, err
196-
}
197-
198-
result = make([]compute.VirtualMachineScaleSetVM, 0)
199-
for ; iterator.NotDone(); err = iterator.Next() {
200-
if err != nil {
201-
return nil, err
202-
}
203-
204-
result = append(result, iterator.Value())
205-
}
206-
207-
return result, nil
208-
}
209-
21071
// azVirtualMachinesClient implements VirtualMachinesClient.
21172
type azVirtualMachinesClient struct {
21273
client compute.VirtualMachinesClient
@@ -446,8 +307,8 @@ func (az *azAccountsClient) ListKeys(ctx context.Context, resourceGroupName stri
446307
}
447308

448309
type azClient struct {
449-
virtualMachineScaleSetsClient VirtualMachineScaleSetsClient
450-
virtualMachineScaleSetVMsClient VirtualMachineScaleSetVMsClient
310+
virtualMachineScaleSetsClient vmssclient.Interface
311+
virtualMachineScaleSetVMsClient vmssvmclient.Interface
451312
virtualMachinesClient VirtualMachinesClient
452313
deploymentsClient DeploymentsClient
453314
interfacesClient InterfacesClient
@@ -519,10 +380,14 @@ func newAzClient(cfg *Config, env *azure.Environment) (*azClient, error) {
519380
return nil, err
520381
}
521382

522-
scaleSetsClient := newAzVirtualMachineScaleSetsClient(cfg.SubscriptionID, env.ResourceManagerEndpoint, spt)
383+
azClientConfig := cfg.getAzureClientConfig(spt, env)
384+
385+
vmssClientConfig := azClientConfig.WithRateLimiter(cfg.VirtualMachineScaleSetRateLimit)
386+
scaleSetsClient := vmssclient.New(vmssClientConfig)
523387
klog.V(5).Infof("Created scale set client with authorizer: %v", scaleSetsClient)
524388

525-
scaleSetVMsClient := newAzVirtualMachineScaleSetVMsClient(cfg.SubscriptionID, env.ResourceManagerEndpoint, spt)
389+
vmssVMClientConfig := azClientConfig.WithRateLimiter(cfg.VirtualMachineScaleSetRateLimit)
390+
scaleSetVMsClient := vmssvmclient.New(vmssVMClientConfig)
526391
klog.V(5).Infof("Created scale set vm client with authorizer: %v", scaleSetVMsClient)
527392

528393
virtualMachinesClient := newAzVirtualMachinesClient(cfg.SubscriptionID, env.ResourceManagerEndpoint, spt)

cluster-autoscaler/cloudprovider/azure/azure_cloud_provider_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ package azure
1919
import (
2020
"testing"
2121

22-
"github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2018-10-01/compute"
22+
"github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-07-01/compute"
2323
"github.com/Azure/azure-sdk-for-go/services/resources/mgmt/2017-05-10/resources"
2424
"github.com/Azure/go-autorest/autorest/azure"
2525
"github.com/stretchr/testify/assert"

cluster-autoscaler/cloudprovider/azure/azure_fakes.go

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,12 @@ import (
2222
"net/http"
2323
"sync"
2424

25-
"github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2018-10-01/compute"
25+
"github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-07-01/compute"
2626
"github.com/Azure/azure-sdk-for-go/services/resources/mgmt/2017-05-10/resources"
2727
"github.com/Azure/azure-sdk-for-go/services/storage/mgmt/2018-07-01/storage"
2828
"github.com/Azure/go-autorest/autorest"
2929
"github.com/stretchr/testify/mock"
30+
"k8s.io/legacy-cloud-providers/azure/retry"
3031
)
3132

3233
const (
@@ -41,7 +42,7 @@ type VirtualMachineScaleSetsClientMock struct {
4142
}
4243

4344
// Get gets the VirtualMachineScaleSet by vmScaleSetName.
44-
func (client *VirtualMachineScaleSetsClientMock) Get(ctx context.Context, resourceGroupName string, vmScaleSetName string) (result compute.VirtualMachineScaleSet, err error) {
45+
func (client *VirtualMachineScaleSetsClientMock) Get(ctx context.Context, resourceGroupName string, vmScaleSetName string) (result compute.VirtualMachineScaleSet, rerr *retry.Error) {
4546
capacity := int64(2)
4647
name := "Standard_D8_V3" // typo to test case-insensitive lookup
4748
location := "switzerlandwest"
@@ -58,7 +59,7 @@ func (client *VirtualMachineScaleSetsClientMock) Get(ctx context.Context, resour
5859
}
5960

6061
// CreateOrUpdate creates or updates the VirtualMachineScaleSet.
61-
func (client *VirtualMachineScaleSetsClientMock) CreateOrUpdate(ctx context.Context, resourceGroupName string, VMScaleSetName string, parameters compute.VirtualMachineScaleSet) (resp *http.Response, err error) {
62+
func (client *VirtualMachineScaleSetsClientMock) CreateOrUpdate(ctx context.Context, resourceGroupName string, VMScaleSetName string, parameters compute.VirtualMachineScaleSet) *retry.Error {
6263
client.mutex.Lock()
6364
defer client.mutex.Unlock()
6465

@@ -67,19 +68,20 @@ func (client *VirtualMachineScaleSetsClientMock) CreateOrUpdate(ctx context.Cont
6768
}
6869
client.FakeStore[resourceGroupName][VMScaleSetName] = parameters
6970

70-
return &http.Response{
71-
StatusCode: http.StatusOK,
72-
}, nil
71+
return nil
7372
}
7473

7574
// DeleteInstances deletes a set of instances for specified VirtualMachineScaleSet.
76-
func (client *VirtualMachineScaleSetsClientMock) DeleteInstances(ctx context.Context, resourceGroupName string, vmScaleSetName string, vmInstanceIDs compute.VirtualMachineScaleSetVMInstanceRequiredIDs) (resp *http.Response, err error) {
75+
func (client *VirtualMachineScaleSetsClientMock) DeleteInstances(ctx context.Context, resourceGroupName string, vmScaleSetName string, vmInstanceIDs compute.VirtualMachineScaleSetVMInstanceRequiredIDs) *retry.Error {
7776
args := client.Called(resourceGroupName, vmScaleSetName, vmInstanceIDs)
78-
return nil, args.Error(1)
77+
if args.Error(1) != nil {
78+
return &retry.Error{RawError: args.Error(1)}
79+
}
80+
return nil
7981
}
8082

8183
// List gets a list of VirtualMachineScaleSets.
82-
func (client *VirtualMachineScaleSetsClientMock) List(ctx context.Context, resourceGroupName string) (result []compute.VirtualMachineScaleSet, err error) {
84+
func (client *VirtualMachineScaleSetsClientMock) List(ctx context.Context, resourceGroupName string) (result []compute.VirtualMachineScaleSet, rerr *retry.Error) {
8385
client.mutex.Lock()
8486
defer client.mutex.Unlock()
8587

@@ -99,7 +101,7 @@ type VirtualMachineScaleSetVMsClientMock struct {
99101
}
100102

101103
// Get gets a VirtualMachineScaleSetVM by VMScaleSetName and instanceID.
102-
func (m *VirtualMachineScaleSetVMsClientMock) Get(ctx context.Context, resourceGroupName string, VMScaleSetName string, instanceID string) (result compute.VirtualMachineScaleSetVM, err error) {
104+
func (m *VirtualMachineScaleSetVMsClientMock) Get(ctx context.Context, resourceGroupName string, VMScaleSetName string, instanceID string, expand compute.InstanceViewTypes) (result compute.VirtualMachineScaleSetVM, rerr *retry.Error) {
103105
ID := fakeVirtualMachineScaleSetVMID
104106
vmID := "123E4567-E89B-12D3-A456-426655440000"
105107
properties := compute.VirtualMachineScaleSetVMProperties{
@@ -113,7 +115,7 @@ func (m *VirtualMachineScaleSetVMsClientMock) Get(ctx context.Context, resourceG
113115
}
114116

115117
// List gets a list of VirtualMachineScaleSetVMs.
116-
func (m *VirtualMachineScaleSetVMsClientMock) List(ctx context.Context, resourceGroupName string, virtualMachineScaleSetName string, filter string, selectParameter string, expand string) (result []compute.VirtualMachineScaleSetVM, err error) {
118+
func (m *VirtualMachineScaleSetVMsClientMock) List(ctx context.Context, resourceGroupName string, virtualMachineScaleSetName string, expand string) (result []compute.VirtualMachineScaleSetVM, rerr *retry.Error) {
117119
ID := fakeVirtualMachineScaleSetVMID
118120
instanceID := "0"
119121
vmID := "123E4567-E89B-12D3-A456-426655440000"
@@ -129,6 +131,16 @@ func (m *VirtualMachineScaleSetVMsClientMock) List(ctx context.Context, resource
129131
return result, nil
130132
}
131133

134+
// Update updates a VirtualMachineScaleSetVM
135+
func (m *VirtualMachineScaleSetVMsClientMock) Update(ctx context.Context, resourceGroupName string, VMScaleSetName string, instanceID string, parameters compute.VirtualMachineScaleSetVM, source string) *retry.Error {
136+
return nil
137+
}
138+
139+
// UpdateVMs updates a list of VirtualMachineScaleSetVM from map[instanceID]compute.VirtualMachineScaleSetVM.
140+
func (m *VirtualMachineScaleSetVMsClientMock) UpdateVMs(ctx context.Context, resourceGroupName string, VMScaleSetName string, instances map[string]compute.VirtualMachineScaleSetVM, source string) *retry.Error {
141+
return nil
142+
}
143+
132144
// VirtualMachinesClientMock mocks for VirtualMachinesClient.
133145
type VirtualMachinesClientMock struct {
134146
mock.Mock

0 commit comments

Comments
 (0)