Skip to content

Commit 03deac7

Browse files
authored
feat: Make Kube API QPS/burst and backend poll rate/burst configurable (#236)
1 parent d17c5ec commit 03deac7

5 files changed

Lines changed: 46 additions & 5 deletions

File tree

cmd/server.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,10 @@ func init() {
6565
serverCmd.PersistentFlags().Bool("pre-archive", false, "Enable support for copying single files to containers without starting them")
6666
serverCmd.PersistentFlags().Bool("disable-services", false, "Disable service creation (requires a network solution such as kubedock-dns)")
6767
serverCmd.PersistentFlags().Bool("ignore-container-memory", false, "Ignore container memory setting and use requests/limits from gobal settings or container labels")
68+
serverCmd.PersistentFlags().Float32("kube-api-qps", 0, "Maximum QPS for requests to the Kubernetes API (0 uses client default)")
69+
serverCmd.PersistentFlags().Int("kube-api-burst", 0, "Maximum burst for requests to the Kubernetes API (0 uses client default)")
70+
serverCmd.PersistentFlags().Float64("poll-rate", 0, "Maximum polling requests per second towards the backend (0 uses default of 1)")
71+
serverCmd.PersistentFlags().Int("poll-burst", 0, "Maximum burst of poll requests towards the backend (0 uses default of 3)")
6872

6973
viper.BindPFlag("server.listen-addr", serverCmd.PersistentFlags().Lookup("listen-addr"))
7074
viper.BindPFlag("server.socket", serverCmd.PersistentFlags().Lookup("unix-socket"))
@@ -97,6 +101,10 @@ func init() {
97101
viper.BindPFlag("pre-archive", serverCmd.PersistentFlags().Lookup("pre-archive"))
98102
viper.BindPFlag("disable-services", serverCmd.PersistentFlags().Lookup("disable-services"))
99103
viper.BindPFlag("ignore-container-memory", serverCmd.PersistentFlags().Lookup("ignore-container-memory"))
104+
viper.BindPFlag("kubernetes.qps", serverCmd.PersistentFlags().Lookup("kube-api-qps"))
105+
viper.BindPFlag("kubernetes.burst", serverCmd.PersistentFlags().Lookup("kube-api-burst"))
106+
viper.BindPFlag("server.poll-rate", serverCmd.PersistentFlags().Lookup("poll-rate"))
107+
viper.BindPFlag("server.poll-burst", serverCmd.PersistentFlags().Lookup("poll-burst"))
100108

101109
viper.BindEnv("server.listen-addr", "SERVER_LISTEN_ADDR")
102110
viper.BindEnv("server.tls-enable", "SERVER_TLS_ENABLE")
@@ -120,6 +128,10 @@ func init() {
120128
viper.BindEnv("kubernetes.timeout", "TIME_OUT")
121129
viper.BindEnv("reaper.reapmax", "REAPER_REAPMAX")
122130
viper.BindEnv("verbosity", "VERBOSITY")
131+
viper.BindEnv("kubernetes.qps", "K8S_QPS")
132+
viper.BindEnv("kubernetes.burst", "K8S_BURST")
133+
viper.BindEnv("server.poll-rate", "POLL_RATE")
134+
viper.BindEnv("server.poll-burst", "POLL_BURST")
123135

124136
serverCmd.PersistentFlags().Lookup("tls-enable").Hidden = true
125137
serverCmd.PersistentFlags().Lookup("tls-key-file").Hidden = true

config.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,10 @@ The `server` command is the actual kubedock server, and is the command to start
4242
|server|--label||K8S_LABEL_label|label that need to be added to every k8s resource (key=value)|
4343
|server|--active-deadline-seconds|-1|K8S_ACTIVE_DEADLINE_SECONDS|Default value for pod deadline, in seconds (a negative value means no deadline)|
4444
|server|--ignore-container-memory|false||Ignore container memory setting and use requests/limits from gobal settings or container labels|
45+
|server|--kube-api-qps|0|K8S_QPS|Maximum QPS for requests to the Kubernetes API (0 uses client default)|
46+
|server|--kube-api-burst|0|K8S_BURST|Maximum burst for requests to the Kubernetes API (0 uses client default)|
47+
|server|--poll-rate|0|POLL_RATE|Maximum polling requests per second towards the backend (0 uses default of 1)|
48+
|server|--poll-burst|0|POLL_BURST|Maximum burst of poll requests towards the backend (0 uses default of 3)|
4549
|dind|--unix-socket|/var/run/docker.sock||Unix socket to listen to|
4650
|dind|--kubedock-url|||Kubedock url to proxy requests to|
4751
|dind|--verbosity / -v|1|VERBOSITY|Log verbosity level|

internal/config/kubernetes.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,5 +62,11 @@ func GetKubernetes() (*rest.Config, error) {
6262
return nil, err
6363
}
6464
}
65+
if qps := float32(viper.GetFloat64("kubernetes.qps")); qps > 0 {
66+
config.QPS = qps
67+
}
68+
if burst := viper.GetInt("kubernetes.burst"); burst > 0 {
69+
config.Burst = burst
70+
}
6571
return config, nil
6672
}

internal/server/main.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,9 @@ func (s *Server) getGinEngine() *gin.Engine {
142142

143143
icm := viper.GetBool("ignore-container-memory")
144144

145+
pollRate := viper.GetFloat64("server.poll-rate")
146+
pollBurst := viper.GetInt("server.poll-burst")
147+
145148
klog.Infof("using namespace: %s", viper.GetString("kubernetes.namespace"))
146149

147150
cr, err := common.NewContextRouter(s.kub, common.Config{
@@ -158,6 +161,8 @@ func (s *Server) getGinEngine() *gin.Engine {
158161
NamePrefix: podprfx,
159162
ActiveDeadlineSeconds: ads,
160163
IgnoreContainerMemory: icm,
164+
PollRate: pollRate,
165+
PollBurst: pollBurst,
161166
})
162167
if err != nil {
163168
klog.Errorf("error setting up context: %s", err)

internal/server/routes/common/context.go

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,10 @@ import (
99
)
1010

1111
const (
12-
// PollRate defines maximum polling request per second towards the backend
13-
PollRate = 1
14-
// PollBurst defines maximum burst poll requests towards the backend
15-
PollBurst = 3
12+
// DefaultPollRate defines maximum polling request per second towards the backend
13+
DefaultPollRate = 1
14+
// DefaultPollBurst defines maximum burst poll requests towards the backend
15+
DefaultPollBurst = 3
1616
)
1717

1818
// Config is the structure to instantiate a Router object
@@ -43,6 +43,12 @@ type Config struct {
4343
NodeSelector string
4444
// IgnoreContainerMemory is used to ignore Docker memory settings and use requests/limits from Kubedock config
4545
IgnoreContainerMemory bool
46+
// PollRate defines maximum polling requests per second towards the backend.
47+
// Defaults to DefaultPollRate if zero.
48+
PollRate float64
49+
// PollBurst defines the maximum burst of poll requests towards the backend.
50+
// Defaults to DefaultPollBurst if zero.
51+
PollBurst int
4652
}
4753

4854
// ContextRouter is the object that contains shared context for the kubedock API endpoints.
@@ -60,12 +66,20 @@ func NewContextRouter(kub backend.Backend, cfg Config) (*ContextRouter, error) {
6066
if err != nil {
6167
return nil, err
6268
}
69+
pollRate := cfg.PollRate
70+
if pollRate <= 0 {
71+
pollRate = DefaultPollRate
72+
}
73+
pollBurst := cfg.PollBurst
74+
if pollBurst <= 0 {
75+
pollBurst = DefaultPollBurst
76+
}
6377
cr := &ContextRouter{
6478
Config: cfg,
6579
DB: db,
6680
Backend: kub,
6781
Events: events.New(),
68-
Limiter: rate.NewLimiter(PollRate, PollBurst),
82+
Limiter: rate.NewLimiter(rate.Limit(pollRate), pollBurst),
6983
}
7084
return cr, nil
7185
}

0 commit comments

Comments
 (0)