Gcore Managed Kubernetes includes native autoscaling based on CPU and memory only. To scale workloads based on GPU utilization, KEDA must be manually installed and configured.
Prepare the cluster
Create a Kubernetes cluster with a GPU Bare Metal worker pool and verify that nodes are ready before installing GPU software.Step 1. Create a Kubernetes cluster
Add a new Managed Kubernetes cluster with a Bare Metal worker pool:- In the Gcore Customer Portal, navigate to Cloud > Kubernetes.
- Click Create Cluster.
- Select a region — the location of the data center where the cluster will be deployed.
- Select the Kubernetes cluster version: v1.28.6 or higher.
- Configure Bare Metal pools:
- Pool name: Enter a unique and descriptive name for the resource pool.
- Minimum nodes and Maximum nodes: Specify how many nodes can be allocated to the pool during traffic fluctuations. The maximum number of nodes must be greater than the minimum to allow the cluster to scale up in response to increased demand.
- Type: Select GPU Bare metal instances.
- Infrastructure: Select the needed GPU-optimized flavor. At least one node with GPU support must be added to the worker pool.

- (Optional) Add labels to include additional node metadata. Add taints to define which Kubernetes pods can be scheduled on these nodes.
- Disable the Autohealing nodes toggle.
- (Optional) Enable the Public IPv4 address option to assign public IPv4 addresses to cluster nodes.
- To add more pools, click Add pool and configure each according to the previous steps.

- Complete the remaining cluster settings starting from step 5 in the cluster creation guide.
Step 2. Verify the Kubernetes configuration
- In the Customer Portal, navigate to Cloud > Kubernetes.
- Find the cluster created in the previous step and click its name to open it.
- Check the pool status: it should be Running. If the status shows Scaling up, wait until all resources are allocated and the cluster is ready to use.
- Download the .config file by clicking Kubernetes config in the top-right corner of the screen.

- Export Kubernetes configuration locally:
- Verify that the node is ready:
Install dependencies
Install the GPU Operator to expose GPU resources, then KEDA and Prometheus to drive utilization-based scaling decisions.Step 3. Install GPU Operator
Use Helm to install the GPU Operator — the official Helm docs cover installation for all platforms.- Add the NVIDIA Helm repository and update it:
- Install the GPU Operator. Use version
v23.9.1for Kubernetes 1.28.x orv23.9.2for Kubernetes 1.29.x:
Step 4. Verify GPU allocation
- Run
kubectl describe node <node-name>and check the Allocatable section. Thenvidia.com/gpuvalue must match the GPU count specified in the Bare Metal flavor.
- Check that all GPU Operator pods have READY status:
- Run a test GPU application using the NVIDIA CUDA vectorAdd example. Deploy the example workload and confirm it completes successfully before continuing.
Step 5. Install KEDA
With GPU resources confirmed, install KEDA — it reads Prometheus metrics to determine when to create additional pods.- Add the KEDA Helm repository:
- Update the repository:
- Install KEDA into its own namespace:
Step 6. Install kube-prometheus-stack
KEDA relies on Prometheus metrics to trigger GPU-based scaling decisions. Install the kube-prometheus-stack to collect and expose those metrics.- Add the Prometheus Helm repository, update it, and save the default values:
- Create the
values-overrides.yamlfile with the following content:
- Install kube-prometheus-stack:
values-overrides.yaml overrides the default Prometheus configuration to define a scrape job that collects DCGM metrics from the gpu-operator namespace.
Configure autoscaling
With metrics collection in place, create the workload and the ScaledObject that tells KEDA how to scale it.Step 7. Deploy the workload and ScaledObject
Deploy the GPU workload and the KEDA ScaledObject that controls its scaling. Apply both manifests to the cluster. Workload DeploymentDCGM_FI_DEV_GPU_UTIL metric measures real-time GPU core utilization and is collected by the nvidia-dcgm-exporter installed in Step 3. Any metric from the DCGM exporter can be used in the query field instead.
Parameters
Replace the example values in both manifests:| Parameter | Description |
|---|---|
gpu-workload | Unique name for the workload. Use the same value in metadata.name (Deployment), spec.containers[].name, and spec.scaleTargetRef.name (ScaledObject). |
registry.example.com/gpu-app:latest | Container image URL. |
8 | Number of GPUs to allocate per container. |
1 / 16 | Minimum and maximum number of replicas. |
60 | GPU utilization percentage at which KEDA triggers scaling. |
gpu-utilization | Unique identifier for the metrics series. |
Verify scaling
Deploy the workload and confirm that KEDA, Cluster Autoscaler, and new GPU nodes respond correctly to GPU utilization changes.Step 8. Verify autoscaling
The autoscaling sequence has three phases: KEDA monitors GPU utilization and scales pods via the HPA, Cluster Autoscaler provisions new nodes when GPU capacity runs out, then new nodes join the cluster.- Monitor HPA in real time:
- When pods exceed GPU capacity, Cluster Autoscaler requests new nodes. Run
kubectl get events -wto observe provisioning events — node provisioning takes up to 20–25 minutes.
- Once the new node is ready, check pod status:
Pending status while the new node initializes. After it is ready, the system scales up to the maxReplicaCount value.
After provisioning, it might take up to five minutes for NVIDIA GPU resources to become available in the cluster.
- Check that the new node has joined the cluster:
- Verify the final HPA status:
maxReplicaCount limit. If all GPUs are in use and no free resources are available, Kubernetes keeps the pods in Pending state, and Cluster Autoscaler provisions new nodes. Once new nodes are ready and GPUs are initialized (which might take 5 to 10 minutes), the pending pods start running.