Skip to content

Commit e49979f

Browse files
authored
Merge pull request #781 from andyzhangx/increase-blob-api-qps
fix: increase api qps for blob kubeclient
2 parents e8ec6ef + c3c9e83 commit e49979f

File tree

2 files changed

+102
-15
lines changed

2 files changed

+102
-15
lines changed

pkg/blob/azure.go

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ import (
3030

3131
"github.com/Azure/go-autorest/autorest"
3232

33-
"k8s.io/client-go/kubernetes"
33+
clientset "k8s.io/client-go/kubernetes"
3434
"k8s.io/client-go/rest"
3535
"k8s.io/client-go/tools/clientcmd"
3636
"k8s.io/klog/v2"
@@ -52,6 +52,12 @@ func IsAzureStackCloud(cloud *azure.Cloud) bool {
5252

5353
// getCloudProvider get Azure Cloud Provider
5454
func getCloudProvider(kubeconfig, nodeID, secretName, secretNamespace, userAgent string, allowEmptyCloudConfig bool) (*azure.Cloud, error) {
55+
var (
56+
config *azure.Config
57+
kubeClient *clientset.Clientset
58+
fromSecret bool
59+
)
60+
5561
az := &azure.Cloud{
5662
InitSecretConfig: azure.InitSecretConfig{
5763
SecretName: secretName,
@@ -61,19 +67,22 @@ func getCloudProvider(kubeconfig, nodeID, secretName, secretNamespace, userAgent
6167
}
6268
az.Environment.StorageEndpointSuffix = storage.DefaultBaseURL
6369

64-
kubeClient, err := getKubeClient(kubeconfig)
65-
if err != nil {
70+
kubeCfg, err := getKubeConfig(kubeconfig)
71+
if err == nil && kubeCfg != nil {
72+
// set QPS and QPS Burst as higher values
73+
kubeCfg.QPS = 25
74+
kubeCfg.Burst = 50
75+
kubeClient, err = clientset.NewForConfig(kubeCfg)
76+
if err != nil {
77+
klog.Warningf("NewForConfig failed with error: %v", err)
78+
}
79+
} else {
6680
klog.Warningf("get kubeconfig(%s) failed with error: %v", kubeconfig, err)
6781
if !os.IsNotExist(err) && !errors.Is(err, rest.ErrNotInCluster) {
6882
return az, fmt.Errorf("failed to get KubeClient: %w", err)
6983
}
7084
}
7185

72-
var (
73-
config *azure.Config
74-
fromSecret bool
75-
)
76-
7786
if kubeClient != nil {
7887
klog.V(2).Infof("reading cloud config from secret %s/%s", az.SecretNamespace, az.SecretName)
7988
az.KubeClient = kubeClient
@@ -251,11 +260,7 @@ func (d *Driver) updateSubnetServiceEndpoints(ctx context.Context, vnetResourceG
251260
return nil
252261
}
253262

254-
func getKubeClient(kubeconfig string) (*kubernetes.Clientset, error) {
255-
var (
256-
config *rest.Config
257-
err error
258-
)
263+
func getKubeConfig(kubeconfig string) (config *rest.Config, err error) {
259264
if kubeconfig != "" {
260265
if config, err = clientcmd.BuildConfigFromFlags("", kubeconfig); err != nil {
261266
return nil, err
@@ -265,6 +270,5 @@ func getKubeClient(kubeconfig string) (*kubernetes.Clientset, error) {
265270
return nil, err
266271
}
267272
}
268-
269-
return kubernetes.NewForConfig(config)
273+
return config, err
270274
}

pkg/blob/azure_test.go

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -375,3 +375,86 @@ func TestUpdateSubnetServiceEndpoints(t *testing.T) {
375375
t.Run(tc.name, tc.testFunc)
376376
}
377377
}
378+
379+
func TestGetKubeConfig(t *testing.T) {
380+
emptyKubeConfig := "empty-Kube-Config"
381+
validKubeConfig := "valid-Kube-Config"
382+
fakeContent := `
383+
apiVersion: v1
384+
clusters:
385+
- cluster:
386+
server: https://localhost:8080
387+
name: foo-cluster
388+
contexts:
389+
- context:
390+
cluster: foo-cluster
391+
user: foo-user
392+
namespace: bar
393+
name: foo-context
394+
current-context: foo-context
395+
kind: Config
396+
users:
397+
- name: foo-user
398+
user:
399+
exec:
400+
apiVersion: client.authentication.k8s.io/v1beta1
401+
args:
402+
- arg-1
403+
- arg-2
404+
command: foo-command
405+
`
406+
err := createTestFile(emptyKubeConfig)
407+
if err != nil {
408+
t.Error(err)
409+
}
410+
defer func() {
411+
if err := os.Remove(emptyKubeConfig); err != nil {
412+
t.Error(err)
413+
}
414+
}()
415+
416+
err = createTestFile(validKubeConfig)
417+
if err != nil {
418+
t.Error(err)
419+
}
420+
defer func() {
421+
if err := os.Remove(validKubeConfig); err != nil {
422+
t.Error(err)
423+
}
424+
}()
425+
426+
if err := ioutil.WriteFile(validKubeConfig, []byte(fakeContent), 0666); err != nil {
427+
t.Error(err)
428+
}
429+
430+
tests := []struct {
431+
desc string
432+
kubeconfig string
433+
expectError bool
434+
envVariableHasConfig bool
435+
envVariableConfigIsValid bool
436+
}{
437+
{
438+
desc: "[success] valid kube config passed",
439+
kubeconfig: validKubeConfig,
440+
expectError: false,
441+
envVariableHasConfig: false,
442+
envVariableConfigIsValid: false,
443+
},
444+
{
445+
desc: "[failure] invalid kube config passed",
446+
kubeconfig: emptyKubeConfig,
447+
expectError: true,
448+
envVariableHasConfig: false,
449+
envVariableConfigIsValid: false,
450+
},
451+
}
452+
453+
for _, test := range tests {
454+
_, err := getKubeConfig(test.kubeconfig)
455+
receiveError := (err != nil)
456+
if test.expectError != receiveError {
457+
t.Errorf("desc: %s,\n input: %q, GetCloudProvider err: %v, expectErr: %v", test.desc, test.kubeconfig, err, test.expectError)
458+
}
459+
}
460+
}

0 commit comments

Comments
 (0)