Add kubernetes QPS and Burst limit configuration (#2899)
Added configurable kubernetes client limits burst and QPS Default QPS 200 and burst 500. Configurable via helm chart values. Signed-off-by: Sanket Sudake <sanketsudake@gmail.com>
This commit is contained in:
@@ -35,6 +35,11 @@ import (
|
||||
"github.com/fission/fission/pkg/utils"
|
||||
)
|
||||
|
||||
const (
|
||||
EnvKubeClientQps = "KUBE_CLIENT_QPS"
|
||||
EnvKubeClientBurst = "KUBE_CLIENT_BURST"
|
||||
)
|
||||
|
||||
type (
|
||||
ClientGeneratorInterface interface {
|
||||
GetRestConfig() (*rest.Config, error)
|
||||
@@ -60,6 +65,20 @@ func (cg *ClientGenerator) getRestConfig() (*rest.Config, error) {
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
qps, _ := utils.GetUIntValueFromEnv(EnvKubeClientQps)
|
||||
burst, _ := utils.GetIntValueFromEnv(EnvKubeClientBurst)
|
||||
|
||||
// Set QPS and Burst to higher values to avoid throttling
|
||||
if qps == 0 {
|
||||
qps = 200
|
||||
}
|
||||
if burst == 0 {
|
||||
burst = 500
|
||||
}
|
||||
cg.restConfig.QPS = float32(qps)
|
||||
cg.restConfig.Burst = burst
|
||||
|
||||
return cg.restConfig, nil
|
||||
}
|
||||
|
||||
|
||||
@@ -232,6 +232,18 @@ func GetUIntValueFromEnv(envVar string) (uint, error) {
|
||||
return uint(value), nil
|
||||
}
|
||||
|
||||
func GetIntValueFromEnv(envVar string) (int, error) {
|
||||
s, err := GetStringValueFromEnv(envVar)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
value, err := strconv.Atoi(s)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
return value, nil
|
||||
}
|
||||
|
||||
func FindFreePort() (int, error) {
|
||||
listener, err := net.Listen("tcp", ":0")
|
||||
if err != nil {
|
||||
|
||||
@@ -162,3 +162,48 @@ func TestGetUIntValueFromEnv(t *testing.T) {
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestGetIntValueFromEnv(t *testing.T) {
|
||||
varName := "TEST_VAR"
|
||||
tests := []struct {
|
||||
name string
|
||||
value string
|
||||
want int
|
||||
wantErr bool
|
||||
}{
|
||||
{
|
||||
name: "empty string case",
|
||||
value: "",
|
||||
want: 0,
|
||||
wantErr: true,
|
||||
},
|
||||
{
|
||||
name: "string case",
|
||||
value: "test string",
|
||||
want: 0,
|
||||
wantErr: true,
|
||||
},
|
||||
{
|
||||
name: "not int case",
|
||||
value: "-100",
|
||||
want: -100,
|
||||
wantErr: false,
|
||||
},
|
||||
{
|
||||
name: "int case",
|
||||
value: "7",
|
||||
want: 7,
|
||||
wantErr: false,
|
||||
}}
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
os.Setenv(varName, tt.value)
|
||||
got, err := GetIntValueFromEnv(varName)
|
||||
if (err != nil) != tt.wantErr {
|
||||
t.Errorf("GetIntValueFromEnv() error = %v, wantErr %v, got %d", err, tt.wantErr, got)
|
||||
return
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user