diff --git a/cmd/controller/main.go b/cmd/controller/main.go index 115a8519af..360aa8294c 100644 --- a/cmd/controller/main.go +++ b/cmd/controller/main.go @@ -59,34 +59,39 @@ import ( ) const ( - enableStackdriverMetricsFlag = "stackdriver-exporter" - stackdriverLabels = "stackdriver-labels" - enablePrometheusMetricsFlag = "prometheus-exporter" - projectIDFlag = "gcp-project-id" - sidecarImageFlag = "sidecar-image" - sidecarCPURequestFlag = "sidecar-cpu-request" - sidecarCPULimitFlag = "sidecar-cpu-limit" - sidecarMemoryRequestFlag = "sidecar-memory-request" - sidecarMemoryLimitFlag = "sidecar-memory-limit" - sidecarRunAsUserFlag = "sidecar-run-as-user" - sdkServerAccountFlag = "sdk-service-account" - pullSidecarFlag = "always-pull-sidecar" - minPortFlag = "min-port" - maxPortFlag = "max-port" - additionalPortRangesFlag = "additional-port-ranges" - certFileFlag = "cert-file" - keyFileFlag = "key-file" - numWorkersFlag = "num-workers" - apiServerSustainedQPSFlag = "api-server-qps" - apiServerBurstQPSFlag = "api-server-qps-burst" - logDirFlag = "log-dir" - logLevelFlag = "log-level" - logSizeLimitMBFlag = "log-size-limit-mb" - kubeconfigFlag = "kubeconfig" - allocationBatchWaitTime = "allocation-batch-wait-time" - defaultResync = 30 * time.Second - podNamespace = "pod-namespace" - leaderElectionFlag = "leader-election" + enableStackdriverMetricsFlag = "stackdriver-exporter" + stackdriverLabels = "stackdriver-labels" + enablePrometheusMetricsFlag = "prometheus-exporter" + projectIDFlag = "gcp-project-id" + sidecarImageFlag = "sidecar-image" + sidecarCPURequestFlag = "sidecar-cpu-request" + sidecarCPULimitFlag = "sidecar-cpu-limit" + sidecarMemoryRequestFlag = "sidecar-memory-request" + sidecarMemoryLimitFlag = "sidecar-memory-limit" + sidecarRunAsUserFlag = "sidecar-run-as-user" + sdkServerAccountFlag = "sdk-service-account" + pullSidecarFlag = "always-pull-sidecar" + minPortFlag = "min-port" + maxPortFlag = "max-port" + additionalPortRangesFlag = "additional-port-ranges" + certFileFlag = "cert-file" + keyFileFlag = "key-file" + numWorkersFlag = "num-workers" + apiServerSustainedQPSFlag = "api-server-qps" + apiServerBurstQPSFlag = "api-server-qps-burst" + logDirFlag = "log-dir" + logLevelFlag = "log-level" + logSizeLimitMBFlag = "log-size-limit-mb" + kubeconfigFlag = "kubeconfig" + allocationBatchWaitTime = "allocation-batch-wait-time" + defaultResync = 30 * time.Second + podNamespace = "pod-namespace" + leaderElectionFlag = "leader-election" + maxCreationParallelismFlag = "max-creation-parallelism" + maxGameServerCreationsPerBatchFlag = "max-game-server-creations-per-batch" + maxDeletionParallelismFlag = "max-deletion-parallelism" + maxGameServerDeletionsPerBatchFlag = "max-game-server-deletions-per-batch" + maxPodPendingCountFlag = "max-pod-pending-count" ) var ( @@ -218,7 +223,7 @@ func main() { ctlConf.SidecarMemoryRequest, ctlConf.SidecarMemoryLimit, ctlConf.SidecarRunAsUser, ctlConf.SdkServiceAccount, kubeClient, kubeInformerFactory, extClient, agonesClient, agonesInformerFactory) gsSetController := gameserversets.NewController(health, gsCounter, - kubeClient, extClient, agonesClient, agonesInformerFactory) + kubeClient, extClient, agonesClient, agonesInformerFactory, ctlConf.MaxCreationParallelism, ctlConf.MaxDeletionParallelism, ctlConf.MaxGameServerCreationsPerBatch, ctlConf.MaxGameServerDeletionsPerBatch, ctlConf.MaxPodPendingCount) fleetController := fleets.NewController(health, kubeClient, extClient, agonesClient, agonesInformerFactory) fasController := fleetautoscalers.NewController(health, kubeClient, extClient, agonesClient, agonesInformerFactory, gsCounter) @@ -281,6 +286,12 @@ func parseEnvFlags() config { viper.SetDefault(logLevelFlag, "Info") viper.SetDefault(logSizeLimitMBFlag, 10000) // 10 GB, will be split into 100 MB chunks + viper.SetDefault(maxCreationParallelismFlag, 16) + viper.SetDefault(maxGameServerCreationsPerBatchFlag, 64) + viper.SetDefault(maxDeletionParallelismFlag, 64) + viper.SetDefault(maxGameServerDeletionsPerBatchFlag, 64) + viper.SetDefault(maxPodPendingCountFlag, 5000) + pflag.String(sidecarImageFlag, viper.GetString(sidecarImageFlag), "Flag to overwrite the GameServer sidecar image that is used. Can also use SIDECAR env variable") pflag.String(sidecarCPULimitFlag, viper.GetString(sidecarCPULimitFlag), "Flag to overwrite the GameServer sidecar container's cpu limit. Can also use SIDECAR_CPU_LIMIT env variable") pflag.String(sidecarCPURequestFlag, viper.GetString(sidecarCPURequestFlag), "Flag to overwrite the GameServer sidecar container's cpu request. Can also use SIDECAR_CPU_REQUEST env variable") @@ -304,6 +315,11 @@ func parseEnvFlags() config { pflag.Int32(apiServerBurstQPSFlag, 200, "Maximum burst queries per second to send to the API server") pflag.String(logDirFlag, viper.GetString(logDirFlag), "If set, store logs in a given directory.") pflag.Int32(logSizeLimitMBFlag, 1000, "Log file size limit in MB") + pflag.Int32(maxCreationParallelismFlag, viper.GetInt32(maxCreationParallelismFlag), "Maximum number of parallelizing creation calls in GSS controller") + pflag.Int32(maxGameServerCreationsPerBatchFlag, viper.GetInt32(maxGameServerCreationsPerBatchFlag), "Maximum number of GameServer creation calls per batch") + pflag.Int32(maxDeletionParallelismFlag, viper.GetInt32(maxDeletionParallelismFlag), "Maximum number of parallelizing deletion calls in GSS controller") + pflag.Int32(maxGameServerDeletionsPerBatchFlag, viper.GetInt32(maxGameServerDeletionsPerBatchFlag), "Maximum number of GameServers deletion calls per batch") + pflag.Int32(maxPodPendingCountFlag, viper.GetInt32(maxPodPendingCountFlag), "Maximum number of pending pods per game server set") pflag.String(logLevelFlag, viper.GetString(logLevelFlag), "Agones Log level") pflag.Duration(allocationBatchWaitTime, viper.GetDuration(allocationBatchWaitTime), "Flag to configure the waiting period between allocations batches") pflag.String(podNamespace, viper.GetString(podNamespace), "namespace of current pod") @@ -337,6 +353,11 @@ func parseEnvFlags() config { runtime.Must(viper.BindEnv(logLevelFlag)) runtime.Must(viper.BindEnv(logDirFlag)) runtime.Must(viper.BindEnv(logSizeLimitMBFlag)) + runtime.Must(viper.BindEnv(maxCreationParallelismFlag)) + runtime.Must(viper.BindEnv(maxGameServerCreationsPerBatchFlag)) + runtime.Must(viper.BindEnv(maxDeletionParallelismFlag)) + runtime.Must(viper.BindEnv(maxGameServerDeletionsPerBatchFlag)) + runtime.Must(viper.BindEnv(maxPodPendingCountFlag)) runtime.Must(viper.BindEnv(allocationBatchWaitTime)) runtime.Must(viper.BindEnv(podNamespace)) runtime.Must(viper.BindEnv(leaderElectionFlag)) @@ -376,31 +397,36 @@ func parseEnvFlags() config { } return config{ - PortRanges: portRanges, - SidecarImage: viper.GetString(sidecarImageFlag), - SidecarCPURequest: requestCPU, - SidecarCPULimit: limitCPU, - SidecarMemoryRequest: requestMemory, - SidecarMemoryLimit: limitMemory, - SidecarRunAsUser: int(viper.GetInt32(sidecarRunAsUserFlag)), - SdkServiceAccount: viper.GetString(sdkServerAccountFlag), - AlwaysPullSidecar: viper.GetBool(pullSidecarFlag), - KeyFile: viper.GetString(keyFileFlag), - CertFile: viper.GetString(certFileFlag), - KubeConfig: viper.GetString(kubeconfigFlag), - PrometheusMetrics: viper.GetBool(enablePrometheusMetricsFlag), - Stackdriver: viper.GetBool(enableStackdriverMetricsFlag), - GCPProjectID: viper.GetString(projectIDFlag), - NumWorkers: int(viper.GetInt32(numWorkersFlag)), - APIServerSustainedQPS: int(viper.GetInt32(apiServerSustainedQPSFlag)), - APIServerBurstQPS: int(viper.GetInt32(apiServerBurstQPSFlag)), - LogDir: viper.GetString(logDirFlag), - LogLevel: viper.GetString(logLevelFlag), - LogSizeLimitMB: int(viper.GetInt32(logSizeLimitMBFlag)), - StackdriverLabels: viper.GetString(stackdriverLabels), - AllocationBatchWaitTime: viper.GetDuration(allocationBatchWaitTime), - PodNamespace: viper.GetString(podNamespace), - LeaderElection: viper.GetBool(leaderElectionFlag), + PortRanges: portRanges, + SidecarImage: viper.GetString(sidecarImageFlag), + SidecarCPURequest: requestCPU, + SidecarCPULimit: limitCPU, + SidecarMemoryRequest: requestMemory, + SidecarMemoryLimit: limitMemory, + SidecarRunAsUser: int(viper.GetInt32(sidecarRunAsUserFlag)), + SdkServiceAccount: viper.GetString(sdkServerAccountFlag), + AlwaysPullSidecar: viper.GetBool(pullSidecarFlag), + KeyFile: viper.GetString(keyFileFlag), + CertFile: viper.GetString(certFileFlag), + KubeConfig: viper.GetString(kubeconfigFlag), + PrometheusMetrics: viper.GetBool(enablePrometheusMetricsFlag), + Stackdriver: viper.GetBool(enableStackdriverMetricsFlag), + GCPProjectID: viper.GetString(projectIDFlag), + NumWorkers: int(viper.GetInt32(numWorkersFlag)), + APIServerSustainedQPS: int(viper.GetInt32(apiServerSustainedQPSFlag)), + APIServerBurstQPS: int(viper.GetInt32(apiServerBurstQPSFlag)), + LogDir: viper.GetString(logDirFlag), + LogLevel: viper.GetString(logLevelFlag), + LogSizeLimitMB: int(viper.GetInt32(logSizeLimitMBFlag)), + MaxGameServerCreationsPerBatch: int(viper.GetInt32(maxGameServerCreationsPerBatchFlag)), + MaxCreationParallelism: int(viper.GetInt32(maxCreationParallelismFlag)), + MaxGameServerDeletionsPerBatch: int(viper.GetInt32(maxGameServerDeletionsPerBatchFlag)), + MaxDeletionParallelism: int(viper.GetInt32(maxDeletionParallelismFlag)), + MaxPodPendingCount: int(viper.GetInt32(maxPodPendingCountFlag)), + StackdriverLabels: viper.GetString(stackdriverLabels), + AllocationBatchWaitTime: viper.GetDuration(allocationBatchWaitTime), + PodNamespace: viper.GetString(podNamespace), + LeaderElection: viper.GetBool(leaderElectionFlag), } } @@ -429,31 +455,36 @@ func parsePortRanges(s string) (map[string]portallocator.PortRange, error) { // config stores all required configuration to create a game server controller. type config struct { - PortRanges map[string]portallocator.PortRange - SidecarImage string - SidecarCPURequest resource.Quantity - SidecarCPULimit resource.Quantity - SidecarMemoryRequest resource.Quantity - SidecarMemoryLimit resource.Quantity - SidecarRunAsUser int - SdkServiceAccount string - AlwaysPullSidecar bool - PrometheusMetrics bool - Stackdriver bool - StackdriverLabels string - KeyFile string - CertFile string - KubeConfig string - GCPProjectID string - NumWorkers int - APIServerSustainedQPS int - APIServerBurstQPS int - LogDir string - LogLevel string - LogSizeLimitMB int - AllocationBatchWaitTime time.Duration - PodNamespace string - LeaderElection bool + PortRanges map[string]portallocator.PortRange + SidecarImage string + SidecarCPURequest resource.Quantity + SidecarCPULimit resource.Quantity + SidecarMemoryRequest resource.Quantity + SidecarMemoryLimit resource.Quantity + SidecarRunAsUser int + SdkServiceAccount string + AlwaysPullSidecar bool + PrometheusMetrics bool + Stackdriver bool + StackdriverLabels string + KeyFile string + CertFile string + KubeConfig string + GCPProjectID string + NumWorkers int + APIServerSustainedQPS int + APIServerBurstQPS int + LogDir string + LogLevel string + LogSizeLimitMB int + MaxGameServerCreationsPerBatch int + MaxCreationParallelism int + MaxGameServerDeletionsPerBatch int + MaxDeletionParallelism int + MaxPodPendingCount int + AllocationBatchWaitTime time.Duration + PodNamespace string + LeaderElection bool } // validate ensures the ctlConfig data is valid. diff --git a/install/helm/agones/templates/controller.yaml b/install/helm/agones/templates/controller.yaml index 429401d5e2..a56ad3aa3c 100644 --- a/install/helm/agones/templates/controller.yaml +++ b/install/helm/agones/templates/controller.yaml @@ -148,6 +148,16 @@ spec: value: {{ .Values.agones.metrics.stackdriverProjectID | quote }} - name: NUM_WORKERS value: {{ .Values.agones.controller.numWorkers | quote }} + - name: MAX_CREATION_PARALLELISM + value: {{ .Values.agones.controller.maxCreationParallelism | quote }} + - name: MAX_GAME_SERVER_CREATIONS_PER_BATCH + value: {{ .Values.agones.controller.maxGameServerCreationsPerBatch | quote }} + - name: MAX_DELETION_PARALLELISM + value: {{ .Values.agones.controller.maxDeletionParallelism | quote }} + - name: MAX_GAME_SERVER_DELETIONS_PER_BATCH + value: {{ .Values.agones.controller.maxGameServerDeletionsPerBatch | quote }} + - name: MAX_POD_PENDING_COUNT + value: {{ .Values.agones.controller.maxPodPendingCount | quote }} - name: API_SERVER_QPS value: {{ .Values.agones.controller.apiServerQPS | quote }} - name: API_SERVER_QPS_BURST diff --git a/install/helm/agones/values.yaml b/install/helm/agones/values.yaml index c7755235cf..d125768c3c 100644 --- a/install/helm/agones/values.yaml +++ b/install/helm/agones/values.yaml @@ -81,6 +81,11 @@ agones: numWorkers: 100 apiServerQPS: 400 apiServerQPSBurst: 500 + maxCreationParallelism: 16 + maxGameServerCreationsPerBatch: 64 + maxDeletionParallelism: 64 + maxGameServerDeletionsPerBatch: 64 + maxPodPendingCount: 5000 http: port: 8080 healthCheck: diff --git a/install/yaml/install.yaml b/install/yaml/install.yaml index d0ac0ec273..4128d12d3c 100644 --- a/install/yaml/install.yaml +++ b/install/yaml/install.yaml @@ -17524,6 +17524,16 @@ spec: value: "" - name: NUM_WORKERS value: "100" + - name: MAX_CREATION_PARALLELISM + value: "16" + - name: MAX_GAME_SERVER_CREATIONS_PER_BATCH + value: "64" + - name: MAX_DELETION_PARALLELISM + value: "64" + - name: MAX_GAME_SERVER_DELETIONS_PER_BATCH + value: "64" + - name: MAX_POD_PENDING_COUNT + value: "5000" - name: API_SERVER_QPS value: "400" - name: API_SERVER_QPS_BURST diff --git a/pkg/gameserversets/controller.go b/pkg/gameserversets/controller.go index dc32defb77..03799e180e 100644 --- a/pkg/gameserversets/controller.go +++ b/pkg/gameserversets/controller.go @@ -59,15 +59,6 @@ var ( ) const ( - maxCreationParalellism = 16 - maxGameServerCreationsPerBatch = 64 - - maxDeletionParallelism = 64 - maxGameServerDeletionsPerBatch = 64 - - // maxPodPendingCount is the maximum number of pending pods per game server set - maxPodPendingCount = 5000 - // gameServerErrorDeletionDelay is the minimum amount of time to delay the deletion // of a GameServer in Error state. gameServerErrorDeletionDelay = 30 * time.Second @@ -81,19 +72,24 @@ type Extensions struct { // Controller is a GameServerSet controller type Controller struct { - baseLogger *logrus.Entry - counter *gameservers.PerNodeCounter - crdGetter apiextclientv1.CustomResourceDefinitionInterface - gameServerGetter getterv1.GameServersGetter - gameServerLister listerv1.GameServerLister - gameServerSynced cache.InformerSynced - gameServerSetGetter getterv1.GameServerSetsGetter - gameServerSetLister listerv1.GameServerSetLister - gameServerSetSynced cache.InformerSynced - workerqueue *workerqueue.WorkerQueue - recorder record.EventRecorder - stateCache *gameServerStateCache - allocationController *AllocationOverflowController + baseLogger *logrus.Entry + counter *gameservers.PerNodeCounter + crdGetter apiextclientv1.CustomResourceDefinitionInterface + gameServerGetter getterv1.GameServersGetter + gameServerLister listerv1.GameServerLister + gameServerSynced cache.InformerSynced + gameServerSetGetter getterv1.GameServerSetsGetter + gameServerSetLister listerv1.GameServerSetLister + gameServerSetSynced cache.InformerSynced + workerqueue *workerqueue.WorkerQueue + recorder record.EventRecorder + stateCache *gameServerStateCache + allocationController *AllocationOverflowController + maxCreationParallelism int + maxGameServerCreationsPerBatch int + maxDeletionParallelism int + maxGameServerDeletionsPerBatch int + maxPodPendingCount int } // NewController returns a new gameserverset crd controller @@ -103,7 +99,12 @@ func NewController( kubeClient kubernetes.Interface, extClient extclientset.Interface, agonesClient versioned.Interface, - agonesInformerFactory externalversions.SharedInformerFactory) *Controller { + agonesInformerFactory externalversions.SharedInformerFactory, + maxCreationParallelism int, + maxDeletionParallelism int, + maxGameServerCreationsPerBatch int, + maxGameServerDeletionsPerBatch int, + maxPodPendingCount int) *Controller { gameServers := agonesInformerFactory.Agones().V1().GameServers() gsInformer := gameServers.Informer() @@ -111,15 +112,20 @@ func NewController( gsSetInformer := gameServerSets.Informer() c := &Controller{ - crdGetter: extClient.ApiextensionsV1().CustomResourceDefinitions(), - counter: counter, - gameServerGetter: agonesClient.AgonesV1(), - gameServerLister: gameServers.Lister(), - gameServerSynced: gsInformer.HasSynced, - gameServerSetGetter: agonesClient.AgonesV1(), - gameServerSetLister: gameServerSets.Lister(), - gameServerSetSynced: gsSetInformer.HasSynced, - stateCache: &gameServerStateCache{}, + crdGetter: extClient.ApiextensionsV1().CustomResourceDefinitions(), + counter: counter, + gameServerGetter: agonesClient.AgonesV1(), + gameServerLister: gameServers.Lister(), + gameServerSynced: gsInformer.HasSynced, + gameServerSetGetter: agonesClient.AgonesV1(), + gameServerSetLister: gameServerSets.Lister(), + gameServerSetSynced: gsSetInformer.HasSynced, + maxCreationParallelism: maxCreationParallelism, + maxDeletionParallelism: maxDeletionParallelism, + maxGameServerCreationsPerBatch: maxGameServerCreationsPerBatch, + maxGameServerDeletionsPerBatch: maxGameServerDeletionsPerBatch, + maxPodPendingCount: maxPodPendingCount, + stateCache: &gameServerStateCache{}, } c.baseLogger = runtime.NewLoggerWithType(c) @@ -307,7 +313,7 @@ func (c *Controller) syncGameServerSet(ctx context.Context, key string) error { list = c.stateCache.forGameServerSet(gsSet).reconcileWithUpdatedServerList(list) numServersToAdd, toDelete, isPartial := computeReconciliationAction(gsSet.Spec.Scheduling, list, c.counter.Counts(), - int(gsSet.Spec.Replicas), maxGameServerCreationsPerBatch, maxGameServerDeletionsPerBatch, maxPodPendingCount, gsSet.Spec.Priorities) + int(gsSet.Spec.Replicas), c.maxGameServerCreationsPerBatch, c.maxGameServerDeletionsPerBatch, c.maxPodPendingCount, gsSet.Spec.Priorities) // GameserverSet is marked for deletion then don't add gameservers. if !gsSet.DeletionTimestamp.IsZero() { @@ -519,7 +525,7 @@ func (c *Controller) addMoreGameServers(ctx context.Context, gsSet *agonesv1.Gam }() - return parallelize(newGameServersChannel(count, gsSet), maxCreationParalellism, func(gs *agonesv1.GameServer) error { + return parallelize(newGameServersChannel(count, gsSet), c.maxCreationParallelism, func(gs *agonesv1.GameServer) error { gs, err := c.gameServerGetter.GameServers(gs.Namespace).Create(ctx, gs, metav1.CreateOptions{}) if err != nil { return errors.Wrapf(err, "error creating gameserver for gameserverset %s", gsSet.ObjectMeta.Name) @@ -534,7 +540,7 @@ func (c *Controller) addMoreGameServers(ctx context.Context, gsSet *agonesv1.Gam func (c *Controller) deleteGameServers(ctx context.Context, gsSet *agonesv1.GameServerSet, toDelete []*agonesv1.GameServer) error { loggerForGameServerSet(c.baseLogger, gsSet).WithField("diff", len(toDelete)).Debug("Deleting gameservers") - return parallelize(gameServerListToChannel(toDelete), maxDeletionParallelism, func(gs *agonesv1.GameServer) error { + return parallelize(gameServerListToChannel(toDelete), c.maxDeletionParallelism, func(gs *agonesv1.GameServer) error { // We should not delete the gameservers directly buy set their state to shutdown and let the gameserver controller to delete gsCopy := gs.DeepCopy() gsCopy.Status.State = agonesv1.GameServerStateShutdown diff --git a/pkg/gameserversets/controller_test.go b/pkg/gameserversets/controller_test.go index 770eac36af..753431993c 100644 --- a/pkg/gameserversets/controller_test.go +++ b/pkg/gameserversets/controller_test.go @@ -1300,7 +1300,7 @@ func createGameServers(gsSet *agonesv1.GameServerSet, size int) []agonesv1.GameS func newFakeController() (*Controller, agtesting.Mocks) { m := agtesting.NewMocks() counter := gameservers.NewPerNodeCounter(m.KubeInformerFactory, m.AgonesInformerFactory) - c := NewController(healthcheck.NewHandler(), counter, m.KubeClient, m.ExtClient, m.AgonesClient, m.AgonesInformerFactory) + c := NewController(healthcheck.NewHandler(), counter, m.KubeClient, m.ExtClient, m.AgonesClient, m.AgonesInformerFactory, 16, 64, 64, 64, 5000) c.recorder = m.FakeRecorder return c, m } diff --git a/site/content/en/docs/Installation/Install Agones/helm.md b/site/content/en/docs/Installation/Install Agones/helm.md index c5381d11c0..45d66f1674 100644 --- a/site/content/en/docs/Installation/Install Agones/helm.md +++ b/site/content/en/docs/Installation/Install Agones/helm.md @@ -150,6 +150,7 @@ The following tables lists the configurable parameters of the Agones chart and t ### Agones Controller +{{% feature expiryVersion="1.43.0" %}} | Parameter | Description | Default | |----------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------| | `agones.controller.replicas` | The number of replicas to run in the `agones-controller` deployment. | `2` | @@ -185,6 +186,51 @@ The following tables lists the configurable parameters of the Agones chart and t | `agones.controller.allocationBatchWaitTime` | Wait time between each allocation batch when performing allocations in controller mode | `500ms` | | `agones.controller.topologySpreadConstraints` | Ensures better resource utilization and high availability by evenly distributing Pods in the agones-system namespace | `{}` | +{{% /feature %}} +{{% feature publishVersion="1.43.0" %}} +| Parameter | Description | Default | +|----------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------| +| `agones.controller.replicas` | The number of replicas to run in the `agones-controller` deployment. | `2` | +| `agones.controller.pdb.minAvailable` | Description of the number of pods from that set that must still be available after the eviction, even in the absence of the evicted pod. Can be either an absolute number or a percentage. Mutually Exclusive with `maxUnavailable` | `1` | +| `agones.controller.pdb.maxUnavailable` | Description of the number of pods from that set that can be unavailable after the eviction. It can be either an absolute number or a percentage Mutually Exclusive with `minAvailable` | \`\` | +| `agones.controller.http.port` | Port to use for liveness probe service and metrics | `8080` | +| `agones.controller.healthCheck.initialDelaySeconds` | Initial delay before performing the first probe (in seconds) | `3` | +| `agones.controller.healthCheck.periodSeconds` | Seconds between every liveness probe (in seconds) | `3` | +| `agones.controller.healthCheck.failureThreshold` | Number of times before giving up (in seconds) | `3` | +| `agones.controller.healthCheck.timeoutSeconds` | Number of seconds after which the probe times out (in seconds) | `1` | +| `agones.controller.resources` | Controller [resource requests/limit][resources] | `{}` | +| `agones.controller.generateTLS` | Set to true to generate TLS certificates or false to provide your own certificates | `true` | +| `agones.controller.tlsCert` | Custom TLS certificate provided as a string | \`\` | +| `agones.controller.tlsKey` | Custom TLS private key provided as a string | \`\` | +| `agones.controller.nodeSelector` | Controller [node labels][nodeSelector] for pod assignment | `{}` | +| `agones.controller.tolerations` | Controller [toleration][toleration] labels for pod assignment | `[]` | +| `agones.controller.affinity` | Controller [affinity][affinity] settings for pod assignment | `{}` | +| `agones.controller.annotations` | [Annotations][annotations] added to the Agones controller pods | `{}` | +| `agones.controller.numWorkers` | Number of workers to spin per resource type | `100` | +| `agones.controller.apiServerQPS` | Maximum sustained queries per second that controller should be making against API Server | `400` | +| `agones.controller.apiServerQPSBurst` | Maximum burst queries per second that controller should be making against API Server | `500` | +| `agones.controller.logLevel` | Agones Controller Log level. Log only entries with that severity and above | `info` | +| `agones.controller.persistentLogs` | Store Agones controller logs in a temporary volume attached to a container for debugging | `true` | +| `agones.controller.persistentLogsSizeLimitMB` | Maximum total size of all Agones container logs in MB | `10000` | +| `agones.controller.disableSecret` | **Deprecated**. Use `agones.extensions.disableSecret` instead. Disables the creation of any allocator secrets. If true, you MUST provide the `{agones.releaseName}-cert` secrets before installation. | `false` | +| `agones.controller.customCertSecretPath` | Remap cert-manager path to server.crt and server.key | `{}` | +| `agones.controller.allocationApiService.annotations` | **Deprecated**. Use `agones.extensions.allocationApiService.annotations` instead. [Annotations][annotations] added to the Agones apiregistration | `{}` | +| `agones.controller.allocationApiService.disableCaBundle` | **Deprecated**. Use `agones.extensions.allocationApiService.disableCaBundle` instead. Disable ca-bundle so it can be injected by cert-manager. | `false` | +| `agones.controller.validatingWebhook.annotations` | **Deprecated**. Use `agones.extensions.validatingWebhook.annotations` instead. [Annotations][annotations] added to the Agones validating webhook | `{}` | +| `agones.controller.validatingWebhook.disableCaBundle` | **Deprecated**. Use `agones.extensions.validatingWebhook.disableCaBundle` instead. Disable ca-bundle so it can be injected by cert-manager | `false` | +| `agones.controller.mutatingWebhook.annotations` | **Deprecated**. Use `agones.extensions.mutatingWebhook.annotations` instead. [Annotations][annotations] added to the Agones mutating webhook | `{}` | +| `agones.controller.mutatingWebhook.disableCaBundle` | **Deprecated**. Use `agones.extensions.mutatingWebhook.disableCaBundle` instead. Disable ca-bundle so it can be injected by cert-manager | `false` | +| `agones.controller.allocationBatchWaitTime` | Wait time between each allocation batch when performing allocations in controller mode | `500ms` | +| `agones.controller.topologySpreadConstraints` | Ensures better resource utilization and high availability by evenly distributing Pods in the agones-system namespace | `{}` | +| `agones.controller.maxCreationParallelism` | Maximum number of parallelizing creation calls in GSS controller | `16` | +| `agones.controller.maxGameServerCreationsPerBatch` | Maximum number of GameServer creation calls per batch | `64` | +| `agones.controller.maxDeletionParallelism` | Maximum number of parallelizing deletion calls in GSS | `64` | +| `agones.controller.maxGameServerDeletionsPerBatch` | Maximum number of GameServer deletion calls per batch | `64` | +| `agones.controller.maxPodPendingCount` | Maximum number of pending pods per game server set | `5000` | + +{{% /feature %}} + + ### Ping Service | Parameter | Description | Default |