Workflow Controller ConfigMap

July 7, 2026 · View on GitHub

Introduction

The Workflow Controller ConfigMap is used to set controller-wide settings.

For a detailed example, please see workflow-controller-configmap.yaml.

Alternate Structure

In all versions, the configuration may be under a config: | key:

# This file describes the config settings available in the workflow controller configmap
apiVersion: v1
kind: ConfigMap
metadata:
  name: workflow-controller-configmap
data:
  config: |
    instanceID: my-ci-controller
    artifactRepository:
      archiveLogs: true
      s3:
        endpoint: s3.amazonaws.com
        bucket: my-bucket
        region: us-west-2
        insecure: false
        accessKeySecret:
          name: my-s3-credentials
          key: accessKey
        secretKeySecret:
          name: my-s3-credentials
          key: secretKey

In version 2.7+, the config: | key is optional. However, if the config: | key is not used, all nested maps under top level keys should be strings. This makes it easier to generate the map with some configuration management tools like Kustomize.

# This file describes the config settings available in the workflow controller configmap
apiVersion: v1
kind: ConfigMap
metadata:
  name: workflow-controller-configmap
data:                      # "config: |" key is optional in 2.7+!
  instanceID: my-ci-controller
  artifactRepository: |    # However, all nested maps must be strings
   archiveLogs: true
   s3:
     endpoint: s3.amazonaws.com
     bucket: my-bucket
     region: us-west-2
     insecure: false
     accessKeySecret:
       name: my-s3-credentials
       key: accessKey
     secretKeySecret:
       name: my-s3-credentials
       key: secretKey

Config

Config contains the root of the configuration settings for the workflow controller as read from the ConfigMap called workflow-controller-configmap

Fields

