Skip to main content
Experimental: GPU/KAI-related fields in this resource are subject to breaking changes. When using them, set spec.experimental.gpuKaiContract: v1alpha1-2026-07.
AutomationStrategy defines how resizing is allowed to happen within a namespace. Use it when a team owns its own namespace and should manage resize behavior locally. For the cluster-scoped variant, see Cluster Automation Strategies. Automation strategies control:
  • which CPU, memory, and ephemeral-storage changes are allowed
  • whether in-place resize is permitted
  • whether eviction fallback is permitted
  • which safety checks run before actions are executed

Scope Mapping

  • ProactivePolicy and StaticPolicy reference a namespaced AutomationStrategy in the same namespace.
  • ClusterProactivePolicy and ClusterStaticPolicy reference a ClusterAutomationStrategy; those cluster-scoped relationships are documented in Cluster Automation Strategies.

Field Reference

This page covers the configurable spec fields for namespaced AutomationStrategy. The cluster-scoped ClusterAutomationStrategy uses the same spec structure and defaults, but is documented separately in Cluster Automation Strategies. Usage-level floor and ceiling values apply to all containers by default. Add containers.<name> under the same requests or limits block when a multi-container pod needs different bounds for specific containers.

VPA Filter Behavior

Two complementary VPA filters help avoid conflicts between Kubex automation and Vertical Pod Autoscalers:

enableVpaFilter (default: true)

Filters actions when a VPA is actively managing the resource. This requires all of:
  • VPA updateMode is not Off (i.e., Auto, Recreate, or Initial)
  • VPA has an active recommendation with status RecommendationProvided=True
  • The resource dimension (e.g., cpu.requests) appears in the VPA’s containerRecommendations
Use case: Prevent conflicts when VPA is actively recommending and applying changes. This is the default safe behavior that defers to VPA when it’s doing work.

blockResizeOnVpaControlledResources (default: false)

Filters actions for resources declared in a VPA resourcePolicy, regardless of whether the VPA is active. This check is only evaluated when enableVpaFilter=true. It checks only:
  • The resource is listed in resourcePolicy.containerPolicies[].controlledResources
  • The usage type (requests/limits) matches controlledValues (defaults to both)
Does not check:
  • VPA updateMode (blocks even when Off)
  • Recommendation status (blocks even when no recommendations exist)
  • Whether VPA is actively applying changes
Use case: Reserve resources for future VPA management, or ensure strict non-interference when VPA ownership is declared but the VPA may be temporarily disabled or not yet providing recommendations.

Comparison

Note: blockResizeOnVpaControlledResources is ignored unless enableVpaFilter=true is enabled.

Scheduling Windows

spec.scheduling lets you control when the controller is allowed to execute resize actions.
  • inclusionWindows define allowed times. If multiple inclusion windows are defined, they are evaluated with OR logic (automation is allowed if it matches ANY inclusion window). Inclusion windows may overlap.
  • exclusionWindows define blocked times and always override inclusion windows.
  • If neither list is set, scheduling does not restrict automation.
  • If any inclusion window is defined, automation is allowed only while the current time matches at least one inclusion window.
  • start is inclusive and end is exclusive.
  • If start or end are omitted, they default to 00:00 and 24:00 respectively, allowing for easy “all day” configuration.
  • Windows are evaluated in the window’s local IANA timezone specified in the timezone field.
  • Overnight windows are supported. For example, 22:00 to 02:00 spans midnight.
  • weekdays accepts full and short names such as Monday, Mon, Thursday, or Thu.
Validation notes:
  • timezone must be a valid IANA timezone such as UTC, Europe/London, or America/New_York.
  • start and end must use 24-hour HH:MM format. 24:00 is supported for exclusive end times.
  • start and end cannot be the same value, unless they are both omitted.
When a proactive resize is blocked by scheduling, the controller keeps the recommendation pending and retries when a future allowed window opens.

KAI vLLM tuning

When spec.kai.vllm is set, Kubex configures vLLM’s --gpu-memory-utilization setting for KAI-managed workloads. Set gpuMemoryUtilizationBufferPercent to leave a safety buffer below the workload’s GPU allocation. For example, a value of 10 leaves 10% unused by vLLM. The setting works whether or not HAMi-core is enabled. Kubex updates the setting for vLLM containers when it applies a KAI GPU allocation. It updates an existing setting or adds it when needed. Example:

Helm Mapping

Scheduling is part of the AutomationStrategy and ClusterAutomationStrategy CRD surface, but the current chart does not map policy.policies.<name>.scheduling into generated ClusterAutomationStrategy resources. For Helm-based installs, that means:
  • Use policy.policies for the Helm-managed subset of strategy settings.
  • Manage AutomationStrategy or ClusterAutomationStrategy manifests directly when you need scheduling windows.
  • Point Helm-managed policy scopes at that externally managed strategy by name when needed.

Ephemeral Storage

spec.enablement.ephemeralStorage uses the same fields as spec.enablement.memory, plus restartStrategy. Unlike memory, every storage change is off by default. Set upsize, downsize, or setFromUnspecified to true for the changes you want. Example that allows storage changes with a floor, keeps limits from shrinking, and sets a per-container ceiling:
By default, storage changes are applied the next time the pod is recreated (for example a rollout, scale-up, or node drain). Set restartStrategy: Evict to let Kubex restart the pod to apply them. See Proactive Policies for how to turn them on, how they are applied, and how to turn them off. Storage changes smaller than spec.safetyChecks.minEphemeralStorageChangePercent (default 10) are ignored. It is set separately from minMemoryChangePercent, so storage can use a higher threshold than memory.

Guaranteed QoS Behavior

When spec.safetyChecks.retainGuaranteedQOS is enabled:
  • The behavior applies only to pods that are currently in the Kubernetes Guaranteed QoS class.
  • For CPU and memory, desired limits are treated as the source of truth.
  • Request values are automatically set to match limit values so requests == limits remains true.
  • If a limit action exists but no request action exists, the controller can add a matching request action to preserve Guaranteed QoS.
When this toggle is disabled (default), requests and limits are handled independently by recommendation and enablement logic, and a pod can move away from Guaranteed QoS. Note: A pod is in the Guaranteed QoS class only when ALL containers have requests == limits for BOTH CPU and memory. If a container has CPU request=limit but memory request≠limit, the pod is Burstable, not Guaranteed, and this behavior does not activate.

Example: Namespaced Strategy