Skip to content

Commit 7d7f478

Browse files
authored
Tune default QPS/Burst in Trident controller and sidecars
1 parent 1d95138 commit 7d7f478

3 files changed

Lines changed: 89 additions & 32 deletions

File tree

cli/k8s_client/yaml_factory.go

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -633,12 +633,17 @@ func GetCSIDeploymentYAML(args *DeploymentYAMLArguments) string {
633633
deploymentYAML = strings.ReplaceAll(deploymentYAML, "{AZURE_CREDENTIAL_FILE_VOLUME_MOUNT}", "")
634634
}
635635

636+
qpsTrident := commonconfig.DefaultK8sAPIQPS
636637
if args.K8sAPIQPS != 0 {
637-
queriesPerSecond := args.K8sAPIQPS
638-
burst := getBurstValueForQPS(queriesPerSecond)
639-
K8sAPITridentThrottle = fmt.Sprintf("- --k8s_api_qps=%d\n - --k8s_api_burst=%d", queriesPerSecond, burst)
640-
K8sAPISidecarThrottle = fmt.Sprintf("- --kube-api-qps=%d\n - --kube-api-burst=%d", queriesPerSecond, burst)
638+
qpsTrident = float64(args.K8sAPIQPS)
641639
}
640+
qpsTrident = max(qpsTrident, commonconfig.MinimumK8sAPIQPS)
641+
burstTrident := getBurstValueForQPS(int(qpsTrident))
642+
K8sAPITridentThrottle = fmt.Sprintf("- \"--k8s_api_qps=%.1f\"\n - \"--k8s_api_burst=%d\"", qpsTrident, burstTrident)
643+
644+
qpsSidecar := max(qpsTrident/4, commonconfig.MinimumK8sAPIQPS)
645+
burstSidecar := getBurstValueForQPS(int(qpsSidecar))
646+
K8sAPISidecarThrottle = fmt.Sprintf("- \"--kube-api-qps=%.1f\"\n - \"--kube-api-burst=%d\"", qpsSidecar, burstSidecar)
642647

643648
// Fill in the CSI feature gates from the YAML.
644649
// CSIFeatureGates should already be deduplicated.

cli/k8s_client/yaml_factory_test.go

Lines changed: 79 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -666,17 +666,6 @@ func TestGetCSIDeploymentYAML_AutosupportYAML_EnableButSilenceAutosupport(t *tes
666666
}
667667

