Vertical Pod Autoscaling
This feature is available in the Standard Plan and above. For more information, see our pricing plans or contact our sales team.
This guide walks through how to enable Provider Vertical Pod Autoscaling (VPA) for your Upbound Crossplane (UXP) Providers. Provider Autoscaling uses the Kubernetes Vertical Pod Autoscaler to ensure stable and efficient operation by dynamically sizing CPU and memory for provider pods running in a Kubernetes cluster.
Enable this feature if you observe provider pod resources (CPU and memory) hitting large performance spikes or maxing out.
Prerequisites
Before you enable Provider Autoscaling, make sure you have:
- A Kubernetes v1.28+ cluster running
- A running UXP control plane
- A valid Standard or Development license applied to your control plane
As part of the guide, we will also install the following prerequisites:
- Metrics server or Prometheus Adapter for Kubernetes Metrics APIs installed
- Vertical Pod Autoscaler v1.4+ on your Kubernetes cluster
Install required dependencies
If you don't have the Metrics Server or Kubernetes Vertical Pod Autoscaler, instal them:
Install metrics-server
Add the Metrics Server Helm repository:
helm repo add metrics-server https://kubernetes-sigs.github.io/metrics-server/
helm repo update
Install the Metrics server:
helm upgrade --install --set "args={--kubelet-insecure-tls}" metrics-server metrics-server/metrics-server --namespace kube-system --version 3.12.2
Install vertical pod autoscaler
Follow the VPA installation instructions instructions before continuing.
Enable provider autoscaling
Ensure you have the upbound-stable
Helm repository configured:
helm repo add upbound-stable https://charts.upbound.io/stable
helm repo update
Enable the Provider Autoscaling feature flag in UXP:
helm upgrade --install crossplane --namespace crossplane-system --create-namespace upbound-stable/crossplane --devel --set "upbound.manager.args[0]=--enable-provider-vpa"
Configure provider with autoscaling
Runtime configurations control how UXP deploys and operates Providers in your cluster. The two runtime types associated with Provider VPA are:
DeploymentRuntimeConfig
: The standard Crossplane configuration that defines basic deployment settings for ProvidersUpboundRuntimeConfig
: A UXP-specific extension that provides capabilities like Provider VPA, extending beyond what the standard configuration offers
The DeploymentRuntimeConfig
establishes the
basic Provider deployment, while the UpboundRuntimeConfig
adds UXP-specific
features. A DeploymentRuntimeConfig
can reference an UpboundRuntimeConfig
by
including the annotation pkg.upbound.io/runtime-config
.
To configure a provider with autoscaling, create a
DeploymentRuntimeConfig
:
cat <<EOF | kubectl apply -f -
apiVersion: pkg.crossplane.io/v1
kind: Provider
metadata:
name: upbound-provider-aws-ec2
spec:
package: xpkg.upbound.io/upbound/provider-aws-ec2:v1.23.1
runtimeConfigRef:
apiVersion: pkg.crossplane.io/v1beta1
kind: DeploymentRuntimeConfig
name: config-aws
---
apiVersion: pkg.crossplane.io/v1beta1
kind: DeploymentRuntimeConfig
metadata:
name: config-aws
annotations:
pkg.upbound.io/runtime-config: config-aws
spec: {}
EOF
Create an UpboundRuntimeConfig
with VPA settings:
The UpboundRuntimeConfig
extends the upstream DeploymentRuntimeConfig
with
UXP-specific configuration options and defines the minimum and maximum system
resource values.
cat <<EOF | kubectl apply -f -
apiVersion: pkg.upbound.io/v1beta1
kind: UpboundRuntimeConfig
metadata:
name: config-aws
spec:
capabilities:
- ProviderVPA
verticalPodAutoscalerTemplate:
spec:
targetRef:
kind: Deployment
apiVersion: "apps/v1"
name: provider
resourcePolicy:
containerPolicies:
- containerName: '*'
minAllowed:
cpu: 500m
memory: 100Mi
maxAllowed:
cpu: 2
memory: 2000Mi
controlledResources: ["cpu", "memory"]
EOF
To verify the VPA resource, use kubectl
to check the vpa
component.
kubectl get vpa -n crossplane-system
You should see MODE: Auto
in the output:
NAME MODE CPU MEM PROVIDED AGE
upbound-provider-aws-ec2-8cc80a57d291 Auto 500m 297164212 True 20m
Disable provider autoscaling
If you need to disable Provider Autoscaling, remove the ProviderVPA capability
from the UpboundRuntimeConfig
:
kubectl patch upboundruntimeconfig config-aws --type=merge -p='{"spec":{"capabilities":[]}}'