Astro Private Cloud 2.1This feature was introduced in Astro Private Cloud 2.1. To access this feature, upgrade your Astro Private Cloud installation to 2.1 or later.
PreviewAdoption is in Preview because APC does not yet manage everything the Astro Runtime Operator can express. An adopted Deployment keeps some of its settings under the operator rather than under APC, and operator mode itself is still missing some Helm-mode features. See What adoption changes for the ownership split, and Feature support for what operator mode does not cover yet.
- Stage 1: you run Airflow with the Astro Runtime Operator on your own Kubernetes cluster. Each Airflow Deployment is defined by one Airflow custom resource, and the operator turns that resource into the running Kubernetes workloads.
- Stage 2: you register that cluster as an APC data plane and adopt its Airflow Deployments. APC takes ownership of a defined set of settings, and the operator continues to own the rest.
- The operator’s Custom Resource Definition (CRD) is installed once on the cluster. It only defines the shape of an Airflow resource; it doesn’t hold any Deployment’s configuration.
- Each of your Airflow Deployments is one Airflow custom resource, created against that definition. It holds that Deployment’s configuration.
- The operator watches those custom resources and builds the real Kubernetes objects from them: schedulers, workers, services, and the rest.
What adoption changes
When APC adopts an Airflow Deployment, it takes ownership of a specific set of fields and leaves everything else to you and the operator. In this release, nothing outside the “APC takes over” column is modified, either at adoption or on any later update. Ownership is split rather than transferred wholesale because your custom resource can express things APC has no equivalent for: more than one worker queue, KEDA autoscaling, per-component pod templates, sidecars. APC claims only the fields it needs in order to manage the Deployment, which is what image it runs, which executor, the web component it puts authentication in front of, and the labels its monitoring and log shipping key on. If it claimed the rest, every update would have to overwrite your configuration with APC’s narrower model. Leaving those fields alone is what makes adoption non-destructive. The trade-off is that they stay managed where they are today, through the operator, rather than through APC. This is where the line falls today, not a permanent boundary. APC does not yet cover everything the Astro Runtime Operator can express, and the set of settings it manages is expected to widen in future releases. Operator mode has its own gaps against Helm mode, listed in Feature support. Check this page against the version of APC you are running rather than assuming the split is fixed.
Two more things before you start:
- Component resources are brought into your platform’s supported range. If a component in your custom resource requests less than your platform’s minimum or more than its maximum, APC adjusts it to the nearest supported value at adoption. See Configure component size limits.
- Adoption is not a migration of history. Existing task logs stay wherever they are today. If you switch task logging to APC, only logs written after the switch are readable from the Airflow UI; older ones remain in your own store but the Airflow UI no longer resolves them.
Prerequisites
- Airflow Deployments running under the Astro Runtime Operator, on a cluster where operator support is enabled. See Airflow Operator mode.
- The operator’s cluster registered as an APC data plane. See Install a data plane cluster and Register a data plane cluster.
- Operator support and adoption enabled on your platform. See Enable adoption on your platform.
- Permission to adopt. Two permissions are involved:
workspace.deployments.adoptto adopt a Deployment into a Workspace, andsystem.deployments.adoptto browse adoption candidates, which is separate because listing candidates scans a whole cluster. Among the built-in roles, Workspace Admin carries the first and System Admin the second. Cluster Admin does not carry either, because it governs cluster configuration rather than Deployments. If your platform uses custom roles, both permissions can be granted to one. See Manage permissions and the role and permission reference. - No existing APC Deployment using the custom resource’s name, or the namespace it runs in. Adoption is rejected if either is already taken.
- The custom resource references its image by tag, not by digest. See the warning under What adoption changes.
- To use the Astro CLI instead of the UI, APC 2.1.0 or later and a matching Astro CLI. See Install the Astro CLI.
Enable adoption on your platform
Adoption builds on operator support, so both have to be on. Operator support is a prerequisite and is configured separately, including its webhook TLS certificate. Follow Enable operator support first if it isn’t on yet. Adoption is then controlled by one additional value, which is already on by default:global.airflowOperator.adoption.enabled is already true, but it does nothing on its own. Adoption is enabled only when both values are true, so on a default install you enable adoption by turning on operator support. Leave the adoption value alone unless you specifically want operator support without adoption, in which case set it to false.Don’t install a second operator
Your cluster already runs the Astro Runtime Operator, so tell the platform chart not to install its own alongside it:Confirm it’s enabled
Sign in to the control plane as a System Admin and look for System > Adoption Candidates (Preview). If the section is there, adoption is enabled. If it’s missing, or an adopt call reports that operator adoption is disabled, one of the two values is stillfalse on the control plane.
Step 1: Decide how to handle logging, images, and metrics
Adoption asks you to make two choices, logging and images. Both are set when you adopt and are not intended to be changed afterwards, so decide before you start. Metrics need no decision: they are always on.Task logging
Choose whether APC becomes the destination for your task logs.- Route logs to APC. APC configures Airflow to write task logs to APC’s configured log store, and the Airflow UI reads them back from there. This overrides your Deployment’s existing remote logging. If your tasks currently log to Amazon S3, Google Cloud Storage, or your own Elasticsearch, they log to APC instead from then on. Logs written before the switch stay where they are, and the Airflow UI no longer resolves them.
- Keep your own logging. APC changes nothing about logging. Your tasks keep logging where they do prior to adoption, not in APC’s configured log store.
Image registry
Two separate settings decide where your Deployment’s image comes from. Don’t confuse them. Your platform’s registry is configured once, for every Deployment on the platform, adopted or not. By default that’s APC’s built-in registry. To use your own instead, configure a custom image registry before you adopt: see Use a custom image registry and Registry backend. APC synchronizes that registry’s credential into every Deployment namespace, including adopted ones. The adoption choice is narrower. It decides whether APC manages this Deployment’s image reference and pull credential:- Use APC’s registry (
--use-apc-registry). APC takes over the Deployment’s image and provisions the pull credential its pods need. You don’t have to move the image yourself first: adoption leaves the Deployment on the image it already runs, and the switch to your platform’s registry happens on your firstastro deploy, which moves the image and the pull credential together. Deploy code withastro deployor a CI/CD pipeline as normal. See Deploy code overview and CI/CD. - Keep your own (the default). APC leaves the Deployment’s image and pull Secret exactly as they are and never manages them. Use this when something outside APC builds and pushes the image.
Deploy code when you keep your own image
You can still ship new code through APC. Build and push the image to your own registry, then point the Deployment at it:--runtime-version is required with --remote. Your platform administrator must have set deployments.enableUpdateDeploymentImageEndpoint: true, which the custom image registry setup already covers.
The adoption choice is fixed at adoption. To change it later, release the Deployment and adopt it again with the setting you want.
If APC detects that your custom resource already points at this cluster’s own log store or image registry, for example because the Deployment was previously managed by a different control plane, it takes ownership of that wiring regardless of what you choose here. Leaving it half-owned would break the Deployment.
Metrics
Metrics are always enabled and have no option. APC labels the Deployment’s metrics exporters so its monitoring stack collects them, which is additive and changes nothing about how your Airflow runs. If you collect metrics with your own Prometheus, keep doing so. APC’s collection does not interfere. See Deployment metrics and Configure metrics.Settings APC can’t fully represent
Some custom resource settings have no exact equivalent in APC. Examples include an environment variable set to different values on different components, and more than one worker group. By default, adoption proceeds and records these as partially represented, leaving the underlying setting in place and working. You can instead require a clean match, in which case adoption fails and reports what didn’t fit rather than adopting. Use that mode when you want to review the differences first.Step 2: Review adoption candidates
An adoption candidate is an operator-managed Airflow custom resource on a registered data plane that no APC Deployment claims yet.- Astro UI
- APC API
- In the control plane, go to System > Adoption Candidates (Preview).
- Select the data plane cluster from the dropdown. Candidates appear only after you pick a cluster.
- Review the candidates. Each shows the custom resource’s name, its Kubernetes namespace, and the Astro Runtime and Airflow versions read from the resource.