668668
func TestGetCSIDeploymentYAML_K8sAPIQPS(t *testing.T) {
669-
const k8sAPIQPS = 100
670-
args := &DeploymentYAMLArguments{
671-
K8sAPIQPS: k8sAPIQPS,
672-
}
673-
yamlData := GetCSIDeploymentYAML(args)
674-
deployment := appsv1.Deployment{}
675-
err := yaml.Unmarshal([]byte(yamlData), &deployment)
676-
if err != nil {
677-
t.Fatalf("expected valid YAML, got %s", yamlData)
678-
}
679-
680669
containerHasArgument := func(container v1.Container, expectedArg string) bool {
681670
for _, arg := range container.Args {
682671
if arg == expectedArg {
@@ -686,23 +675,85 @@ func TestGetCSIDeploymentYAML_K8sAPIQPS(t *testing.T) {
686675
return false
687676
}
688677

689-
// trident-main container flag validation
690-
tridentMainQPSFlag := fmt.Sprintf("--k8s_api_qps=%d", k8sAPIQPS)
691-
tridentMainBurstFlag := fmt.Sprintf("--k8s_api_burst=%d", getBurstValueForQPS(k8sAPIQPS))
692-
tridentMainContainer := deployment.Spec.Template.Spec.Containers[0]
693-
assert.True(t, containerHasArgument(tridentMainContainer, tridentMainQPSFlag),
694-
"expected trident-main to have k8s_api_qps flag")
695-
assert.True(t, containerHasArgument(tridentMainContainer, tridentMainBurstFlag),
696-
"expected trident-main to have k8s_api_burst flag")
697-
698-
sidecarQPSFlag := fmt.Sprintf("--kube-api-qps=%d", k8sAPIQPS)
699-
sidecarBurstFlag := fmt.Sprintf("--kube-api-burst=%d", getBurstValueForQPS(k8sAPIQPS))
700-
// trident-main and trident-autosupport containers will not have sidecar flags
701-
for _, container := range deployment.Spec.Template.Spec.Containers[2:] {
702-
assert.True(t, containerHasArgument(container, sidecarQPSFlag),
703-
"expected sidecar %v to have kube-api-qps flag", container.Name)
704-
assert.True(t, containerHasArgument(container, sidecarBurstFlag),
705-
"expected sidecar %v to have kube-api-burst flag", container.Name)
678+
tests := []struct {
679+
name string
680+
k8sAPIQPS int
681+
expectedTridentQPS string
682+
expectedTridentBurst int
683+
expectedSidecarQPS string
684+
expectedSidecarBurst int
685+
}{
686+
{
687+
name: "default when not specified",
688+
k8sAPIQPS: 0,
689+
expectedTridentQPS: "100.0",
690+
expectedTridentBurst: 200,
691+
expectedSidecarQPS: "25.0",
692+
expectedSidecarBurst: 50,
693+
},
694+
{
695+
name: "explicit value matching default",
696+
k8sAPIQPS: 100,
697+
expectedTridentQPS: "100.0",
698+
expectedTridentBurst: 200,
699+
expectedSidecarQPS: "25.0",
700+
expectedSidecarBurst: 50,
701+
},
702+
{
703+
name: "higher explicit value",
704+
k8sAPIQPS: 200,
705+
expectedTridentQPS: "200.0",
706+
expectedTridentBurst: 400,
707+
expectedSidecarQPS: "50.0",
708+
expectedSidecarBurst: 100,
709+
},
710+
{
711+
name: "minimum clamping for Trident",
712+
k8sAPIQPS: 5,
713+
expectedTridentQPS: "10.0",
714+
expectedTridentBurst: 20,
715+
expectedSidecarQPS: "10.0",
716+
expectedSidecarBurst: 20,
717+
},
718+
{
719+
name: "minimum clamping for sidecar only",
720+
k8sAPIQPS: 20,
721+
expectedTridentQPS: "20.0",
722+
expectedTridentBurst: 40,
723+
expectedSidecarQPS: "10.0", // 20/4=5 clamped to minimum 10
724+
expectedSidecarBurst: 20,
725+
},
726+
}
727+
728+
for _, tt := range tests {
729+
t.Run(tt.name, func(t *testing.T) {
730+
args := &DeploymentYAMLArguments{
731+
K8sAPIQPS: tt.k8sAPIQPS,
732+
}
733+
yamlData := GetCSIDeploymentYAML(args)
734+
deployment := appsv1.Deployment{}
735+
err := yaml.Unmarshal([]byte(yamlData), &deployment)
736+
require.NoError(t, err, "expected valid YAML")
737+
738+
// Trident-main container flag validation (first container)
739+
tridentMainQPSFlag := fmt.Sprintf("--k8s_api_qps=%s", tt.expectedTridentQPS)
740+
tridentMainBurstFlag := fmt.Sprintf("--k8s_api_burst=%d", tt.expectedTridentBurst)
741+
tridentMainContainer := deployment.Spec.Template.Spec.Containers[0]
742+
assert.True(t, containerHasArgument(tridentMainContainer, tridentMainQPSFlag),
743+
"expected trident-main to have %s", tridentMainQPSFlag)
744+
assert.True(t, containerHasArgument(tridentMainContainer, tridentMainBurstFlag),
745+
"expected trident-main to have %s", tridentMainBurstFlag)
746+
747+
// Sidecar containers flag validation (skip trident-main and trident-autosupport)
748+
sidecarQPSFlag := fmt.Sprintf("--kube-api-qps=%s", tt.expectedSidecarQPS)
749+
sidecarBurstFlag := fmt.Sprintf("--kube-api-burst=%d", tt.expectedSidecarBurst)
750+
for _, container := range deployment.Spec.Template.Spec.Containers[2:] {
751+
assert.True(t, containerHasArgument(container, sidecarQPSFlag),
752+
"expected sidecar %s to have %s", container.Name, sidecarQPSFlag)
753+
assert.True(t, containerHasArgument(container, sidecarBurstFlag),
754+
"expected sidecar %s to have %s", container.Name, sidecarBurstFlag)
755+
}
756+
})
706757
}
707758
}
708759

config/config.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,7 @@ const (
286286
CSISidecarLivenessProbeImageTag = "livenessprobe:v2.17.0"
287287

288288
DefaultK8sAPIQPS = 100.0
289+
MinimumK8sAPIQPS = 10.0
289290
DefaultK8sAPIBurst = 200
290291

291292
NamespaceFile = "/var/run/secrets/kubernetes.io/serviceaccount/namespace"

0 commit comments

Comments
 (0)