Field NameField TypeDescription
NodeEventsNodeEventsNodeEvents configures how node events are emitted
WorkflowEventsWorkflowEventsWorkflowEvents configures how workflow events are emitted
Executorapiv1.ContainerExecutor holds container customizations for the executor to use when running pods
MainContainerapiv1.ContainerMainContainer holds container customization for the main container
KubeConfigKubeConfigKubeConfig specifies a kube config file for the wait & init containers
ArtifactRepositorywfv1.ArtifactRepositoryArtifactRepository contains the default location of an artifact repository for container artifacts
NamespacestringNamespace is a label selector filter to limit the controller's watch to a specific namespace
InstanceIDstringInstanceID is a label selector to limit the controller's watch to a specific instance. It contains an arbitrary value that is carried forward into its pod labels, under the key workflows.argoproj.io/controller-instanceid, for the purposes of workflow segregation. This enables a controller to only receive workflow and pod events that it is interested about, in order to support multiple controllers in a single cluster, and ultimately allows the controller itself to be bundled as part of a higher level application. If omitted, the controller watches workflows and pods that are not labeled with an instance id. See Scaling - Instance ID for more details.
MetricsConfigMetricsConfigMetricsConfig specifies configuration for metrics emission. Metrics are enabled and emitted on localhost:9090/metrics by default.
TelemetryConfigMetricsConfigTelemetryConfig specifies configuration for telemetry emission. Telemetry is enabled and emitted in the same endpoint as metrics by default, but can be overridden using this config.
ParallelismintParallelism limits the max total parallel workflows that can execute at the same time
NamespaceParallelismintNamespaceParallelism limits the max workflows that can execute at the same time in a namespace
ResourceRateLimitResourceRateLimitResourceRateLimit limits the rate at which pods are created
PersistencePersistConfigPersistence contains the workflow persistence DB configuration
LinksArray<Link>Links to related apps.
ColumnsArray<Column>Columns are custom columns that will be exposed in the Workflow List View.
WorkflowDefaultswfv1.WorkflowWorkflowDefaults are values that will apply to all Workflows from this controller, unless overridden on the Workflow-level
PodSpecLogStrategyPodSpecLogStrategyPodSpecLogStrategy enables the logging of podspec on controller log.
PodGCGracePeriodSecondsint64PodGCGracePeriodSeconds specifies the duration in seconds before a terminating pod is forcefully killed. Value must be non-negative integer. A zero value indicates that the pod will be forcefully terminated immediately. Defaults to the Kubernetes default of 30 seconds.
PodGCDeleteDelayDurationmetav1.DurationPodGCDeleteDelayDuration specifies the duration before pods in the GC queue get deleted. Value must be non-negative. A zero value indicates that the pods will be deleted immediately. Defaults to 5 seconds.
WorkflowRestrictionsWorkflowRestrictionsWorkflowRestrictions restricts the controller to executing Workflows that meet certain restrictions
InitialDelaymetav1.DurationAdds configurable initial delay (for K8S clusters with mutating webhooks) to prevent workflow getting modified by MWC.
ImagesMap<string,Image>The command/args for each image, needed when the command is not specified and the emissary executor is used. https://argo-workflows.readthedocs.io/en/latest/workflow-executors/#emissary-emissary
RetentionPolicyRetentionPolicyWorkflow retention by number of workflows
NavColorstringNavColor is an ui navigation bar background color
SSOSSOConfigSSO in settings for single-sign on
SynchronizationSyncConfigSynchronization via databases config
ArtifactDriversArray<ArtifactDriver>ArtifactDrivers lists artifact driver plugins we can use
FailedPodRestartFailedPodRestartConfigFailedPodRestart configures automatic restart of pods that fail before entering Running state (e.g., due to Eviction, DiskPressure, Preemption). This allows recovery from transient infrastructure issues without requiring a retryStrategy on templates.
DisableAgentPodCreationboolDisableAgentPodCreation disables the creation of agent pods for HTTP and Plugin templates. This is useful when external agents are responsible for executing these templates and the controller should not create agent pods. Note: when this is set to true, HTTP templates will not be reconciled and the controller will not attempt to create agent pods for them.
InitlessPodInitlessPodConfigInitlessPod configures an opt-in pod layout that omits the argoexec init container. The argoexec binary is delivered to the main container via a Kubernetes image volume (KEP-4639 — Beta in K8s 1.33 behind a feature gate, GA in 1.36), and a new supervisor container replaces wait, taking on pre-main responsibilities (template write, script staging, input artifact download, readiness signaling) in addition to its existing post-main work.

NodeEvents

NodeEvents configures how node events are emitted

Fields

Field NameField TypeDescription
EnabledboolEnabled controls whether node events are emitted
SendAsPodboolSendAsPod emits events as if from the Pod instead of the Workflow with annotations linking the event to the Workflow

WorkflowEvents

WorkflowEvents configures how workflow events are emitted

Fields

Field NameField TypeDescription
EnabledboolEnabled controls whether workflow events are emitted

KubeConfig

KubeConfig is used for wait & init sidecar containers to communicate with a k8s apiserver by an out-of-cluster method; it is used when the workflow controller is in a different cluster from the workflow workloads

Fields

Field NameField TypeDescription
SecretNamestringSecretName of the kubeconfig secret may not be empty if kuebConfig specified
SecretKeystringSecretKey of the kubeconfig in the secret may not be empty if kubeConfig specified
VolumeNamestringVolumeName of kubeconfig, default to 'kubeconfig'
MountPathstringMountPath of the kubeconfig secret, default to '/kube/config'

MetricsConfig

MetricsConfig defines a config for a metrics server

Fields