Step 3: Adopt the Deployment
Adopting is a single operation, available from all three surfaces. Pick one.- Astro UI
- APC API
- Astro CLI
- Go to System > Adoption Candidates (Preview).
- Select the data plane cluster from the dropdown. The candidates on that cluster then appear. Until you pick one, the page prompts you to select a cluster and shows no candidates.
- Select Adopt on the candidate you want. The adoption drawer opens, showing the custom resource and the namespace and cluster it runs on.
- Choose the Workspace to adopt the Deployment into. This is the only required field.
- Optionally set a Label and Description. The label defaults to the custom resource name when left blank.
- Set the options you decided on in Step 1:
- Route logs to APC (Elasticsearch / Vector)
- Use APC’s image registry
- Adopt even if some settings can’t be mapped to APC, which is selected by default. Clear it to require a clean match.
- Select Adopt Deployment.

What happens when you adopt
Each Airflow Deployment has one custom resource, and you adopt them one at a time. Whichever surface you use, APC then:- Reads the live Airflow custom resource from the cluster and maps it onto an APC Deployment.
- Creates the Deployment in your Workspace and grants you Deployment Admin on it.
- Applies its managed configuration to the running custom resource. The Deployment’s pods restart once during this step.
Step 4: Give the Deployment’s users APC accounts
Every person who uses this Airflow needs their own APC account. After adoption, APC’s authentication guards the Airflow UI, and an APC account is the only way in. People reach Airflow through the token APC mints for their APC role, not through the Airflow account they signed in with before. This step exists because the Deployment is adopted rather than created. A Deployment you create in APC starts with no users and gains them as you invite people. An adopted Deployment arrives with a user population that has been signing in all along, so there is an existing set of Airflow users to reproduce one-for-one in APC. Anyone you don’t reproduce loses access at cutover. Where that roster comes from depends on how the Airflow you adopted authenticated people. APC asks the running Airflow which auth manager it uses:- Flask-AppBuilder (FAB), which is the Airflow 2 default. Airflow keeps its own user table, so APC reads it and offers you the roster. Follow the rest of this step.
- Airflow 3. APC sets Airflow 3’s auth manager to its own at adoption, and there is no FAB user table behind it, so there is no roster to read. APC tells you this explicitly rather than showing an empty list. Invite the users to APC instead, and skip the rest of this step.
Import users from Airflow 2
- Astro UI
- APC API
- Open the adopted Deployment and go to the Import Users tab. It appears only on adopted Deployments.
- Review the discovered users. For each, APC suggests a Workspace role and a Deployment role based on the user’s Airflow role.
- Adjust the roles and clear the checkbox next to anyone you don’t want to import.
- If your platform uses an identity provider, select Skip invite email. Those users sign in through your IdP, so they never need to set a password.
- Select Import selected users.

