Repository navigation
[infra] retire the parked general node group, add a default-off cluster-autoscaler for the serving general group, and give the general-pool controllers PodDisruptionBudgets - #632
Merged
the-gigi-pplx merged 1 commit intoOct 20, 2026
Conversation
the-gigi-pplx
force-pushed
the
gigi/pla-6740-port-general-retirement-cluster-autoscaler-module
branch
6 times, most recently
from
October 19, 2026 21:17
9ecc570 to
d71c3ed
Compare
the-gigi-pplx
marked this pull request as ready for review
October 19, 2026 21:52
the-gigi-pplx
force-pushed
the
gigi/pla-6740-port-general-retirement-cluster-autoscaler-module
branch
from
October 20, 2026 00:07
d71c3ed to
95dc7ce
Compare
the-gigi-pplx
force-pushed
the
gigi/pla-6740-port-general-retirement-cluster-autoscaler-module
branch
12 times, most recently
from
October 20, 2026 03:34
796637c to
487079b
Compare
nikhilgupta-pplx
approved these changes
Oct 20, 2026
nikhilgupta-pplx
left a comment
Member
There was a problem hiding this comment.
Looks good. Retirement preserves the launch template and role used by general-2, and the guard checks both desired capacity and remaining instances. Autoscaler discovery and write permissions stay scoped to the serving general group, without taking Terraform ownership of its sizing.
Rollout notes, not blockers: the PDBs and the external-secrets webhook/cert-controller move onto general apply even with the autoscaler off, so watch scheduling headroom and webhook readiness on the first apply. Before enabling scale-down, check root-owned kube-system workloads for budgets and drain tolerance.
…er-autoscaler for the serving general group, and give the general-pool controllers PodDisruptionBudgets
the-gigi-pplx
force-pushed
the
gigi/pla-6740-port-general-retirement-cluster-autoscaler-module
branch
from
October 20, 2026 18:03
487079b to
0a329ff
Compare
the-gigi-pplx
deleted the
gigi/pla-6740-port-general-retirement-cluster-autoscaler-module
branch
October 20, 2026 18:41
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Prepares the EKS modules for cluster-autoscaler on the general pool. Three changes, all off by default except the budgets:
generalmanaged node group oncegeneral-2serves, keeping the launch template and node rolegeneral-2runs on.generalget PodDisruptionBudgets, so the autoscaler can't evict them freely once scale-down is turned on.What changed
eks-clusternode_poolsgainslaunch_template_and_role_only(defaultfalse). When set, the pool keeps its launch template, node IAM role and policy attachments and gets no node group, so a node group declared outside the module can run on them.external_node_group_hosts_addonslets such an outside group count as capacity for the deployment-backed addons check.managed_node_groupsexposes each EKS-managed-AMI group's ARN, ASG names and scaling config, without depending on custom-AMI pools.controllers/cluster_autoscaler.tf(new)aws_autoscaling_group_tagthat marks that ASG with a per-cluster key,space.pplx.net/cluster-autoscaler/<cluster>.cluster-autoscalerHelm release, pinned per Kubernetes minor, that discovers only ASGs with that key.k8s.io/cluster-autoscaler/*pair: EKS stamps that pair on every managed ASG, and the worker pools carry Firecracker sandboxes the autoscaler can't drain safely.GOMEMLIMITat 90%.max_graceful_termination_seccaps an evicted pod's grace period during a scale-down drain; whole seconds from 1 to 86400.new_pod_scale_up_delaymakes cluster-autoscaler ignore Pending pods younger than the delay when it decides on a scale-up; written like90sor2m.controllers/disruption_budgets.tf(new),controllers/main.tf, and the new chartcharts/pod-disruption-budget.maxUnavailable: 1. None isminAvailable: 1over one replica, which would allow no disruption and pin the node from scale-down.charts/pod-disruption-budget, which setsunhealthyPodEvictionPolicy: AlwaysAllow. Their own charts render none. These are external-dns, the external-secrets controller and cert-controller, and cluster-autoscaler.maxUnavailablebut a positive whole number or a percentage up to 100%, and its content checksum goes into the release values so a template edit plans.unhealthyPodEvictionPolicy: AlwaysAllow. The external-secrets webhook's chart can't render that field, so its budget still refuses evictions while both replicas are unready.general; before, only the controller was.controllersinputdisruption_budget_chart_pathnames that chart; thespacemodule passes<charts_dir>/pod-disruption-budget.controllersnow declares its provider version constraints (aws >= 6.40.0,helm >= 2.17.0).spacegeneral_node_group_retired,cluster_autoscaler_enabled,cluster_autoscaler_memory_mib,cluster_autoscaler_scale_down_enabled,cluster_autoscaler_max_graceful_termination_secandcluster_autoscaler_new_pod_scale_up_delay; the last two default to null.general_serving_node_groupmoves the discovery tag, so the autoscaler retargets in the same apply.generalis parked: its ASG wants no instances and none are left. The ASG is found through thegeneralnode group itself. This also stops a cutover and a retirement from landing in one apply.general, because its deployment-backed addons wait only on node groups insidemodule.eks.nodes_ready, the autoscaler wiring, the serving-floor precondition andgeneral_serving_min_sizeall still resolve aftergeneralis retired.The module interface is otherwise unchanged: the
ci_*names,moved_ci_access.tfandadditional_external_secretsall stay as they are.Effect on existing clusters
The node groups and the autoscaler are untouched unless a cluster sets the new inputs. The budgets apply everywhere:
general, and the cert-controller rolls ontogeneral;Dependencies
Test plan
terraform fmt -check -recursive infra/space/aws/eks/modulesterraform init -backend=false && terraform validateoncontrollers,eks-cluster,spaceandeks-cluster/examples/minimaltflinton the three modules: no findings.terraform testofcontrollers, kept out of the tree per the repository's test policy for infrastructure-only changes: 11 runs passed.--nodesbounds;GOMEMLIMITfollowingmemory_mib;scale_down_enabledrendersfalse.kube-system, pinned to the chart versions those renders came from;minAvailableor allows zero unavailable;terraform testofspaceplans eight scenarios:generalretired with the autoscaler on;general's ASG has a desired capacity of 2, refused at 0 while an instance remains, and allowed once none do;generalserving without retirement;controllers:max_graceful_termination_sec = 120andnew_pod_scale_up_delay = "90s", chart 9.59.0 renders exactly two more args:--max-graceful-termination-sec=120and--new-pod-scale-up-delay=90s.0,1.5,86401,"1h"and"90", and accept86400and"2m".helm templateof the pinned upstream charts with these values:--node-group-auto-discovery=asg:tag=space.pplx.net/cluster-autoscaler/<cluster>.general.unhealthyPodEvictionPolicy: AlwaysAllow.helm lintoncharts/pod-disruption-budget. The chart refuses an emptymatchLabelsand anymaxUnavailablethat isn't a positive whole number or a percentage from 1% to 100% written without a leading zero (0,00,010,+1,0%,101%,0.5among them), and accepts1,10,1%,25%and100%.