Dilyan Stoev
06/08/2026, 6:08 AMjobs:
resources:
requests:
cpu: 200m
memory: 256Mi
limits:
cpu: 400m
memory: 4Gi
kube:
nodeSelector:
airbyte_node_type: worker
namespace: airbyte
the instance type in my worker node group is m7i.2xlarge (8 vCPUs and 32 GiB memory, network up to 12.5 Gigabit)kapa.ai
06/08/2026, 6:08 AMvalues.yaml looks reasonable, but there are a few known issues and nuances with how Airbyte applies resource settings on Kubernetes that can explain why the autoscaler keeps adding nodes.
From the knowledge sources:
1. Global job resources sometimes aren’t respected by job pods
There are multiple open issues where global.jobs.resources (and even global.workloads.resources) are ignored or only partially applied by the workload-launcher / orchestrator, causing pods to request much larger defaults than expected. [jobs.resources broken; resource limits ignored]
In those cases, users see:
◦ Replication pods with hardcoded defaults like cpu=2, memory=2Gi or more, regardless of values.yaml.
◦ Scheduler errors like “Insufficient cpu” and aggressive node scaling. [resource limits ignored]
1. Per-connector / per-connection overrides can trump your global settings
The workload-launcher can pull resource requirements from the database (actor definitions or connection resource_requirements), which override the global jobs / workloads settings—even when useConnectorResourceDefaults: false. [workload resources not applied; orchestrator ignores limits]
If any of your connectors or connections have higher CPU/memory configured in the DB, the resulting pod requests may be much larger than the 200m/256Mi you expect, forcing the autoscaler to add nodes.
2. Millicore parsing bugs / integer-only behavior
There are reports that some resource env vars are only parsed correctly when given as whole numbers (e.g. "1" instead of "500m"), and that invalid parsing causes a fallback to large defaults (e.g. cpu=2). [workload resources not applied; jobs not removed / whole numbers]
So even if your Helm values are correct, the effective CPU request seen by the scheduler might be higher than 200m.
3. Docs vs. behavior
The docs show the pattern you’re using (global.jobs.resources) as the right way to set instance‑wide defaults. [Scaling Airbyte; Configuring connector resources]
But the open issues above indicate that, in some versions, these values don’t reliably propagate to replication pods.
Given this, the autoscaler behavior you’re seeing is likely because the actual pod resource requests are larger than your values.yaml suggests.
To confirm and narrow it down, you can:
1. *Inspect a replication pod’s actual requests/limits*kubectl -n airbyte get pod replication-job-pod -o yaml | grep -A5 "resources:"If you see cpu: "2" or similar instead of 200m, you’re hitting the same issues as in the linked GitHub reports. [resource limits ignored]
2. Check for DB-level overrides
◦ Look for non‑empty resource_requirements on your connections and/or actor definitions as described in the docs and issues. [Configuring connector resources; workload resources not applied]
◦ If they’re set to high values, they will override your global jobs.resources and drive up pod requests.
1. (If applicable) Avoid millicores in some env‑var based settings
Where you’re using env vars (e.g. JOB_MAIN_CONTAINER_CPU_*, REPLICATION_ORCHESTRATOR_CPU_*), prefer whole numbers ("1", "2") instead of "500m" until the parsing bugs are fixed. [workload resources not applied; jobs not removed / whole numbers]
Because the knowledge sources don’t include a definitive fix for your exact version, I can’t point to a specific version upgrade or flag that will fully resolve this. The most reliable next step is to:
• Compare what you configured vs what the pods actually request, and
• Remove or lower any DB‑level resource_requirements that are higher than you intend.
If you can share the resources section from a replication-job-* pod spec, I can help interpret whether it matches these known issues. 👍 0 button 👎 0 button ℹ️ Tip: Mention @kapa.ai in the thread for follow-ups or DM the app for 1-to-1 help.Dilyan Stoev
06/08/2026, 6:18 AMkapa.ai
06/08/2026, 6:18 AMvalues.yaml and instead default to hard‑coded values around cpu=2, memory=1–2Gi. [resource limits ignored; workload resources not applied]
That explains why your autoscaler keeps adding nodes: each replication pod is effectively requesting ~2 vCPU per container, not the 200m you configured.
From the issues:
• Users see exactly what you’re seeing: replication pods with limits={memory=2Gi, cpu=2}, requests={memory=1–2Gi, cpu=1–2} regardless of global.jobs.resources or global.workloads.resources. [resource limits ignored]
• Engineering has confirmed this is a bug in how the workload-launcher resolves and applies resources; Helm values and even env vars like JOB_MAIN_CONTAINER_* / REPLICATION_ORCHESTRATOR_* are ignored or overridden. [resource limits ignored; orchestrator ignores limits; REPLICATION_ORCHESTRATOR_* do not work]
Known workarounds from the knowledge sources:
1. Set env vars directly on workload-launcher
Example from the issue (adjust values as needed): [resource limits ignored]workloadLauncher:
extraEnv:
- name: JOB_MAIN_CONTAINER_CPU_LIMIT
value: "0.4"
- name: JOB_MAIN_CONTAINER_CPU_REQUEST
value: "0.2"
- name: JOB_MAIN_CONTAINER_MEMORY_LIMIT
value: "4Gi"
- name: JOB_MAIN_CONTAINER_MEMORY_REQUEST
value: "256Mi"Then restart the workload-launcher and verify inside the pod:kubectl exec -n airbyte deploy/airbyte-workload-launcher -- env | grep JOB_MAIN
2. Connection‑level resource_requirements in the DB
This reliably controls source/destination containers (not the orchestrator) and has worked for others when global settings were ignored: [workload resources not applied; orchestrator ignores limits]UPDATE connection
SET resource_requirements = jsonb_build_object(
'cpu_request', '0.2',
'cpu_limit', '0.4',
'memory_request','256Mi',
'memory_limit', '4Gi'
)
WHERE id = 'your-connection-id';
3. Kubernetes mutating webhook
Some users implemented a mutating admission webhook (or Kyverno policy) that patches the orchestrator container resources on every replication pod to the desired values (e.g. 4Gi instead of 1Gi). [orchestrator ignores limits]
Given the knowledge sources, there is no documented way today to make global.jobs.resources alone reliably control these replication pods in the affected versions. To reduce autoscaler churn right now, you’ll need to use one of the workarounds above (env vars on workload-launcher, DB resource_requirements, or a mutating webhook) to bring the actual pod requests down to what your nodes can comfortably run. 👍 0 button 👎 0 button ℹ️ Tip: Mention @kapa.ai in the thread for follow-ups or DM the app for 1-to-1 help.Dilyan Stoev
06/08/2026, 7:42 AMrror: UPGRADE FAILED: server-side apply failed for object airbyte/airbyte-workload-launcher apps/v1, Kind=Deployment: failed to create typed patch object (airbyte/airbyte-workload-launcher; apps/v1, Kind=Deployment): errors:
.spec.template.spec.containers[name="airbyte-workload-launcher-container"].env: duplicate entries for key [name="JOB_MAIN_CONTAINER_CPU_LIMIT"]
.spec.template.spec.containers[name="airbyte-workload-launcher-container"].env: duplicate entries for key [name="JOB_MAIN_CONTAINER_CPU_REQUEST"]
.spec.template.spec.containers[name="airbyte-workload-launcher-container"].env: duplicate entries for key [name="JOB_MAIN_CONTAINER_MEMORY_LIMIT"]
.spec.template.spec.containers[name="airbyte-workload-launcher-container"].env: duplicate entries for key [name="JOB_MAIN_CONTAINER_MEMORY_REQUEST"]
after I have added these valueskapa.ai
06/08/2026, 7:42 AMJOB_MAIN_CONTAINER_* is already being set somewhere (likely via the chart’s existing templates or a ConfigMap), and adding them again under workloadLauncher.extraEnv creates duplicates:
...containers[name="airbyte-workload-launcher-container"].env:
duplicate entries for key [name="JOB_MAIN_CONTAINER_CPU_LIMIT"]
...
Because the knowledge sources don’t include the exact v2 chart snippet for workload-launcher envs, I can’t point to the precise line, but the pattern is the same as the AB_JWT_SIGNATURE_SECRET duplication that broke upgrades until it was fixed. [duplicate AB_JWT var]
Given that, you have two options that avoid the duplicate‑key error:
1. *Do not set JOB_MAIN_CONTAINER_* via extraEnv if the chart already sets them*Instead, configure them through the chart’s supported values so they are rendered only once. For chart v2, the docs map these env vars to Helm values: [chart v2 env mapping]global:
workloads:
resources:
mainContainer:
cpu:
request: "0.2"
limit: "0.4"
memory:
request: 256Mi
limit: 4GiThis sets the equivalents of:without adding a second copy via extraEnv.
◦ JOB_MAIN_CONTAINER_CPU_REQUEST
◦ JOB_MAIN_CONTAINER_CPU_LIMIT
◦ JOB_MAIN_CONTAINER_MEMORY_REQUEST
◦ JOB_MAIN_CONTAINER_MEMORY_LIMIT
1. *If you must use extraEnv, remove or override the existing definitions*Since server‑side apply rejects duplicate keys, you’d need to ensure the base chart does not emit those env vars. The knowledge sources don’t document a supported flag to disable them, so I can’t give a concrete value to turn them off. In similar issues, users either:
◦ Patched the chart templates in a parent chart to avoid generating the duplicate env entries, or
◦ Waited for a chart release that removed the duplicate. [duplicate AB_JWT var; duplicate ConfigMap keys]
Because of that, the safest path based on the docs is:
• Remove the JOB_MAIN_CONTAINER_* entries you added under workloadLauncher.extraEnv.
• Set the corresponding global.workloads.resources.mainContainer.* values instead (as above).
• Re‑deploy and then check the airbyte-workload-launcher pod’s env to confirm the values:kubectl -n airbyte exec deploy/airbyte-workload-launcher -- env | grep JOB_MAIN_CONTAINER
If you share the workloadLauncher section of your values.yaml, I can help you rewrite it so it doesn’t conflict with the chart’s existing env definitions. 👍 0 button 👎 0 button ℹ️ Tip: Mention @kapa.ai in the thread for follow-ups or DM the app for 1-to-1 help.kapa.ai
06/08/2026, 7:43 AMSTATSD_HOST, AB_JWT_SIGNATURE_SECRET) that were fixed by removing duplicate definitions in the chart or overriding templates. [duplicate env key; duplicate AB_JWT_SIGNATURE_SECRET; duplicate ConfigMap keys v2]
In your case, the duplicates are for:
• JOB_MAIN_CONTAINER_CPU_LIMIT
• JOB_MAIN_CONTAINER_CPU_REQUEST
• JOB_MAIN_CONTAINER_MEMORY_LIMIT
• JOB_MAIN_CONTAINER_MEMORY_REQUEST
Given the knowledge sources, the most likely cause is:
• These env vars are already being set by the chart (e.g. from a ConfigMap or default extraEnv), and
• You added them again under workloadLauncher.extraEnv, so the rendered Deployment now has two entries with the same name for each.
The knowledge sources don’t show the exact v2 chart template for workload-launcher, so I can’t point to the specific line, but the pattern is the same as the other duplicate‑env issues: the fix is to ensure each env var is defined only once. [duplicate env key; duplicate ConfigMap keys v2]
To move forward, based on what is documented:
1. Remove the direct extraEnv entries for those four vars and re‑run helm upgrade to confirm it succeeds.
2. If you still need to override them:
◦ Check how they are currently injected (likely via a ConfigMap like airbyte-env or airbyte-abctl-airbyte-env in abctl setups). [resource limits ignored; Helm v2 env mapping]
◦ Prefer using the Helm v2 equivalents instead of raw env vars where possible. For example, the docs map:
▪︎ JOB_MAIN_CONTAINER_CPU_REQUEST → global.workloads.resources.mainContainer.cpu.request
▪︎ JOB_MAIN_CONTAINER_CPU_LIMIT → global.workloads.resources.mainContainer.cpu.limit
▪︎ JOB_MAIN_CONTAINER_MEMORY_REQUEST → global.workloads.resources.mainContainer.memory.request
▪︎ JOB_MAIN_CONTAINER_MEMORY_LIMIT → global.workloads.resources.mainContainer.memory.limit [env → v2 mapping]
◦ This avoids redefining the same env vars in extraEnv and prevents duplicates.
Because the knowledge sources don’t include your exact chart version or full rendered manifest, I can’t give a precise one‑line patch, but the key is: don’t set those four env vars twice. Use either the chart’s built‑in values (the global.workloads.resources.mainContainer.* keys) or a single extraEnv definition path, not both. 👍 0 button 👎 0 button ℹ️ Tip: Mention @kapa.ai in the thread for follow-ups or DM the app for 1-to-1 help.Dilyan Stoev
06/08/2026, 9:41 AMubectl exec -n airbyte deploy/airbyte-workload-launcher -- env | grep JOB_MAIN
DISCOVER_JOB_MAIN_CONTAINER_CPU_REQUEST=
CHECK_JOB_MAIN_CONTAINER_MEMORY_REQUEST=
JOB_MAIN_CONTAINER_MEMORY_REQUEST=256Mi
DISCOVER_JOB_MAIN_CONTAINER_MEMORY_LIMIT=
CHECK_JOB_MAIN_CONTAINER_MEMORY_LIMIT=
JOB_MAIN_CONTAINER_CPU_LIMIT=0.4
DISCOVER_JOB_MAIN_CONTAINER_CPU_LIMIT=
CHECK_JOB_MAIN_CONTAINER_CPU_REQUEST=
JOB_MAIN_CONTAINER_MEMORY_LIMIT=4Gi
DISCOVER_JOB_MAIN_CONTAINER_MEMORY_REQUEST=
CHECK_JOB_MAIN_CONTAINER_CPU_LIMIT=
JOB_MAIN_CONTAINER_CPU_REQUEST=0.2kapa.ai
06/08/2026, 9:41 AMJOB_MAIN_* values) matches known bugs in how Airbyte 2.x applies resources, not a misconfiguration on your side.
Key points from the sources:
1. *`JOB_MAIN_*` env vars are set correctly, but replication pods still use ~2 CPU*
Your workload-launcher env shows:JOB_MAIN_CONTAINER_CPU_REQUEST=0.2
JOB_MAIN_CONTAINER_CPU_LIMIT=0.4
JOB_MAIN_CONTAINER_MEMORY_REQUEST=256Mi
JOB_MAIN_CONTAINER_MEMORY_LIMIT=4GiYet the replication pods are still created withlimits cpu: "2", memory: 2Gi
requests: cpu: "1" or "2", memory: 1–2GiThis is exactly what’s reported in multiple issues: the workload-launcher ignores Helm/env resource settings and falls back to internal defaults (2 CPU / 1–2Gi) for replication jobs. [resource limits ignored; workload resources not applied; orchestrator ignores limits]With 4 replication jobs each requesting ~2 vCPU per container, the cluster autoscaler is behaving as expected by adding nodes.
2. *This is acknowledged as a platform bug, not just Helm config*So even though your JOB_MAIN_* env vars are present, the current workload-launcher logic is not reliably using them for replication jobs.
◦ In 73346, engineering confirms a “genuine bug in how resource configurations are propagated to replication pods”; Helm values and even airbyte-env ConfigMap changes don’t affect the final pod resources. [resource limits ignored]
◦ In 68162 and 72833, users see the same pattern: REPLICATION_ORCHESTRATOR_* / workloads.resources.* / jobs.resources are set, but replication/orchestrator containers still run with hardcoded CPU/memory. [workload resources not applied; orchestrator ignores limits]
1. *Workarounds others are using (none are perfect, but they’re the only documented options)*Based on the issues, the only ways people have successfully reduced replication pod resources are:*a. Connection‑level resource_requirements in the DB*
This does affect source/destination containers and has been confirmed to override the defaults when global settings are ignored. [workload resources not applied; orchestrator ignores limits]Example (adjust to your target 0.2/0.4 CPU, 256Mi/4Gi):UPDATE connection
SET resource_requirements = jsonb_build_object(
'cpu_request', '0.2',
'cpu_limit', '0.4',
'memory_request','256Mi',
'memory_limit', '4Gi'
)
WHERE id = 'your-connection-id';This won’t fix the orchestrator container, but it will at least shrink the source/destination containers so each job uses less total CPU, which should reduce autoscaler pressure.b. Mutating admission webhook / Kyverno policy
Several users implemented a Kubernetes mutating webhook (or Kyverno policy) that patches replication job pods on creation, forcing the orchestrator (and/or other containers) to the desired resources. [orchestrator ignores limits]This is external to Airbyte but has been reported to work reliably until the upstream bug is fixed.c. Avoid millicores in some env vars
There are reports that some CPU env vars only parse correctly as integers ("1", "2") and that millicores like "500m" cause a fallback to defaults. [workload resources not applied]
You’re already using decimals (0.2, 0.4), which might be parsed correctly, but the issues suggest parsing is fragile. If you experiment, use whole numbers (e.g. 0.25 → "0.25" or "1") and then re‑inspect the pod spec. However, the existing reports show that even correctly set env vars are sometimes ignored, so this may not be sufficient.
◦ They match pods with label: airbyte=job-pod.
◦ Find the orchestrator container.
◦ Apply a JSONPatch to set resources.requests/limits to e.g. cpu: "0.4", memory: "4Gi".
Given the knowledge sources, there is no documented configuration change that will make your current version honor JOB_MAIN_* / global.jobs.resources for replication pods in a fully reliable way. The behavior you’re seeing (4 jobs → 4 nodes) is a direct consequence of those bugs.
To reduce node churn with the information available:
1. Keep your JOB_MAIN_* env vars as you have them (they’re correct).
2. For each heavy connection, set connection.resource_requirements in the DB to low CPU/memory so at least source/destination containers don’t request 1–2 CPU each. [workload resources not applied]
3. If orchestrator memory/CPU is still too high and drives autoscaling, consider a mutating webhook / Kyverno policy to patch replication pods on creation, as other users have done. [orchestrator ignores limits]
I’m limited to what’s in these sources, so I can’t point to a specific Airbyte/Helm version where this is fully fixed. If you open or comment on the linked GitHub issues with your findings (env vars set but pods still at 2 CPU), that will also help the engineering team prioritize a proper fix. 👍 0 button 👎 0 button ℹ️ Tip: Mention @kapa.ai in the thread for follow-ups or DM the app for 1-to-1 help.Dilyan Stoev
06/08/2026, 9:51 AMWarning FailedScheduling 9m8s default-scheduler 0/1 nodes are available: 1 node(s) didn't match Pod's node affinity/selector. no new claims to deallocate, preemption: 0/1 nodes are available: 1 Preemption is not helpful for scheduling.
Warning FailedScheduling 8m44s default-scheduler 0/2 nodes are available: 1 node(s) didn't match Pod's node affinity/selector, 1 node(s) had untolerated taint(s). no new claims to deallocate, preemption: 0/2 nodes are available: 2 Preemption is not helpful for scheduling.
Warning FailedScheduling 8m43s (x2 over 8m44s) default-scheduler 0/2 nodes are available: 1 node(s) didn't match Pod's node affinity/selector, 1 node(s) had untolerated taint(s). no new claims to deallocate, preemption: 0/2 nodes are available: 2 Preemption is not helpful for scheduling.
Warning FailedScheduling 8m43s (x2 over 8m43s) default-scheduler 0/3 nodes are available: 1 node(s) didn't match Pod's node affinity/selector, 2 node(s) had untolerated taint(s). no new claims to deallocate, preemption: 0/3 nodes are available: 3 Preemption is not helpful for scheduling.
Warning FailedScheduling 8m38s (x2 over 8m43s) default-scheduler 0/4 nodes are available: 1 node(s) didn't match Pod's node affinity/selector, 3 node(s) had untolerated taint(s). no new claims to deallocate, preemption: 0/4 nodes are available: 4 Preemption is not helpful for scheduling.
Warning FailedScheduling 8m33s (x2 over 8m33s) default-scheduler 0/5 nodes are available: 1 node(s) didn't match Pod's node affinity/selector, 4 node(s) had untolerated taint(s). no new claims to deallocate, preemption: 0/5 nodes are available: 5 Preemption is not helpful for scheduling.
Warning FailedScheduling 8m30s default-scheduler 0/5 nodes are available: 1 node(s) didn't match Pod's node affinity/selector, 2 Insufficient cpu, 2 node(s) had untolerated taint(s). no new claims to deallocate, preemption: 0/5 nodes are available: 2 No preemption victims found for incoming pod, 3 Preemption is not helpful for scheduling.
as seen initially had untolerated taint(s). no new claims to deallocate, preemption: 0/5 nodes are available: 5 Preemption is not helpful for scheduling but then I see 2 Insufficient cpu, 2 node(s) had untolerated taint(s).
here's the full events:
Warning FailedScheduling 9m8s default-scheduler 0/1 nodes are available: 1 node(s) didn't match Pod's node affinity/selector. no new claims to deallocate, preemption: 0/1 nodes are available: 1 Preemption is not helpful for scheduling.
Warning FailedScheduling 8m44s default-scheduler 0/2 nodes are available: 1 node(s) didn't match Pod's node affinity/selector, 1 node(s) had untolerated taint(s). no new claims to deallocate, preemption: 0/2 nodes are available: 2 Preemption is not helpful for scheduling.
Warning FailedScheduling 8m43s (x2 over 8m44s) default-scheduler 0/2 nodes are available: 1 node(s) didn't match Pod's node affinity/selector, 1 node(s) had untolerated taint(s). no new claims to deallocate, preemption: 0/2 nodes are available: 2 Preemption is not helpful for scheduling.
Warning FailedScheduling 8m43s (x2 over 8m43s) default-scheduler 0/3 nodes are available: 1 node(s) didn't match Pod's node affinity/selector, 2 node(s) had untolerated taint(s). no new claims to deallocate, preemption: 0/3 nodes are available: 3 Preemption is not helpful for scheduling.
Warning FailedScheduling 8m38s (x2 over 8m43s) default-scheduler 0/4 nodes are available: 1 node(s) didn't match Pod's node affinity/selector, 3 node(s) had untolerated taint(s). no new claims to deallocate, preemption: 0/4 nodes are available: 4 Preemption is not helpful for scheduling.
Warning FailedScheduling 8m33s (x2 over 8m33s) default-scheduler 0/5 nodes are available: 1 node(s) didn't match Pod's node affinity/selector, 4 node(s) had untolerated taint(s). no new claims to deallocate, preemption: 0/5 nodes are available: 5 Preemption is not helpful for scheduling.
Warning FailedScheduling 8m30s default-scheduler 0/5 nodes are available: 1 node(s) didn't match Pod's node affinity/selector, 2 Insufficient cpu, 2 node(s) had untolerated taint(s). no new claims to deallocate, preemption: 0/5 nodes are available: 2 No preemption victims found for incoming pod, 3 Preemption is not helpful for scheduling.
Warning FailedScheduling 8m30s default-scheduler 0/5 nodes are available: 1 node(s) didn't match Pod's node affinity/selector, 1 node(s) had untolerated taint(s), 3 Insufficient cpu. no new claims to deallocate, preemption: 0/5 nodes are available: 2 Preemption is not helpful for scheduling, 3 No preemption victims found for incoming pod.
Warning FailedScheduling 8m28s default-scheduler 0/5 nodes are available: 1 node(s) didn't match Pod's node affinity/selector, 1 node(s) had untolerated taint(s), 3 Insufficient cpu. no new claims to deallocate, preemption: 0/5 nodes are available: 2 Preemption is not helpful for scheduling, 3 No preemption victims found for incoming pod.
Normal Scheduled 8m20s default-scheduler Successfully assigned airbyte/replication-job-83-attempt-0 to ip-10-188-3-128.ec2.internal
I'm a bit confusedkapa.ai
06/08/2026, 9:52 AM1 node(s) didn't match Pod's node affinity/selector
◦ node(s) had untolerated taint(s)
◦ Your replication pod has a nodeSelector (or node affinity) that only matches a subset of nodes.
◦ Some of the nodes the autoscaler is adding have taints that the pod does not tolerate, so the scheduler can’t place the pod there.
This pattern (pods not honoring or not having the right tolerations) is similar to what’s discussed in the forum thread about JOB_KUBE_TOLERATIONS and taints/tolerations. [JOB_KUBE_TOLERATIONS]
1. CPU insufficiency appears once more nodes exist
Later events add:At that point, among the nodes that do match the selector and taints, some don’t have enough free CPU for the pod’s (still high) requests (e.g. cpu: "1" or "2" per container, as you saw earlier). This “insufficient cpu” pattern is exactly what’s reported in several issues where replication pods request more CPU than expected and remain Pending. [resource limits ignored; insufficient cpu example]
◦ 2 Insufficient cpu
◦ 3 Insufficient cpu
So the sequence is:
• Initially: only 1 node; it doesn’t match the pod’s nodeSelector → didn't match Pod's node affinity/selector.
• Autoscaler adds nodes, but they’re tainted in a way the pod doesn’t tolerate → had untolerated taint(s).
• As more nodes come up, some match selector/taints but don’t have enough CPU for the (large) pod requests → Insufficient cpu.
• Eventually, one node both matches selector/taints and has enough CPU, so the pod is scheduled: Successfully assigned ....
The knowledge sources don’t give enough detail to say exactly how your nodeSelector/taints are configured or how to change your autoscaler/node groups, but they do show:
• Taints/tolerations must be aligned between your nodes and Airbyte job pods; otherwise you’ll see “untolerated taint(s)” and Pending pods. [JOB_KUBE_TOLERATIONS]
• High default CPU requests for replication pods can easily lead to “Insufficient cpu” and aggressive node scaling. [resource limits ignored; S3 datalake insufficient resources]
In other words, the logs are consistent:
• First, the pod can’t run anywhere because of selector/taints.
• Then, even where it can run, some nodes don’t have enough CPU for its (too large) requests. 👍 0 button 👎 0 button ℹ️ Tip: Mention @kapa.ai in the thread for follow-ups or DM the app for 1-to-1 help.Dilyan Stoev
06/08/2026, 9:56 AMkapa.ai
06/08/2026, 9:57 AMDeletionCandidateOfClusterAutoscaler=...:PreferNoSchedule taint itself, but I can summarize what is clear and how it relates to your situation.
1. That taint is from the cluster autoscaler, not Airbyte
The sources show Airbyte interacting with autoscalers (e.g. GKE autoscaler evicting Temporal / workload‑api‑server pods), but they don’t document this specific taint or how Airbyte should treat it. [MySQL CDC + autoscaler]
So I can’t say from the docs whether Airbyte jobs are expected to tolerate DeletionCandidateOfClusterAutoscaler.
2. Your scheduling events still make sense with this taint present
The events you shared show:From the knowledge sources:The docs don’t say whether Airbyte sets any toleration for autoscaler taints by default, so I have to assume it does not tolerate DeletionCandidateOfClusterAutoscaler=...:PreferNoSchedule unless you add a matching toleration via jobs.kube.tolerations / JOB_KUBE_TOLERATIONS.
◦ node(s) didn't match Pod's node affinity/selector
◦ node(s) had untolerated taint(s)
◦ later: Insufficient cpu
◦ Airbyte job pods use nodeSelector / tolerations derived from jobs.kube.nodeSelector and JOB_KUBE_TOLERATIONS / related env vars. [Helm jobs.kube.*; JOB_KUBE_TOLERATIONS usage]
◦ If a node has a taint that the pod doesn’t tolerate, you get exactly the “had untolerated taint(s)” message. [JOB_KUBE_TOLERATIONS]
1. *What is clearly documented you can control from Airbyte’s side*From the chart snippets and forum posts: [Helm jobs.kube.*; JOB_KUBE_TOLERATIONS example; JOB_KUBE_TOLERATIONS forum]jobs:
kube:
nodeSelector:
airbyte_node_type: workerjobs:
kube:
tolerations:
- key: taint-key
operator: Equal
value: taint-value
effect: PreferNoScheduleworker:
extraEnv:
- name: JOB_KUBE_TOLERATIONS
value: "key=taint-key,operator=Equal,value=taint-value,effect=PreferNoSchedule"The docs don’t explicitly mention autoscaler taints, but this is the only documented way to make Airbyte job pods tolerate a taint. [JOB_KUBE_TOLERATIONS; Helm jobs.kube.tolerations]
◦ You can set node selectors for all jobs:
◦ You can set tolerations for job pods:
◦ Or via env var on worker / workload‑launcher:
Because the knowledge sources don’t cover that specific autoscaler taint in detail, I can’t definitively say whether you should tolerate it or adjust your autoscaler instead. What they do show is:
• Airbyte job pods will not schedule on tainted nodes unless you configure matching tolerations via jobs.kube.tolerations / JOB_KUBE_TOLERATIONS. [JOB_KUBE_TOLERATIONS; Helm jobs.kube.tolerations]
• If you see “untolerated taint(s)” in events, adding an appropriate toleration is the documented way to let those pods run there.
If you want, you can share the jobs.kube section of your current values.yaml, and I can suggest how to add a toleration there using only the patterns shown in the docs. 👍 0 button 👎 0 button ℹ️ Tip: Mention @kapa.ai in the thread for follow-ups or DM the app for 1-to-1 help.Dilyan Stoev
06/08/2026, 11:32 AMk describe pod replication-job-87-attempt-0 | grep -i requests: -A2
Requests:
cpu: 2
memory: 2Gi
--
Requests:
cpu: 2
memory: 2Gi
--
Requests:
cpu: 1
memory: 1Gi
--
Requests:
cpu: 1
memory: 1Gi
how are these determined? Where how are they configured? I guess due to this values new nodes are schedulled ?kapa.ai
06/08/2026, 11:32 AMcpu: 1–2 per container, the scheduler/autoscaler will often add new nodes. The knowledge sources show how these numbers are supposed to be determined, and also that there are bugs in 2.x where they don’t always follow your values.yaml.
1. Where these requests are intended to come from For sync (replication) jobs, Airbyte can derive container resources from several layers, with this precedence (highest wins) [Configuring connector resources]:
1. Connection-specific: connection.resource_requirements in the DB
2. Connector-specific: per-connector config in the UI (if present)
3. Connector definition: actor_definition.resource_requirements in the DB
4. Instance-wide defaults:
◦ Old style: global.jobs.resources.* → JOB_MAIN_CONTAINER_* env vars
◦ New chart v2 style: global.workloads.resources.* (e.g. replication, mainContainer) [jobs.resources broken; Configuring connector resources]
So in a healthy setup, the replication pod’s source/destination/orchestrator containers should get their `requests`/`limits` from:
• Connection resource_requirements (if set), otherwise
• Connector definition resource_requirements, otherwise
• The instance-wide defaults (JOB_MAIN_CONTAINER_* / workloads.resources.*).
2. What’s actually happening in 2.x (matches your numbers) Multiple users on 2.0.x report exactly what you’re seeing:
• Replication pods with:
◦ limits={memory=2Gi, cpu=2}
◦ requests={memory=1–2Gi, cpu=1–2}
• This happens even when:
◦ global.jobs.resources or global.workloads.resources are set to much smaller values, and
◦ JOB_MAIN_CONTAINER_* / REPLICATION_ORCHESTRATOR_* env vars are correctly present in the workload-launcher pod. [resource limits ignored; workload resources not applied; orchestrator ignores limits]
Examples from the issues:
• Workload-launcher log:
resources: ResourceRequirements(claims=[], limits={memory=2Gi, cpu=2}, requests={memory=1Gi, cpu=1}, ...) [resource limits ignored]
• Pod spec:
limits={memory=2Gi, cpu=2}, requests={memory=2Gi, cpu=2} despite lower values in values.yaml and env vars. [workload resources not applied]
Engineering has confirmed this is a bug in the workload-launcher / resource resolution, not just Helm config: the launcher is using internal defaults (around 2 CPU / 1–2Gi) instead of the configured values. [resource limits ignored; orchestrator ignores limits]
So in your case:
• Those Requests: cpu: 2 / 1, memory: 2Gi / 1Gi are coming from Airbyte’s internal defaults in the current 2.x code path, not from your global.jobs.resources or JOB_MAIN_* values.
• Yes, those high requests are exactly why the scheduler/autoscaler keeps adding nodes.
3. What you can actually control today (workarounds) Based on the sources, the only reliable knobs that do affect replication job resources in 2.0.x are:
1. Connection-level resource_requirements in the DB
This has been confirmed to override the defaults for source/destination containers when global settings are ignored [workload resources not applied; orchestrator ignores limits]:UPDATE connection
SET resource_requirements = jsonb_build_object(
'cpu_request', '0.2',
'cpu_limit', '0.4',
'memory_request','256Mi',
'memory_limit', '4Gi'
)
WHERE id = 'your-connection-id';That will shrink the source/destination containers for that connection, reducing total CPU per job.
2. Mutating webhook / Kyverno policy
Several users implemented a Kubernetes mutating webhook that patches replication job pods on creation, forcing the orchestrator (and/or all containers) to desired resources (e.g. 0.4 CPU, 4Gi). [orchestrator ignores limits]
3. *Instance-wide env vars (JOB_MAIN_*)*
You already set these, and the envs are visible in workload-launcher, but the issues show they are not consistently honored for replication pods in 2.0.1. [resource limits ignored]
So they’re intended to determine the defaults, but in your version they are effectively overridden by the bug.
So to answer your questions directly:
• How are these cpu: 2 / 1, memory: 2Gi / 1Gi requests determined?
In your version, they are coming from hardcoded / internal defaults in the workload-launcher / platform, not from your values.yaml, even though they should. This matches multiple open GitHub issues.
• Where/how are they configured?
They should be configured via:
◦ connection.resource_requirements (DB),
◦ actor_definition.resource_requirements (DB),
◦ and instance-wide global.jobs.resources / global.workloads.resources → JOB_MAIN_CONTAINER_* env vars. [Configuring connector resources]
But due to the bug, only the DB-level resource_requirements and external patching (mutating webhook) are reliably effective right now.
• Are these values why new nodes are scheduled?
Yes. With each replication pod requesting ~2 vCPU for some containers, the scheduler often can’t fit multiple jobs on a single node, so the cluster autoscaler keeps adding nodes. This is the same “Insufficient cpu” behavior reported in the linked issues. [resource limits ignored]
If you want to reduce node churn immediately, the most effective levers (per the knowledge sources) are:
• Set resource_requirements per connection in the DB to low CPU/memory.
• Optionally add a mutating webhook / Kyverno policy to cap orchestrator resources. 👍 0 button 👎 0 button ℹ️ Tip: Mention @kapa.ai in the thread for follow-ups or DM the app for 1-to-1 help.