Skip to main content

Kestra GKE Module — Configuration Guide

Kestra is an open-source data orchestration and scheduling platform (Apache 2.0 licence). It allows you to build, schedule, and monitor ETL/ELT pipelines, batch jobs, and workflow automation through a YAML-based flow definition and a rich plugin ecosystem. This module deploys Kestra on GKE Autopilot in standalone mode (server, worker, and scheduler in a single container) with a PostgreSQL 15 backend and GCS artifact storage.

Kestra GKE is a wrapper module built on top of App GKE. It uses App GKE for all GCP infrastructure provisioning (GKE Autopilot cluster, networking, Cloud SQL Auth Proxy, GCS, secrets, CI/CD) and a Kestra Common sub-module to supply Kestra-specific application configuration, secret generation, and storage bucket definitions.

Note: Variables marked as platform-managed are set and maintained by the platform. You do not normally need to change them.


How This Guide Is Structured

This guide documents variables that are unique to Kestra_GKE or that have Kestra-specific defaults differing from the App_GKE base module. For variables with identical semantics, refer to the App_GKE Configuration Guide.

Key differences from App GKE defaults:

FeatureApp GKE defaultKestra GKE default
container_port80808080
cpu_limit"1000m""2000m"
memory_limit"512Mi""4Gi"
min_instance_count11
max_instance_count11
container_image_source"prebuilt""custom"
enable_cloudsql_volumetruetrue
session_affinity"None""ClientIP"
termination_grace_period_seconds3060
enable_pod_disruption_budgetfalsetrue
enable_redisfalsefalse (fixed)
Health probe pathvaries/health
application_database_name"kestra"
application_database_user"kestra"

Platform-Managed Behaviours

The following behaviours are set automatically and cannot be overridden via user variables.

