Set per-controller reconcile concurrency defaults and remove --default-max-concurrent-reconciles (#4670)

This commit is contained in:
Nikola Jokic
2026-09-21 11:32:52 +02:00
committed by GitHub
parent c2104a0b72
commit 68e4cfeea5
9 changed files with 166 additions and 113 deletions
@@ -47,9 +47,6 @@ args:
{{- with .Values.controller.manager.config.watchSingleNamespace }}
- "--watch-single-namespace={{ . }}"
{{- end }}
{{- with .Values.controller.manager.config.defaultMaxConcurrentReconciles }}
- "--default-max-concurrent-reconciles={{ . }}"
{{- end }}
{{- with .Values.controller.manager.config.autoscalingRunnerSetMaxConcurrentReconciles }}
- "--autoscaling-runner-set-max-concurrent-reconciles={{ . }}"
{{- end }}
@@ -74,33 +74,31 @@ tests:
path: spec.template.spec.containers[0].args
content: "--listener-metrics-endpoint=/metrics"
- it: should omit every max-concurrent-reconciles flag by default
- it: should render every max-concurrent-reconciles flag by default
release:
name: "test-arc"
namespace: "test-ns"
asserts:
- notContains:
# An exact match, so this pins both the values and the render order.
- equal:
path: spec.template.spec.containers[0].args
content: "--ephemeral-runner-max-concurrent-reconciles=1"
- notContains:
path: spec.template.spec.containers[0].args
content: "--default-max-concurrent-reconciles=1"
- notContains:
path: spec.template.spec.containers[0].args
content: "--autoscaling-runner-set-max-concurrent-reconciles=1"
- notContains:
path: spec.template.spec.containers[0].args
content: "--autoscaling-listener-max-concurrent-reconciles=1"
- notContains:
path: spec.template.spec.containers[0].args
content: "--ephemeral-runner-set-max-concurrent-reconciles=1"
value:
- "--auto-scaling-runner-set-only"
- "--log-level=debug"
- "--log-format=text"
- "--autoscaling-runner-set-max-concurrent-reconciles=2"
- "--autoscaling-listener-max-concurrent-reconciles=2"
- "--ephemeral-runner-set-max-concurrent-reconciles=2"
- "--ephemeral-runner-max-concurrent-reconciles=4"
- "--listener-metrics-addr=0"
- "--listener-metrics-endpoint="
- "--metrics-addr=0"
- it: should include every max-concurrent-reconciles flag when configured
set:
controller:
manager:
config:
defaultMaxConcurrentReconciles: 4
autoscalingRunnerSetMaxConcurrentReconciles: 3
autoscalingListenerMaxConcurrentReconciles: 5
ephemeralRunnerSetMaxConcurrentReconciles: 6
@@ -109,9 +107,6 @@ tests:
name: "test-arc"
namespace: "test-ns"
asserts:
- contains:
path: spec.template.spec.containers[0].args
content: "--default-max-concurrent-reconciles=4"
- contains:
path: spec.template.spec.containers[0].args
content: "--autoscaling-runner-set-max-concurrent-reconciles=3"
@@ -28,15 +28,16 @@ controller:
# Defaults to watch all namespaces when unset.
watchSingleNamespace: ""
# The maximum number of concurrent reconciles applied to every controller that does not
# set its own value below. Defaults to 1 when unset.
defaultMaxConcurrentReconciles: null
# Per-controller overrides. Each defaults to defaultMaxConcurrentReconciles when unset.
autoscalingRunnerSetMaxConcurrentReconciles: null
autoscalingListenerMaxConcurrentReconciles: null
ephemeralRunnerSetMaxConcurrentReconciles: null
ephemeralRunnerMaxConcurrentReconciles: null
# The maximum number of concurrent reconciles for each controller, set directly
# per controller.
autoscalingRunnerSetMaxConcurrentReconciles: 2
autoscalingListenerMaxConcurrentReconciles: 2
ephemeralRunnerSetMaxConcurrentReconciles: 2
# The EphemeralRunner controller is higher because it is the only one of the four that
# routinely has many distinct objects to reconcile at once, one per runner.
# controller-runtime serialises reconciles per object, so extra workers on the other
# three only pay off when many runner scale sets exist.
ephemeralRunnerMaxConcurrentReconciles: 4
# List of label prefixes that should NOT be propagated to internal resources.
excludeLabelPropagationPrefixes: []
@@ -67,9 +67,6 @@ spec:
{{- with .Values.flags.watchSingleNamespace }}
- "--watch-single-namespace={{ . }}"
{{- end }}
{{- with .Values.flags.defaultMaxConcurrentReconciles }}
- "--default-max-concurrent-reconciles={{ . }}"
{{- end }}
{{- with .Values.flags.autoscalingRunnerSetMaxConcurrentReconciles }}
- "--autoscaling-runner-set-max-concurrent-reconciles={{ . }}"
{{- end }}
@@ -363,6 +363,10 @@ func TestTemplate_ControllerDeployment_Defaults(t *testing.T) {
"--auto-scaling-runner-set-only",
"--log-level=debug",
"--log-format=text",
"--autoscaling-runner-set-max-concurrent-reconciles=2",
"--autoscaling-listener-max-concurrent-reconciles=2",
"--ephemeral-runner-set-max-concurrent-reconciles=2",
"--ephemeral-runner-max-concurrent-reconciles=4",
"--metrics-addr=0",
"--listener-metrics-addr=0",
"--listener-metrics-endpoint=",
@@ -514,6 +518,10 @@ func TestTemplate_ControllerDeployment_Customize(t *testing.T) {
"--auto-scaler-image-pull-secrets=dockerhub",
"--log-level=info",
"--log-format=json",
"--autoscaling-runner-set-max-concurrent-reconciles=2",
"--autoscaling-listener-max-concurrent-reconciles=2",
"--ephemeral-runner-set-max-concurrent-reconciles=2",
"--ephemeral-runner-max-concurrent-reconciles=4",
"--listener-metrics-addr=0",
"--listener-metrics-endpoint=",
"--metrics-addr=0",
@@ -641,6 +649,10 @@ func TestTemplate_EnableLeaderElection(t *testing.T) {
"--leader-election-id=test-arc-gha-rs-controller",
"--log-level=debug",
"--log-format=text",
"--autoscaling-runner-set-max-concurrent-reconciles=2",
"--autoscaling-listener-max-concurrent-reconciles=2",
"--ephemeral-runner-set-max-concurrent-reconciles=2",
"--ephemeral-runner-max-concurrent-reconciles=4",
"--listener-metrics-addr=0",
"--listener-metrics-endpoint=",
"--metrics-addr=0",
@@ -681,6 +693,10 @@ func TestTemplate_ControllerDeployment_ForwardImagePullSecrets(t *testing.T) {
"--auto-scaler-image-pull-secrets=ghcr",
"--log-level=debug",
"--log-format=text",
"--autoscaling-runner-set-max-concurrent-reconciles=2",
"--autoscaling-listener-max-concurrent-reconciles=2",
"--ephemeral-runner-set-max-concurrent-reconciles=2",
"--ephemeral-runner-max-concurrent-reconciles=4",
"--listener-metrics-addr=0",
"--listener-metrics-endpoint=",
"--metrics-addr=0",
@@ -770,6 +786,10 @@ func TestTemplate_ControllerDeployment_WatchSingleNamespace(t *testing.T) {
"--log-level=debug",
"--log-format=text",
"--watch-single-namespace=demo",
"--autoscaling-runner-set-max-concurrent-reconciles=2",
"--autoscaling-listener-max-concurrent-reconciles=2",
"--ephemeral-runner-set-max-concurrent-reconciles=2",
"--ephemeral-runner-max-concurrent-reconciles=4",
"--listener-metrics-addr=0",
"--listener-metrics-endpoint=",
"--metrics-addr=0",
@@ -801,30 +821,49 @@ func TestTemplate_ControllerDeployment_MaxConcurrentReconciles(t *testing.T) {
releaseName := "test-arc"
namespaceName := "test-" + strings.ToLower(random.UniqueID())
options := &helm.Options{
Logger: logger.Discard,
SetValues: map[string]string{
"flags.defaultMaxConcurrentReconciles": "4",
"flags.autoscalingRunnerSetMaxConcurrentReconciles": "3",
"flags.autoscalingListenerMaxConcurrentReconciles": "5",
"flags.ephemeralRunnerSetMaxConcurrentReconciles": "6",
"flags.ephemeralRunnerMaxConcurrentReconciles": "20",
},
KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName),
}
t.Run("every flag renders by default", func(t *testing.T) {
options := &helm.Options{
Logger: logger.Discard,
KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName),
}
output := helm.RenderTemplateContext(t, t.Context(), options, helmChartPath, releaseName, []string{"templates/deployment.yaml"})
output := helm.RenderTemplateContext(t, t.Context(), options, helmChartPath, releaseName, []string{"templates/deployment.yaml"})
var deployment appsv1.Deployment
helm.UnmarshalK8SYaml(t, output, &deployment)
var deployment appsv1.Deployment
helm.UnmarshalK8SYaml(t, output, &deployment)
assert.Len(t, deployment.Spec.Template.Spec.Containers, 1)
args := deployment.Spec.Template.Spec.Containers[0].Args
assert.Contains(t, args, "--default-max-concurrent-reconciles=4")
assert.Contains(t, args, "--autoscaling-runner-set-max-concurrent-reconciles=3")
assert.Contains(t, args, "--autoscaling-listener-max-concurrent-reconciles=5")
assert.Contains(t, args, "--ephemeral-runner-set-max-concurrent-reconciles=6")
assert.Contains(t, args, "--ephemeral-runner-max-concurrent-reconciles=20")
require.Len(t, deployment.Spec.Template.Spec.Containers, 1)
args := deployment.Spec.Template.Spec.Containers[0].Args
assert.Contains(t, args, "--autoscaling-runner-set-max-concurrent-reconciles=2")
assert.Contains(t, args, "--autoscaling-listener-max-concurrent-reconciles=2")
assert.Contains(t, args, "--ephemeral-runner-set-max-concurrent-reconciles=2")
assert.Contains(t, args, "--ephemeral-runner-max-concurrent-reconciles=4")
})
t.Run("every flag renders when configured", func(t *testing.T) {
options := &helm.Options{
Logger: logger.Discard,
SetValues: map[string]string{
"flags.autoscalingRunnerSetMaxConcurrentReconciles": "3",
"flags.autoscalingListenerMaxConcurrentReconciles": "5",
"flags.ephemeralRunnerSetMaxConcurrentReconciles": "6",
"flags.ephemeralRunnerMaxConcurrentReconciles": "20",
},
KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName),
}
output := helm.RenderTemplateContext(t, t.Context(), options, helmChartPath, releaseName, []string{"templates/deployment.yaml"})
var deployment appsv1.Deployment
helm.UnmarshalK8SYaml(t, output, &deployment)
require.Len(t, deployment.Spec.Template.Spec.Containers, 1)
args := deployment.Spec.Template.Spec.Containers[0].Args
assert.Contains(t, args, "--autoscaling-runner-set-max-concurrent-reconciles=3")
assert.Contains(t, args, "--autoscaling-listener-max-concurrent-reconciles=5")
assert.Contains(t, args, "--ephemeral-runner-set-max-concurrent-reconciles=6")
assert.Contains(t, args, "--ephemeral-runner-max-concurrent-reconciles=20")
})
}
func TestTemplate_ControllerContainerEnvironmentVariables(t *testing.T) {
@@ -114,16 +114,17 @@ flags:
## Defaults to watch all namespaces when unset.
# watchSingleNamespace: ""
## The maximum number of concurrent reconciles applied to every controller that does not set its own value below.
# Increase this value to improve the throughput of the controller when running many runner scale sets.
# It may also increase the load on the API server and the external service (e.g. GitHub API).
# defaultMaxConcurrentReconciles: 1
## Per-controller overrides. Each defaults to defaultMaxConcurrentReconciles when unset.
# autoscalingRunnerSetMaxConcurrentReconciles: 1
# autoscalingListenerMaxConcurrentReconciles: 1
# ephemeralRunnerSetMaxConcurrentReconciles: 1
# ephemeralRunnerMaxConcurrentReconciles: 1
## The maximum number of concurrent reconciles for each controller, set directly per controller.
# Increase these values to improve the throughput of the controller when running many runner scale sets.
# They may also increase the load on the API server and the external service (e.g. GitHub API).
autoscalingRunnerSetMaxConcurrentReconciles: 2
autoscalingListenerMaxConcurrentReconciles: 2
ephemeralRunnerSetMaxConcurrentReconciles: 2
## The EphemeralRunner controller is higher because it is the only one of the four that routinely
## has many distinct objects to reconcile at once, one per runner. controller-runtime serialises
## reconciles per object, so extra workers on the other three only pay off when many runner scale
## sets exist.
ephemeralRunnerMaxConcurrentReconciles: 4
## Defines a list of prefixes that should not be propagated to internal resources.
## This is useful when you have labels that are used for internal purposes and should not be propagated to internal resources.
+28 -22
View File
@@ -10,54 +10,60 @@ import (
// Options is the optional configuration for the controllers, which can be
// set via command-line flags or environment variables.
type Options struct {
// DefaultMaxConcurrentReconciles is the maximum number of concurrent Reconciles
// applied to every controller that does not have its own value set below.
DefaultMaxConcurrentReconciles int
// AutoscalingRunnerSetMaxConcurrentReconciles is the maximum number of concurrent Reconciles
// which can be run by the AutoscalingRunnerSetController. Zero means DefaultMaxConcurrentReconciles.
// which can be run by the AutoscalingRunnerSetController. Values of zero or less are replaced
// by the shipped default in Resolve.
AutoscalingRunnerSetMaxConcurrentReconciles int
// AutoscalingListenerMaxConcurrentReconciles is the maximum number of concurrent Reconciles
// which can be run by the AutoscalingListenerController. Zero means DefaultMaxConcurrentReconciles.
// which can be run by the AutoscalingListenerController. Values of zero or less are replaced
// by the shipped default in Resolve.
AutoscalingListenerMaxConcurrentReconciles int
// EphemeralRunnerSetMaxConcurrentReconciles is the maximum number of concurrent Reconciles
// which can be run by the EphemeralRunnerSetController. Zero means DefaultMaxConcurrentReconciles.
// which can be run by the EphemeralRunnerSetController. Values of zero or less are replaced
// by the shipped default in Resolve.
EphemeralRunnerSetMaxConcurrentReconciles int
// EphemeralRunnerMaxConcurrentReconciles is the maximum number of concurrent Reconciles
// which can be run by the EphemeralRunnerController. Zero means DefaultMaxConcurrentReconciles.
// which can be run by the EphemeralRunnerController. Values of zero or less are replaced
// by the shipped default in Resolve.
EphemeralRunnerMaxConcurrentReconciles int
}
// OptionsWithDefault returns the default options.
// This is here to maintain the options and their default values in one place,
// rather than having to correlate those in multiple places.
//
// The EphemeralRunner controller gets a higher value than the rest because it
// is the only one of the four that routinely has many distinct objects to
// reconcile at once: one per runner. controller-runtime serialises reconciles
// per object, so extra workers on the other three controllers only pay off
// when many runner scale sets exist.
func OptionsWithDefault() Options {
return Options{
DefaultMaxConcurrentReconciles: 1,
AutoscalingRunnerSetMaxConcurrentReconciles: 2,
AutoscalingListenerMaxConcurrentReconciles: 2,
EphemeralRunnerSetMaxConcurrentReconciles: 2,
EphemeralRunnerMaxConcurrentReconciles: 4,
}
}
// Resolve returns a copy of the options where a DefaultMaxConcurrentReconciles
// of zero or less is replaced by 1, and every per-controller
// MaxConcurrentReconciles that is left at zero is replaced by
// DefaultMaxConcurrentReconciles.
// Resolve returns a copy of the options where every MaxConcurrentReconciles of
// zero or less is replaced by that controller's shipped default, so a
// non-positive value can never reach controller-runtime.
func (o Options) Resolve() Options {
if o.DefaultMaxConcurrentReconciles <= 0 {
o.DefaultMaxConcurrentReconciles = 1
}
orDefault := func(n int) int {
defaults := OptionsWithDefault()
orDefault := func(n, def int) int {
if n > 0 {
return n
}
return o.DefaultMaxConcurrentReconciles
return def
}
o.AutoscalingRunnerSetMaxConcurrentReconciles = orDefault(o.AutoscalingRunnerSetMaxConcurrentReconciles)
o.AutoscalingListenerMaxConcurrentReconciles = orDefault(o.AutoscalingListenerMaxConcurrentReconciles)
o.EphemeralRunnerSetMaxConcurrentReconciles = orDefault(o.EphemeralRunnerSetMaxConcurrentReconciles)
o.EphemeralRunnerMaxConcurrentReconciles = orDefault(o.EphemeralRunnerMaxConcurrentReconciles)
o.AutoscalingRunnerSetMaxConcurrentReconciles = orDefault(o.AutoscalingRunnerSetMaxConcurrentReconciles, defaults.AutoscalingRunnerSetMaxConcurrentReconciles)
o.AutoscalingListenerMaxConcurrentReconciles = orDefault(o.AutoscalingListenerMaxConcurrentReconciles, defaults.AutoscalingListenerMaxConcurrentReconciles)
o.EphemeralRunnerSetMaxConcurrentReconciles = orDefault(o.EphemeralRunnerSetMaxConcurrentReconciles, defaults.EphemeralRunnerSetMaxConcurrentReconciles)
o.EphemeralRunnerMaxConcurrentReconciles = orDefault(o.EphemeralRunnerMaxConcurrentReconciles, defaults.EphemeralRunnerMaxConcurrentReconciles)
return o
}
+39 -20
View File
@@ -9,35 +9,54 @@ import (
func TestOptionsResolve(t *testing.T) {
t.Parallel()
t.Run("unset per-controller values fall back to the default", func(t *testing.T) {
t.Run("the shipped defaults are used as-is", func(t *testing.T) {
got := OptionsWithDefault().Resolve()
assert.Equal(t, 1, got.DefaultMaxConcurrentReconciles)
assert.Equal(t, 1, got.AutoscalingRunnerSetMaxConcurrentReconciles)
assert.Equal(t, 1, got.AutoscalingListenerMaxConcurrentReconciles)
assert.Equal(t, 1, got.EphemeralRunnerSetMaxConcurrentReconciles)
assert.Equal(t, 1, got.EphemeralRunnerMaxConcurrentReconciles)
assert.Equal(t, 2, got.AutoscalingRunnerSetMaxConcurrentReconciles)
assert.Equal(t, 2, got.AutoscalingListenerMaxConcurrentReconciles)
assert.Equal(t, 2, got.EphemeralRunnerSetMaxConcurrentReconciles)
assert.Equal(t, 4, got.EphemeralRunnerMaxConcurrentReconciles)
})
t.Run("a default of zero or less is replaced by 1", func(t *testing.T) {
t.Run("the shipped defaults survive a second resolve", func(t *testing.T) {
once := OptionsWithDefault().Resolve()
assert.Equal(t, once, once.Resolve())
})
t.Run("explicit values win over the defaults", func(t *testing.T) {
opts := Options{
AutoscalingRunnerSetMaxConcurrentReconciles: 3,
AutoscalingListenerMaxConcurrentReconciles: 5,
EphemeralRunnerSetMaxConcurrentReconciles: 6,
EphemeralRunnerMaxConcurrentReconciles: 20,
}
got := opts.Resolve()
assert.Equal(t, 3, got.AutoscalingRunnerSetMaxConcurrentReconciles)
assert.Equal(t, 5, got.AutoscalingListenerMaxConcurrentReconciles)
assert.Equal(t, 6, got.EphemeralRunnerSetMaxConcurrentReconciles)
assert.Equal(t, 20, got.EphemeralRunnerMaxConcurrentReconciles)
})
t.Run("a value of zero or less is replaced by that controller's default", func(t *testing.T) {
for _, n := range []int{0, -1} {
opts := Options{DefaultMaxConcurrentReconciles: n}
opts := Options{
AutoscalingRunnerSetMaxConcurrentReconciles: n,
AutoscalingListenerMaxConcurrentReconciles: n,
EphemeralRunnerSetMaxConcurrentReconciles: n,
EphemeralRunnerMaxConcurrentReconciles: n,
}
got := opts.Resolve()
assert.Equal(t, 1, got.DefaultMaxConcurrentReconciles)
assert.Equal(t, 1, got.AutoscalingRunnerSetMaxConcurrentReconciles)
assert.Equal(t, 1, got.AutoscalingListenerMaxConcurrentReconciles)
assert.Equal(t, 1, got.EphemeralRunnerSetMaxConcurrentReconciles)
assert.Equal(t, 1, got.EphemeralRunnerMaxConcurrentReconciles)
assert.Equal(t, OptionsWithDefault(), got, "a non-positive value must never reach controller-runtime")
}
})
t.Run("a changed default applies to every unset controller", func(t *testing.T) {
t.Run("a single non-positive value does not disturb the others", func(t *testing.T) {
opts := OptionsWithDefault()
opts.DefaultMaxConcurrentReconciles = 4
opts.EphemeralRunnerMaxConcurrentReconciles = 20
opts.AutoscalingListenerMaxConcurrentReconciles = 7
opts.EphemeralRunnerMaxConcurrentReconciles = 0
got := opts.Resolve()
assert.Equal(t, 4, got.AutoscalingRunnerSetMaxConcurrentReconciles)
assert.Equal(t, 4, got.AutoscalingListenerMaxConcurrentReconciles)
assert.Equal(t, 4, got.EphemeralRunnerSetMaxConcurrentReconciles)
assert.Equal(t, 20, got.EphemeralRunnerMaxConcurrentReconciles)
assert.Equal(t, 7, got.AutoscalingListenerMaxConcurrentReconciles)
assert.Equal(t, 4, got.EphemeralRunnerMaxConcurrentReconciles)
assert.Equal(t, 2, got.AutoscalingRunnerSetMaxConcurrentReconciles)
assert.Equal(t, 2, got.EphemeralRunnerSetMaxConcurrentReconciles)
})
}
+4 -6
View File
@@ -151,11 +151,10 @@ func main() {
flag.DurationVar(&defaultScaleDownDelay, "default-scale-down-delay", actionssummerwindnet.DefaultScaleDownDelay, "The approximate delay for a scale down followed by a scale up, used to prevent flapping (down->up->down->... loop)")
flag.IntVar(&port, "port", 9443, "The port to which the admission webhook endpoint should bind")
flag.DurationVar(&syncPeriod, "sync-period", 1*time.Minute, "Determines the minimum frequency at which K8s resources managed by this controller are reconciled.")
flag.IntVar(&opts.DefaultMaxConcurrentReconciles, "default-max-concurrent-reconciles", opts.DefaultMaxConcurrentReconciles, "The maximum number of concurrent reconciles applied to every controller that does not set its own --<controller>-max-concurrent-reconciles flag. Increase this value to improve the throughput of the controller, but it may also increase the load on the API server and the external service (e.g. GitHub API).")
flag.IntVar(&opts.AutoscalingRunnerSetMaxConcurrentReconciles, "autoscaling-runner-set-max-concurrent-reconciles", 0, "The maximum number of concurrent reconciles which can be run by the AutoscalingRunnerSet controller. Defaults to --default-max-concurrent-reconciles.")
flag.IntVar(&opts.AutoscalingListenerMaxConcurrentReconciles, "autoscaling-listener-max-concurrent-reconciles", 0, "The maximum number of concurrent reconciles which can be run by the AutoscalingListener controller. Defaults to --default-max-concurrent-reconciles.")
flag.IntVar(&opts.EphemeralRunnerSetMaxConcurrentReconciles, "ephemeral-runner-set-max-concurrent-reconciles", 0, "The maximum number of concurrent reconciles which can be run by the EphemeralRunnerSet controller. Defaults to --default-max-concurrent-reconciles.")
flag.IntVar(&opts.EphemeralRunnerMaxConcurrentReconciles, "ephemeral-runner-max-concurrent-reconciles", 0, "The maximum number of concurrent reconciles which can be run by the EphemeralRunner controller. Defaults to --default-max-concurrent-reconciles.")
flag.IntVar(&opts.AutoscalingRunnerSetMaxConcurrentReconciles, "autoscaling-runner-set-max-concurrent-reconciles", opts.AutoscalingRunnerSetMaxConcurrentReconciles, "The maximum number of concurrent reconciles which can be run by the AutoscalingRunnerSet controller. Increase this value to improve throughput when running many runner scale sets, at the cost of more load on the API server and the external service (e.g. GitHub API).")
flag.IntVar(&opts.AutoscalingListenerMaxConcurrentReconciles, "autoscaling-listener-max-concurrent-reconciles", opts.AutoscalingListenerMaxConcurrentReconciles, "The maximum number of concurrent reconciles which can be run by the AutoscalingListener controller. Increase this value to improve throughput when running many runner scale sets, at the cost of more load on the API server and the external service (e.g. GitHub API).")
flag.IntVar(&opts.EphemeralRunnerSetMaxConcurrentReconciles, "ephemeral-runner-set-max-concurrent-reconciles", opts.EphemeralRunnerSetMaxConcurrentReconciles, "The maximum number of concurrent reconciles which can be run by the EphemeralRunnerSet controller. Increase this value to improve throughput when running many runner scale sets, at the cost of more load on the API server and the external service (e.g. GitHub API).")
flag.IntVar(&opts.EphemeralRunnerMaxConcurrentReconciles, "ephemeral-runner-max-concurrent-reconciles", opts.EphemeralRunnerMaxConcurrentReconciles, "The maximum number of concurrent reconciles which can be run by the EphemeralRunner controller. Increase this value to improve runner provisioning and cleanup throughput, at the cost of more load on the API server and the external service (e.g. GitHub API).")
flag.Var(&commonRunnerLabels, "common-runner-labels", "Runner labels in the K1=V1,K2=V2,... format that are inherited all the runners created by the controller. See https://github.com/actions/actions-runner-controller/issues/321 for more information")
flag.StringVar(&namespace, "watch-namespace", "", "The namespace to watch for custom resources. Set to empty for letting it watch for all namespaces.")
flag.StringVar(&watchSingleNamespace, "watch-single-namespace", "", "Restrict to watch for custom resources in a single namespace.")
@@ -180,7 +179,6 @@ func main() {
c.Log = &log
log.Info("Using options",
"default-max-concurrent-reconciles", opts.DefaultMaxConcurrentReconciles,
"autoscaling-runner-set-max-concurrent-reconciles", opts.AutoscalingRunnerSetMaxConcurrentReconciles,
"autoscaling-listener-max-concurrent-reconciles", opts.AutoscalingListenerMaxConcurrentReconciles,
"ephemeral-runner-set-max-concurrent-reconciles", opts.EphemeralRunnerSetMaxConcurrentReconciles,