Field NameField TypeDescription
EnabledboolEnabled controls metric emission. Default is true, set "enabled: false" to turn off
DisableLegacyboolDisableLegacy turns off legacy metrics. Deprecated: Legacy metrics are now removed, this field is ignored.
MetricsTTLTTL (TTL is a time.Duration wrapper that supports human-readable unmarshalling, since time.Duration forces you to specify in millis and does not support days. See https://stackoverflow.com/questions/48050945/how-to-unmarshal-json-into-durations (underlying type: time.Duration))MetricsTTL sets how often custom metrics are cleared from memory
PathstringPath is the path where metrics are emitted. Must start with a "/". Default is "/metrics"
PortintPort is the port where metrics are emitted. Default is "9090"
IgnoreErrorsboolIgnoreErrors is a flag that instructs prometheus to ignore metric emission errors
SecureboolSecure is a flag that starts the metrics servers using TLS, defaults to true
ModifiersMap<string,MetricModifier>Modifiers configure metrics by name
TemporalityMetricsTemporality (MetricsTemporality defines the temporality of OpenTelemetry metrics (underlying type: string))Temporality of the OpenTelemetry metrics. Enum of Cumulative or Delta, defaulting to Cumulative. No effect on Prometheus metrics, which are always Cumulative.

MetricModifier

MetricModifier are modifiers for an individual named metric to change their behaviour

Fields

Field NameField TypeDescription
DisabledboolDisabled disables the emission of this metric completely
DisabledAttributesArray<string>DisabledAttributes lists labels for this metric to remove those attributes to save on cardinality
HistogramBucketsArray<float64>HistogramBuckets allow configuring of the buckets used in a histogram Has no effect on non-histogram buckets

ResourceRateLimit

Fields

Field NameField TypeDescription
Limitfloat64Limit is the maximum rate at which pods can be created
BurstintBurst allows temporary spikes above the limit

PersistConfig

PersistConfig contains workflow persistence configuration

Fields

Field NameField TypeDescription
PostgreSQLPostgreSQLConfigPostgreSQL configuration for PostgreSQL database, don't use MySQL at the same time
MySQLMySQLConfigMySQL configuration for MySQL database, don't use PostgreSQL at the same time
ConnectionPoolConnectionPoolPooled connection settings for all types of database connections
DBReconnectConfigDBReconnectConfigDBReconnectConfig are configuration options for database retries and reconnections
ConnectionTimeoutSecondsint32ConnectionTimeoutSeconds is the timeout in seconds for establishing a database connection, 5 seconds if not set.
NodeStatusOffloadboolNodeStatusOffload saves node status only to the persistence DB to avoid the 1MB limit in etcd
ArchiveboolArchive completed and Workflows to persistence so you can access them after they're removed from kubernetes
ArchiveLabelSelectormetav1.LabelSelectorArchiveLabelSelector holds LabelSelector to determine which Workflows to archive
ArchiveTTLTTL (TTL is a time.Duration wrapper that supports human-readable unmarshalling, since time.Duration forces you to specify in millis and does not support days. See https://stackoverflow.com/questions/48050945/how-to-unmarshal-json-into-durations (underlying type: time.Duration))ArchiveTTL is the time to live for archived Workflows
ClusterNamestringClusterName is the name of the cluster (or technically controller) for the persistence database
SkipMigrationboolSkipMigration skips database migration even if needed

PostgreSQLConfig

PostgreSQLConfig contains PostgreSQL-specific database configuration

Fields

Field NameField TypeDescription
HoststringHost is the database server hostname
PortintPort is the database server port
DatabasestringDatabase is the name of the database to connect to
TableNamestringTableName is the name of the table to use, must be set
UsernameSecretapiv1.SecretKeySelectorUsernameSecret references a secret containing the database username
PasswordSecretapiv1.SecretKeySelectorPasswordSecret references a secret containing the database password
SSLboolSSL enables SSL connection to the database
SSLModestringSSLMode specifies the SSL mode (disable, require, verify-ca, verify-full)
AzureTokenAzureTokenConfigAzureToken specifies if the password should be fetched as an Azure token
AWSRDSTokenAWSRDSTokenConfigAWSRDSToken specifies if the password should be fetched as an AWS RDS IAM auth token

AzureTokenConfig

Fields

Field NameField TypeDescription
EnabledboolEnabled enables Azure token fetching
ScopestringScope is the scope to request the token for. Defaults to "https://ossrdbms-aad.database.windows.net/.default" if empty.

AWSRDSTokenConfig

Fields

Field NameField TypeDescription
EnabledboolEnabled enables AWS RDS IAM auth token fetching
RegionstringRegion is the AWS region of the RDS instance. Auto-detected if empty.

MySQLConfig

MySQLConfig contains MySQL-specific database configuration

Fields

Field NameField TypeDescription
HoststringHost is the database server hostname
PortintPort is the database server port
DatabasestringDatabase is the name of the database to connect to
TableNamestringTableName is the name of the table to use, must be set
UsernameSecretapiv1.SecretKeySelectorUsernameSecret references a secret containing the database username
PasswordSecretapiv1.SecretKeySelectorPasswordSecret references a secret containing the database password
OptionsMap<string,string>Options contains additional MySQL connection options

ConnectionPool

ConnectionPool contains database connection pool settings

Fields

Field NameField TypeDescription
MaxIdleConnsintMaxIdleConns sets the maximum number of idle connections in the pool
MaxOpenConnsintMaxOpenConns sets the maximum number of open connections to the database
ConnMaxLifetimeTTL (TTL is a time.Duration wrapper that supports human-readable unmarshalling, since time.Duration forces you to specify in millis and does not support days. See https://stackoverflow.com/questions/48050945/how-to-unmarshal-json-into-durations (underlying type: time.Duration))ConnMaxLifetime sets the maximum amount of time a connection may be reused

DBReconnectConfig

DBReconnectConfig contains database reconnect settings

Fields

Field NameField TypeDescription
MaxRetriesintMaxRetries defines how many connection attempts should be made before we give up. Default: 5
BaseDelaySecondsintBaseDelaySeconds delays retries by this amount multiplied by the retryMultiple, capped to maxDelaySeconds. Default: 0 (100ms)
MaxDelaySecondsintMaxDelaySeconds the absolute upper limit to wait before retrying. Default: 30
RetryMultiplefloat64RetryMultiple is the growth factor for baseDelaySeconds. Default: 2.0

PodSpecLogStrategy

PodSpecLogStrategy contains the configuration for logging the pod spec in controller log for debugging purpose

Fields

Field NameField TypeDescription
FailedPodbool-
AllPodsbool-

WorkflowRestrictions

WorkflowRestrictions contains restrictions for workflow execution

Fields

Field NameField TypeDescription
TemplateReferencingTemplateReferencing (TemplateReferencing defines how templates can be referenced in workflows (underlying type: string))TemplateReferencing controls how templates can be referenced

Image

Image contains command and entrypoint configuration for container images

Fields

Field NameField TypeDescription
EntrypointArray<string>Entrypoint overrides the container entrypoint
CmdArray<string>Cmd overrides the container command

RetentionPolicy

RetentionPolicy configures workflow retention by number of workflows.

Fields

Field NameField TypeDescription
CompletedintCompleted is the number of completed Workflows to retain
FailedintFailed is the number of failed Workflows to retain
ErroredintErrored is the number of errored Workflows to retain

SSOConfig

SSOConfig contains single sign-on configuration settings

Fields

Field NameField TypeDescription
IssuerstringIssuer is the OIDC issuer URL
IssuerAliasstringIssuerAlias is an optional alias for the issuer
ClientIDapiv1.SecretKeySelectorClientID references a secret containing the OIDC client ID
ClientSecretapiv1.SecretKeySelectorClientSecret references a secret containing the OIDC client secret
RedirectURLstringRedirectURL is the OIDC redirect URL
RBACRBACConfigRBAC contains role-based access control settings
ScopesArray<string>additional scopes (on top of "openid")
SessionExpirymetav1.DurationSessionExpiry specifies how long user sessions last
CustomGroupClaimNamestringCustomGroupClaimName will override the groups claim name
UserInfoPathstringUserInfoPath specifies the path to user info endpoint
InsecureSkipVerifyboolInsecureSkipVerify skips TLS certificate verification
FilterGroupsRegexArray<string>FilterGroupsRegex filters groups using regular expressions
RootCAstringcustom PEM encoded CA certificate file contents

RBACConfig

RBACConfig contains role-based access control configuration

Fields

Field NameField TypeDescription
EnabledboolEnabled controls whether RBAC is enabled

SyncConfig

SyncConfig contains synchronization configuration for database locks (semaphores and mutexes)

Fields

Field NameField TypeDescription
PostgreSQLPostgreSQLConfigPostgreSQL configuration for PostgreSQL database, don't use MySQL at the same time
MySQLMySQLConfigMySQL configuration for MySQL database, don't use PostgreSQL at the same time
ConnectionPoolConnectionPoolPooled connection settings for all types of database connections
DBReconnectConfigDBReconnectConfigDBReconnectConfig are configuration options for database retries and reconnections
ConnectionTimeoutSecondsint32ConnectionTimeoutSeconds is the timeout in seconds for establishing a database connection, 5 seconds if not set.
EnableAPIboolEnableAPI enables the database synchronization API
ControllerNamestringControllerName sets a unique name for this controller instance
SkipMigrationboolSkipMigration skips database migration if needed
LimitTableNamestringLimitTableName customizes the table name for semaphore limits, if not set, the default value is "sync_limit"
StateTableNamestringStateTableName customizes the table name for current lock state, if not set, the default value is "sync_state"
ControllerTableNamestringControllerTableName customizes the table name for controller heartbeats, if not set, the default value is "sync_controller"
LockTableNamestringLockTableName customizes the table name for lock coordination data, if not set, the default value is "sync_lock"
PollSecondsintPollSeconds specifies how often to check for lock changes, if not set, the default value is 5 seconds
HeartbeatSecondsintHeartbeatSeconds specifies how often to update controller heartbeat, if not set, the default value is 60 seconds
InactiveControllerSecondsintInactiveControllerSeconds specifies when to consider a controller dead, if not set, the default value is 300 seconds
SemaphoreLimitCacheSecondsint64SemaphoreLimitCacheSeconds specifies the duration in seconds before the workflow controller will re-fetch the limit for a semaphore from its associated data source. Defaults to 0 seconds (re-fetch every time the semaphore is checked).

ArtifactDriver

ArtifactDriver is a plugin for an artifact driver

Fields

Field NameField TypeDescription
Namewfv1.ArtifactPluginName (string (name of an artifact plugin))Name is the name of the artifact driver plugin
ImagestringImage is the docker image of the artifact driver
ConnectionTimeoutSecondsint32ConnectionTimeoutSeconds is the timeout for the artifact driver connection, 5 seconds if not set

FailedPodRestartConfig

FailedPodRestartConfig configures automatic restart of pods that fail before entering Running state. This is useful for recovering from transient infrastructure issues like node eviction due to DiskPressure or MemoryPressure without requiring a retryStrategy on every template.

Fields

Field NameField TypeDescription
EnabledboolEnabled enables automatic restart of pods that fail before entering Running state. When enabled, pods that fail due to infrastructure issues (like eviction) without ever running their main container will be automatically recreated. Default is false.
MaxRestartsint32MaxRestarts is the maximum number of automatic restarts per node before giving up. This prevents infinite restart loops. Default is 3.

InitlessPodConfig

InitlessPodConfig configures the init-less pod layout. BETA — off by default and may change in incompatible ways in future minor releases before being promoted to stable. See Config.InitlessPod.

Fields

Field NameField TypeDescription
EnabledboolEnabled selects the init-less pod layout for all workflow pods scheduled by this controller. Default is false (legacy pod layout with argoexec init container).