How roles are mapped
How Airflow roles are suggested, and what the imported roles mean in Airflow:
Every imported user gets Workspace membership as well, because a Deployment role requires it. Users who already have access in this Workspace are marked as already imported and are skipped.
The Airflow role APC found is only used to suggest a role. Importing someone carries none of their old Airflow permissions across, so what they can do in Airflow afterwards comes entirely from the APC Deployment role you give them. Check the suggestions rather than accepting them wholesale, particularly for anyone who held a custom Airflow role.
Discovery reads Airflow’s own FAB user table. If the Deployment doesn’t have one, which is the case on an adopted Airflow 3, discovery returns an error saying no FAB user table was found rather than an empty list. That is expected, not a failed adoption. Invite those users to APC instead.
Imported users are created as pending invitations with no password. They set their own password by completing the invitation, or sign in directly if your platform uses an identity provider. If your platform can’t send email, the import result returns each user’s invitation token so you can deliver it yourself. See Integrate an auth system and Import IdP groups.
Step 5: Verify the adoption
- The Deployment appears in your Workspace and reports healthy.
- Your Airflow is still serving, and its Dags and history are intact.
- Sign in to the Airflow UI as an imported user and confirm the expected role.
- Change something in APC and confirm it reaches the running Airflow. Adding an environment variable is the simplest check. See Environment variables.
- If you routed logs to APC, run a task and confirm its logs appear in the Airflow UI.
- Confirm the Deployment’s metrics are populating. See Deployment metrics.
Manage an adopted Deployment
An adopted Deployment behaves like any other APC Deployment for everything APC owns:- Deploy code: Deploy code overview, Deploy Dags, CI/CD. If the Deployment kept its own image, deploy with
--remote --image-nameinstead: see Deploy code when you keep your own image. - Environment variables: Environment variables. Variables that were set per-component in your custom resource are shown read-only, because APC applies variables to all components uniformly. Variables that reference your own Secrets or ConfigMaps are not shown and keep working untouched.
- Executor: Kubernetes executor. APC applies the change and the operator adjusts the supporting components.
- Resources: Scale Deployment resources, Configure component size limits. Webserver or API server sizing is set through APC; scheduler, worker, and triggerer sizing stays with your custom resource. Worker settings in particular are not applicable, see Worker queues and autoscaling.
- Runtime upgrades: Migrate to Airflow 3.
- Secrets backends: Secrets backend. Unchanged by adoption; these are ordinary environment variables to APC.
Worker queues and autoscaling
APC models a single worker queue per Deployment and does not use KEDA autoscaling for operator-based Deployments. Many operator-managed Deployments use more than one worker queue, KEDA autoscaling, or both. Adoption handles this by leaving the worker section alone entirely. APC never writes it on an adopted Deployment, so:- Your worker queues keep running unchanged, including every queue beyond the first. APC does not collapse them into one, rename them, or add a queue of its own.
- Your KEDA autoscaling keeps running unchanged. APC does not disable it, even though APC’s own operator-based Deployments don’t use it.
- Extra worker queues are recorded as partially represented at adoption. APC’s own view of the Deployment shows the first queue; the others are stored but not surfaced as editable.
Data plane failover
Adopted Deployments are not covered by data plane failover. APC’s failover recreates the Deployments it created on a target cluster; it has no path for a Deployment whose definition lives in a custom resource on the original cluster, so adopted Deployments are not brought up on the failover target. See Data plane failover and Enable data plane failover for how failover works for Deployments APC created.Keep your own pipeline and APC from fighting
After adoption, two things write to the same Airflow custom resource: APC, and whatever you use to manage the resource yourself, such as a GitOps controller, a Helm chart, orkubectl in a CI job. If you still patch or upgrade the Deployment through your own pipeline, read this section. If you manage the Deployment only through APC after adoption, you can skip it.
APC writes only the fields listed in What adoption changes. It writes them with Kubernetes server-side apply, under the field manager houston, and it force-claims them, so a Deployment update always wins over whatever wrote those fields last.
What happens when you upgrade the resource yourself depends entirely on how your tooling writes it:
The middle path is the one to watch: your upgrade succeeds, Airflow keeps running, and nothing reports a problem, but the Deployment is now missing the configuration APC applied, including the authentication on its web component. Only a Deployment update puts it back.
Use server-side apply, and remove APC-owned fields from your manifest
Both halves are necessary. Doing only the first makes things worse, not better.-
Apply with server-side apply so your write only touches the fields your manifest actually declares:
In Argo CD, set
ServerSideApply=true. Flux’s kustomize-controller already uses server-side apply. -
Delete the APC-owned fields from the manifest you apply. Your manifest is usually the custom resource as it looked before adoption, so it still declares fields APC now owns, such as
spec.image,spec.runtimeVersion,spec.executor, and the wholespec.webserverorspec.apiserverblock.
Trigger a Deployment update after any full-object write
Client-sidekubectl apply, kubectl replace, and deleting and recreating the custom resource all write the whole object, so they wipe APC’s fields in one pass. Your Airflow keeps running, but it now runs without the configuration APC applied, including the authentication on its web component.
Every field APC owns is restored by the next Deployment update, because APC re-applies its full set of managed fields each time and force-claims them. After any write of that kind, and after any pipeline upgrade or patch that you’re not certain was field-scoped, trigger a Deployment update. This is the Deployment-level re-sync, not an APC platform upgrade. Nothing needs to change for it to do its job, so a no-op update is enough:
- Astro UI
- APC API
Open the Deployment’s settings and save without changing anything.
Never let your pipeline prune APC’s Secrets
Check which fields APC owns
To see exactly what APC claims on a Deployment, read the custom resource’s field ownership and look for thehouston manager:
--show-managed-fields is required. Without it, kubectl hides the ownership information from -o yaml and -o json output.
Pause management with cordon
Cordoning a Deployment stops APC applying changes to it while it keeps running. It is not specific to adopted Deployments, so it has its own page: see Cordon a Deployment.Release a Deployment
Releasing, also called unadopting, returns a Deployment to operator-only management.- Astro UI
- APC API
- Astro CLI
In the Deployments list, open the Deployment’s actions menu, select Unadopt Deployment, and confirm. Adopted Deployments carry an Adopted badge in the Adopted column.