BehaviourDetail
Admin password auto-generatedA 24-character random KESTRA_BASICAUTH_PASSWORD is generated by Kestra Common and stored in Secret Manager as <resource_prefix>-admin-password. Passed via explicit_secret_values for direct Kubernetes Secret injection, bypassing read-after-write delays.
GCS bucket always provisionedKestra Common provisions a -kestra-storage GCS bucket. Its name is injected automatically as KESTRA_STORAGE_GCS_BUCKET.
PostgreSQL queue and repositoryKESTRA_QUEUE_TYPE=postgres and KESTRA_REPOSITORY_TYPE=postgres are always injected.
Redis is disabledenable_redis = false is hardcoded in main.tf. Kestra standalone mode uses PostgreSQL for queuing.
Cloud SQL TCP sidecarOn GKE, the Cloud SQL Auth Proxy sidecar runs as a standard TCP proxy on 127.0.0.1:5432. Unlike Cloud Run, no socat bridge is needed — the Java JDBC driver connects directly. entrypoint.sh detects GKE and skips the Unix socket bridge.
Service URL pre-computedThe internal Kubernetes DNS URL (http://<service_name>.<namespace>.svc.cluster.local) is passed to Kestra_Common before deployment and injected as a Kestra configuration variable.
Fixed environment variablesMICRONAUT_SERVER_PORT=8080, KESTRA_QUEUE_TYPE=postgres, KESTRA_REPOSITORY_TYPE=postgres, KESTRA_STORAGE_TYPE=gcs, KESTRA_STORAGE_GCS_BUCKET, KESTRA_BASICAUTH_ENABLED=true, KESTRA_BASICAUTH_USERNAME=admin, DATASOURCES_POSTGRES_DRIVERCLASSNAME, ENDPOINTS_ALL_PORT, and two Flyway baseline variables are always injected.
Scripts directoryResolved as abspath("${module.kestra_app.path}/scripts") — points to Kestra Common's bundled scripts directory.
backup_format normalisedLowercased before passing to App GKE (UI may send uppercase "SQL").

§1 · Module Metadata (Group 0)

VariableDefaultDescription
module_description(long description)Platform UI description. Do not modify unless customising.
module_documentation"https://docs.radmodules.dev/docs/modules/Kestra_GKE"External documentation URL.
module_dependency["Services GCP"]Platform modules that must be deployed first.
module_services["GKE Autopilot", "Kubernetes Deployments", "Kubernetes Services", "Kubernetes Jobs", "HPA", "Cloud Build", "Artifact Registry", "Cloud Storage", "GCS Fuse CSI Driver", "Cloud SQL", "Cloud SQL Auth Proxy", "PostgreSQL 15", "VPC Network", "Workload Identity", "Secret Manager", "Cloud IAM", "Service Accounts", "Cloud Logging", "Cloud Monitoring", "Health Checks", "Webhooks", "Filestore (NFS)"]GCP services consumed.
credit_cost150Platform credits consumed on deployment.
require_credit_purchasesfalseEnforces credit balance check before deploy.
enable_purgetruePermits full resource deletion on destroy.
public_accesstrueControls platform catalogue visibility.
deployment_id""Auto-generated suffix. Set explicitly to pin resource names across Terraform runs.
resource_creator_identity"rad-module-creator@tec-rad-ui-2b65.iam.gserviceaccount.com"Service account used by Terraform.

§2 · Project & Identity (Group 1)

VariableDefaultDescription
project_id(required)GCP project ID. Must be 6–30 chars, lowercase letters/numbers/hyphens.
tenant_deployment_id"demo"Short suffix appended to resource names. 1–20 lowercase alphanumeric characters and hyphens.
support_users[]Emails granted IAM access and added to monitoring alert channels.
resource_labels{}Labels applied to all module-managed resources.
region"us-central1"Fallback region when network discovery cannot determine region from VPC subnets.

§3 · Application Identity (Group 2)

VariableDefaultDescription
application_name"kestra"Base name for GKE workloads, Secret Manager secrets, and Artifact Registry. Do not change after initial deployment — changing it forces resource recreation.
application_version"latest"Version tag applied to the container image. Increment to trigger a new build and rollout (e.g. "0.17.0").
display_name"Kestra Data Orchestration"Human-readable name in the platform UI and GKE console.
description"Kestra Data Orchestration - ETL/ELT pipeline and workflow orchestration on GKE Autopilot"Brief description.
deploy_applicationtrueSet false to provision infrastructure without deploying the GKE workload.

§4 · Runtime & Scaling (Group 3)

VariableDefaultOptions / FormatDescription
cpu_limit"2000m"CPU quantityCPU limit per Kestra container. Kestra (Java JVM) benefits from at least 2 vCPUs.
memory_limit"4Gi"Memory quantityMemory limit. Kestra requires a minimum of 2Gi; 4Gi recommended.
container_port8080Integer 1–65535Port Kestra listens on. Must match MICRONAUT_SERVER_PORT.
min_instance_count1Integer ≥ 0Minimum pod replicas. Keep at 1 — Kestra JVM has slow cold start.
max_instance_count1Integer ≥ 1Maximum pod replicas. Kestra standalone runs all components in one pod — set to 1 for predictable state.
timeout_seconds300Integer 0–3600Maximum request timeout.
enable_vertical_pod_autoscalingfalseboolEnables VPA. When enabled, HPA based on CPU/memory is disabled.
enable_image_mirroringtrueboolMirrors the container image into Artifact Registry before deployment.
enable_cloudsql_volumetrueboolInjects Cloud SQL Auth Proxy sidecar. Required for database connectivity.
service_annotations{}map(string)Custom annotations applied to the Kubernetes Service.
service_labels{}map(string)Custom labels applied to the Kubernetes Service.
deployment_timeout1800Integer secondsMax seconds Terraform waits for the Kubernetes Deployment rollout to complete. Increase for large Java images.

§5 · GKE Backend Configuration (Group 5)

VariableDefaultOptions / FormatDescription
gke_cluster_name""Cluster name stringGKE cluster name. Leave empty to auto-discover a Services GCP-managed cluster.
namespace_name""Namespace stringKubernetes namespace. Leave empty to auto-generate from application_name and tenant_deployment_id.
workload_type"Deployment"Deployment, StatefulSetUse "StatefulSet" if Kestra flows are stored locally rather than in GCS.
service_type"LoadBalancer"ClusterIP, LoadBalancer, NodePortKubernetes Service type.
session_affinity"ClientIP"None, ClientIPRoutes requests from the same client IP to the same pod. "ClientIP" is required for the Kestra UI session.
termination_grace_period_seconds60Integer 0–3600Seconds Kubernetes waits after SIGTERM before forcibly terminating. Kestra needs time to finish in-flight executions gracefully.
configure_service_meshfalseboolEnables Istio service mesh injection for the namespace.
enable_network_segmentationfalseboolCreates Kubernetes NetworkPolicy resources to restrict pod-to-pod traffic.
network_tags["nfsserver"]list(string)Network tags applied to GKE nodes for VPC firewall rules.
prereq_gke_subnet_cidr"10.201.0.0/24"CIDR stringCIDR for the inline GKE subnet. Must not overlap other subnets.

§6 · Environment Variables & Secrets (Group 4)

VariableDefaultDescription
environment_variables{}Additional static env vars for Kestra. Use for plugin configs and custom Micronaut properties. Do not set platform-managed vars.
secret_environment_variables{}Map of env var name to Secret Manager secret name. Example: { KESTRA_ENCRYPTION_SECRET = "kestra-enc-key" }.
secret_propagation_delay30Seconds to wait after secret creation. Valid range: 0–300.
secret_rotation_period"2592000s"Rotation notification period. Format: "<N>s".
enable_auto_password_rotationfalseDeploys automated database password rotation via a Kubernetes CronJob.
rotation_propagation_delay_sec90Seconds to wait after rotation before restarting GKE pods.

Do not set in environment_variables: MICRONAUT_SERVER_PORT, KESTRA_QUEUE_TYPE, KESTRA_REPOSITORY_TYPE, KESTRA_STORAGE_TYPE, KESTRA_STORAGE_GCS_BUCKET, KESTRA_BASICAUTH_ENABLED, KESTRA_BASICAUTH_USERNAME, DATASOURCES_POSTGRES_URL, DATASOURCES_POSTGRES_USERNAME, DATASOURCES_POSTGRES_PASSWORD, or KESTRA_BASICAUTH_PASSWORD.


§7 · Access & Networking

Identity-Aware Proxy (Group 19)

VariableDefaultDescription
enable_iapfalseEnables IAP authentication via Kubernetes Gateway. Requires enable_custom_domain or service_type = "LoadBalancer".
iap_authorized_users[]User allowlist. Format: "user:email@example.com".
iap_authorized_groups[]Group allowlist. Format: "group:name@example.com".
iap_oauth_client_id""OAuth 2.0 Client ID. Required when enable_iap = true.
iap_oauth_client_secret""OAuth 2.0 Client Secret. Required when enable_iap = true.

Custom Domain & Static IP (Group 18)

VariableDefaultDescription
enable_custom_domainfalseEnables Kubernetes Gateway API with SSL certificates.
application_domains[]Custom domain names. If enable_custom_domain = true and empty, a nip.io domain is used.
reserve_static_iptrueReserves a global static external IP. Recommended for production.
static_ip_name""Name for the static IP. Auto-generated from resource prefix when empty.
enable_cdnfalseEnables Cloud CDN. Only active when enable_custom_domain or enable_cloud_armor is true.

Cloud Armor (Group 20)

VariableDefaultDescription
enable_cloud_armorfalseAttaches a Cloud Armor security policy to the GKE Ingress backend.
admin_ip_ranges[]CIDR ranges for administrative access.
cloud_armor_policy_name"default-waf-policy"Cloud Armor security policy name.

VPC Service Controls (Group 21)

VariableDefaultDescription
enable_vpc_scfalseEnforces VPC Service Controls perimeters.
vpc_cidr_ranges[]VPC subnet CIDR ranges. Auto-discovered when empty.
vpc_sc_dry_runtrueWhen true, violations are logged but not blocked.
organization_id""GCP Organization ID. Auto-discovered when empty.
enable_audit_loggingfalseEnables detailed Cloud Audit Logs.

§8 · Database Backend (Group 15)

Kestra requires PostgreSQL for both its execution queue and flow repository.

VariableDefaultDescription
database_type"POSTGRES"Cloud SQL database type.
application_database_name"kestra"PostgreSQL database name. Injected as DB_NAME. Do not change after initial deployment.
application_database_user"kestra"PostgreSQL application user. Injected as DB_USER.
db_name"kestra"Also passed to Kestra Common. Should match application_database_name.
db_user"kestra"Also passed to Kestra Common. Should match application_database_user.
database_password_length32Auto-generated password length. Valid range: 16–64.
enable_postgres_extensionsfalseEnables installation of PostgreSQL extensions.
postgres_extensions[]List of PostgreSQL extensions to install.
enable_mysql_pluginsfalseNot applicable for Kestra (PostgreSQL only).
mysql_plugins[]Not applicable for Kestra (PostgreSQL only).
sql_instance_name""Existing Cloud SQL instance name. Auto-discovered when empty.
sql_instance_base_name"app-sql"Base name for the inline Cloud SQL instance.
enable_auto_password_rotationfalseAutomates database password rotation.
rotation_propagation_delay_sec90Seconds to wait after rotation before restarting pods.

§9 · Storage (Groups 12–13)

NFS (Group 12)

VariableDefaultDescription
enable_nfsfalseProvisions a Cloud Filestore NFS instance and mounts it into the GKE pod.
nfs_mount_path"/mnt/nfs"Container path for the NFS volume.
nfs_instance_name""Existing NFS GCE VM name. Auto-discovered when empty.
nfs_instance_base_name"app-nfs"Base name for the inline NFS GCE VM.

Cloud Storage & GCS Fuse (Group 13)

Kestra Common always provisions a -kestra-storage bucket. Additional buckets can be added via storage_buckets.

VariableDefaultDescription
create_cloud_storagetrueControls whether the module provisions the buckets in storage_buckets.
storage_buckets[]Additional GCS buckets to provision.
gcs_volumes[]GCS buckets mounted as filesystem volumes via GCS Fuse CSI Driver.
manage_storage_kms_iamfalseCreates CMEK KMS keys and enables CMEK encryption on storage buckets.
enable_artifact_registry_cmekfalseEnables CMEK encryption on container images in Artifact Registry.

§10 · Backup & Maintenance (Group 16)

VariableDefaultDescription
backup_schedule"0 2 * * *"Cron schedule (UTC) for automated database backups.
backup_retention_days7Days to retain backup files in GCS.
enable_backup_importfalseTriggers a one-time database import job during deployment.
backup_source"gcs"Source: "gcs" or "gdrive".
backup_uri""Full URI for the backup. For GCS: gs://bucket/path/backup.sql. For Drive: file ID.
backup_file"backup.sql"Filename of the backup to import (from the module's backup bucket).
backup_format"sql"Format of the backup file. Normalised to lowercase automatically.

§11 · CI/CD & GitHub Integration (Group 11)

VariableDefaultDescription
enable_cicd_triggerfalseCreates a Cloud Build trigger for automatic builds.
github_repository_url""Full HTTPS URL of the GitHub repository.
github_token""GitHub PAT. Sensitive.
github_app_installation_id""Cloud Build GitHub App installation ID.
cicd_trigger_config{ branch_pattern = "^main$" }Branch filter, included/ignored paths, substitutions.
enable_cloud_deployfalseSwitches to a Cloud Deploy pipeline. Requires enable_cicd_trigger = true.
cloud_deploy_stages[dev, staging, prod(approval)]Ordered promotion stages.
enable_binary_authorizationfalseEnforces Binary Authorization policy on the GKE cluster.
binauthz_evaluation_mode"ALWAYS_ALLOW"ALWAYS_ALLOW, REQUIRE_ATTESTATION, or ALWAYS_DENY.

§12 · Custom SQL (Group 17)

VariableDefaultDescription
enable_custom_sql_scriptsfalseRuns custom SQL scripts from GCS against the application database.
custom_sql_scripts_bucket""GCS bucket name containing SQL scripts.
custom_sql_scripts_path""Path prefix within the GCS bucket. Scripts executed in alphabetical order.
custom_sql_scripts_use_rootfalseExecute scripts as the root database user.

§13 · Workload Automation (Group 10)

The default db-init job is supplied automatically by Kestra Common when initialization_jobs is empty.

VariableDefaultDescription
initialization_jobs[]Kubernetes Jobs to run before the application starts. When non-empty, replaces the default db-init job.
cron_jobs[]Scheduled cluster tasks as Kubernetes CronJobs.
additional_services[]Additional Kubernetes services deployed alongside Kestra (e.g. worker sidecars for distributed mode).

§14 · Reliability Policies (Group 8)

VariableDefaultDescription
enable_pod_disruption_budgettrueCreates a Kubernetes PodDisruptionBudget. Default true for Kestra (ensures in-flight executions are not interrupted).
pdb_min_available"1"Minimum pods available during voluntary disruptions. Integer or percentage.
enable_topology_spreadfalseDistributes pods across GKE node zones. Recommended when min_instance_count > 1.
topology_spread_strictfalseWhen true, uses DoNotSchedule if topology spread cannot be satisfied.

§15 · StatefulSet Configuration (Group 14)

Only relevant when workload_type = "StatefulSet".

VariableDefaultDescription
stateful_pvc_enabledfalseProvisions a PVC per pod. Useful for local plugin storage or temporary execution files.
stateful_pvc_size"10Gi"Storage size for each PVC.
stateful_pvc_mount_path"/app/storage"Container path where the PVC is mounted.
stateful_pvc_storage_class""Kubernetes StorageClass for PVCs. Empty uses cluster default.
stateful_headless_servicefalseCreates a headless Service for direct pod DNS access.
stateful_pod_management_policy"OrderedReady"OrderedReady or Parallel.
stateful_update_strategy"RollingUpdate"RollingUpdate or OnDelete.

§16 · Observability & Health (Group 9)

Kestra's health endpoint is /health. Kestra (Java JVM) has a slow startup — the default startup probe allows up to ~14 minutes (initial_delay=30 + period=20 × failure_threshold=40).

Kestra GKE exposes four probe variables across two parallel paths:

VariableRouted toConfigures
startup_probeKestra Commonconfig.startup_probeApplication container startup probe
liveness_probeKestra Commonconfig.liveness_probeApplication container liveness probe
startup_probe_configApp GKE directlyApp GKE infrastructure startup probe
health_check_configApp GKE directlyApp GKE infrastructure liveness probe
VariableDefaultDescription
startup_probe{ enabled=true, type="HTTP", path="/health", initial_delay_seconds=30, timeout_seconds=5, period_seconds=20, failure_threshold=40 }Application startup probe.
liveness_probe{ enabled=true, type="HTTP", path="/health", initial_delay_seconds=180, timeout_seconds=5, period_seconds=30, failure_threshold=5 }Application liveness probe.
startup_probe_config{ enabled=true, type="HTTP", path="/health", initial_delay_seconds=30, period_seconds=20, failure_threshold=40 }App GKE startup probe.
health_check_config{ enabled=true, type="HTTP", path="/health", initial_delay_seconds=180, period_seconds=30, failure_threshold=5 }App GKE liveness probe.
uptime_check_config{ enabled=false, path="/health" }Cloud Monitoring uptime check. Disabled by default in GKE (unlike CloudRun where it defaults to enabled).
alert_policies[]Custom metric alert policies.

§17 · Resource Quota (Group 7)

VariableDefaultDescription
quota_cpu_requests""Total CPU requests allowed in the namespace.
quota_cpu_limits""Total CPU limits allowed in the namespace.
quota_memory_requests""Total memory requests allowed.
quota_memory_limits""Total memory limits allowed.
quota_max_pods""Maximum pods allowed.
quota_max_services""Maximum Kubernetes Services allowed.
quota_max_pvcs""Maximum PVCs allowed.

§18 · Validation Guards

validation.tf enforces the following cross-variable conditions at plan time:

GuardCondition
Scaling rangemin_instance_count must not exceed max_instance_count.
IAP credentialsWhen enable_iap = true, both iap_oauth_client_id and iap_oauth_client_secret must be provided.

§19 · Outputs

OutputDescriptionSensitive
service_nameKubernetes service name
namespaceKubernetes namespace
service_cluster_ipClusterIP of the Kubernetes service
stage_service_cluster_ipsMap of stage-specific ClusterIPs
service_external_ipExternal LoadBalancer IP (when static IP reserved)
service_urlService URL
database_instance_nameCloud SQL instance name
database_nameApplication database name
database_userApplication database user
database_password_secretSecret Manager secret name for database password
database_hostDatabase host
database_portDatabase port
storage_bucketsCreated GCS buckets
network_nameVPC network name
network_existsWhether the VPC network exists
regionsAvailable regions in the VPC
nfs_server_ipNFS server internal IPyes
nfs_mount_pathNFS mount path in containers
nfs_share_pathNFS share path on server
container_imageContainer image used for the deployment
container_registryArtifact Registry repository name
monitoring_enabledWhether monitoring is configured
monitoring_notification_channelsMonitoring notification channel names
deployment_idUnique deployment identifier
tenant_idTenant identifier
resource_prefixResource naming prefix
project_idGCP project ID
project_numberGCP project number
initialization_jobsCreated initialization job names
cron_jobsCreated cron job names
statefulset_nameStatefulSet name (when workload_type = "StatefulSet")
nfs_setup_jobNFS setup job name
db_import_jobDatabase import job name
deployment_summarySummary of the deployment
cicd_enabledWhether CI/CD pipeline is enabled
github_repository_urlGitHub repository URL for CI/CD
github_repository_ownerGitHub repository owner/organization
github_repository_nameGitHub repository name
artifact_registry_repositoryArtifact Registry repository
cloudbuild_trigger_nameCloud Build trigger name
cloudbuild_trigger_idCloud Build trigger ID
cicd_configurationComplete CI/CD configuration
kubernetes_readytrue when GKE cluster endpoint is available and all workloads deployed. false on the first apply of a new inline cluster (CI/CD must detect and re-run apply).

Configuration Examples

Basic Deployment

project_id           = "my-project-123"
tenant_deployment_id = "demo"

Production Deployment

project_id           = "my-project-123"
tenant_deployment_id = "prod"

application_name = "kestra"
display_name = "Kestra Orchestration"
application_version = "0.17.0"

# Sizing (Kestra needs ≥ 2 vCPU, ≥ 2Gi RAM)
cpu_limit = "4000m"
memory_limit = "8Gi"

# Keep a pod running — slow JVM startup
min_instance_count = 1
max_instance_count = 1

# Database
application_database_name = "kestra"
application_database_user = "kestra"
database_password_length = 32

# GKE-specific reliability
enable_pod_disruption_budget = true
pdb_min_available = "1"
termination_grace_period_seconds = 60

# Security
enable_iap = true
iap_oauth_client_id = "your-client-id.apps.googleusercontent.com"
iap_oauth_client_secret = "your-client-secret"
iap_authorized_users = ["user:alice@example.com"]

# Backup
backup_schedule = "0 2 * * *"
backup_retention_days = 14

# Observability
uptime_check_config = {
enabled = true
path = "/health"
check_interval = "60s"
timeout = "10s"
}

# CI/CD
enable_cicd_trigger = true
github_repository_url = "https://github.com/my-org/kestra-flows"
github_token = "ghp_***"

StatefulSet with PVC

project_id           = "my-project-123"
tenant_deployment_id = "stateful"

workload_type = "StatefulSet"

stateful_pvc_enabled = true
stateful_pvc_size = "20Gi"
stateful_pvc_mount_path = "/app/storage"
stateful_pvc_storage_class = "premium-rwo"

stateful_headless_service = false
stateful_pod_management_policy = "OrderedReady"
stateful_update_strategy = "RollingUpdate"

Configuration Pitfalls & Sensible Defaults

Risk levels: Critical (data loss, full outage, security breach) — High (service unavailable or significant degradation) — Medium (degraded function or increased cost) — Low (minor impact).

VariableSensible DefaultRiskConsequence of Incorrect Value
KESTRA_BASICAUTH_PASSWORD (auto-generated secret)Auto-generated and stored in Secret ManagerCriticalThe only admin access credential. Losing the secret reference or destroying the Secret Manager secret requires a direct database update to reset.
KESTRA_BASICAUTH_ENABLED (injected as "true")"true"CriticalDisabling basic auth via environment_variables exposes the Kestra UI and full REST API without authentication. Only disable behind a trusted authentication proxy.
application_name"kestra"CriticalImmutable after first deploy. Changing it renames all Kubernetes and GCP resources, causing full recreation with data loss.
db_name"kestra"CriticalImmutable after first deploy. Changing it causes Kestra to connect to a new empty database, losing all flow definitions, execution history, and namespace configurations.
KESTRA_QUEUE_TYPE / KESTRA_REPOSITORY_TYPE (both "postgres")"postgres"HighOnly the PostgreSQL backend is provisioned. Overriding either value to an unsupported type causes startup failures.
KESTRA_STORAGE_TYPE (injected as "gcs")"gcs"HighChanging to "local" causes all execution storage to write to ephemeral pod storage, losing all flow artifacts on pod restart or rescheduling.
min_instance_count1 (GKE default)HighKestra must remain running to process scheduled triggers. Setting to 0 causes scheduled flows to miss their trigger windows during cold-start periods. GKE HPA validation blocks min > max.
max_instance_count1 (Kestra Community — single-instance)HighKestra Community Edition uses PostgreSQL-based queue locking. Running multiple replicas causes task double-assignment and execution conflicts. Keep max_instance_count = 1 for the Community Edition.
memory_limit"4Gi"HighKestra's JVM requires substantial heap for loading all flow definitions and execution contexts. Values below 2Gi cause OutOfMemoryErrors and pod crashes under moderate load.
workload_typenull (defaults to Deployment)HighSetting stateful_pvc_enabled = true without an explicit workload_type automatically resolves to StatefulSet. Setting workload_type = "Deployment" with stateful_pvc_enabled = true fails at plan time.
stateful_pvc_enabledfalseMediumFor single-instance Kestra deployments, a PVC provides reliable local storage. However, PVC size is immutable after creation — plan capacity in advance.
quota_memory_requests / quota_memory_limits"" (not enforced)HighMust use binary suffixes ("4Gi", "8192Mi"). Bare integers (e.g. "4") are treated as bytes by Kubernetes and block all pod scheduling in the namespace.
enable_nfstrueMediumWithout NFS, Kestra cannot write local binary outputs for flow tasks. GCS storage handles most artifacts, but some task runners require local mount access.
FLYWAY_DATASOURCES_POSTGRES_BASELINE_ON_MIGRATE (injected as "true")"true"HighRequired for Flyway to baseline against an already-initialized PostgreSQL database. Removing this causes all 52 Kestra migrations to fail on first run.
enable_iapfalseHighEnabling IAP without both iap_oauth_client_id and iap_oauth_client_secret is blocked at plan time by the GKE validation guard.
enable_pod_disruption_budgettrueMediumDisabling PDB allows GKE to evict the Kestra pod during maintenance, which interrupts all running flow executions.
enable_cloudsql_volumetrueHighThe Cloud SQL Auth Proxy sidecar is required for PostgreSQL connectivity in GKE. Disabling it while database_type != "NONE" is blocked by the GKE validation guard.
session_affinity"ClientIP"MediumThe Kestra UI uses persistent connections for real-time execution log streaming. Disabling affinity can cause UI log streams to disconnect when routed to different pods.
termination_grace_period_seconds30MediumKestra needs time to finish in-flight task executions before shutdown. Values below 30 may abort active flow runs mid-execution. Increase to 60 or more for long-running tasks.
enable_topology_spreadfalseLowWithout topology spread and with max_instance_count > 1, all Kestra pods may schedule on the same node. (Note: Community Edition should use max_instance_count = 1.)
organization_id""MediumRequired for VPC-SC. If empty, VPC Service Controls are silently skipped.