What happens when you release
APC deletes its own record of the Deployment, along with its deploy history and the Deployment-scoped roles it granted. Workspace membership is left in place. Nothing is removed from your cluster. The Airflow custom resource, its namespace, its metadata database, and its data are all left as they are, the operator continues to reconcile it, and Airflow keeps running. You can adopt the same Deployment again later. Releasing is not the same as deleting. Deleting a Deployment removes the underlying Airflow and its database; releasing removes only APC’s record of it.Known limitations
- The cluster must already be an APC data plane. You cannot adopt Deployments from a cluster the control plane doesn’t know about. Register it first. See Register a data plane cluster.
- Airflow web authentication takeover is one-way. Once APC applies its authentication to an adopted Deployment, there is no supported path back to your original configuration while the Deployment remains adopted.
- Releasing a Deployment interrupts Airflow web access until you restore its original web authentication configuration. See Release a Deployment.
- A platform upgrade can restart adopted Deployments. Cordon any adopted Deployment you don’t want APC to act on during an upgrade, and uncordon it afterwards.
- Worker settings in APC don’t reach an adopted Deployment. Worker count, worker resources, and autoscaling are accepted and stored but never applied, and changing the executor discards the Deployment’s worker queues and KEDA configuration. See Worker queues and autoscaling.
- Data plane failover does not cover adopted Deployments, and nothing blocks you from initiating failover on a data plane that has them. Plan their recovery separately. See Data plane failover.
- Images pinned by digest are converted to tag references at adoption. The digest pin is not preserved, and the substituted tag may not exist. Re-tag before adopting. See the warning under What adoption changes.
- Plain
astro deploybreaks a Deployment that kept its own image. It pushes to APC’s built-in registry and repoints the Deployment there, but no pull credential was provisioned for it. Use--remote --image-name. See Deploy code when you keep your own image. - The registry and logging choices are fixed at adoption. Changing either means releasing the Deployment and adopting it again.
- Users can’t be imported from an adopted Airflow 3 Deployment. APC takes over its auth manager at adoption, so there are no Airflow-local users to read. Invite them to APC instead.
- Existing task logs are not migrated when you route logging to APC. Only logs written after the switch are readable from the Airflow UI; older logs stay in your own store and the Airflow UI no longer resolves them.
- Deleted APC Secrets can’t be restored by a Deployment update. If
<cr-name>-registry,<cr-name>-elasticsearch, or<cr-name>-envis deleted or pruned, reissuing it requires Astronomer support. See Never let your pipeline prune APC’s Secrets. - Clusters using the authentication sidecar don’t get an ingress for adopted Deployments, so the Airflow UI link is not reachable from APC on those clusters.
Reference
Adoption fields on a Deployment
API operations
See Use the APC API and Example APC API queries for authenticating and running these operations.
Related documentation
- Install a data plane cluster
- Register a data plane cluster
- Airflow Operator mode
- Move the operator under APC
- Data plane architecture
- Data plane failover
- Configure a Deployment
- Cordon and uncordon a Deployment
- Environment variables
- Deploy code overview
- Configure logging
- Deployment metrics
- Manage permissions
- Manage platform users
- Invite users to a Workspace or Deployment