# GCP VM on Sole-Tenant Node

> GCP charges a fixed 10% sole-tenancy premium on the vCPU and memory cost of VMs placed on dedicated nodes. ZopNight detects the placement from the discoverer's sole_tenant flag but deliberately abstains from a savings figure. The premium SKU cannot yet be isolated per VM, and flat fractions were retired.

Source: https://zop.dev/integrations/gcp/recommendations/gcp-vm-on-sole-tenant-node
Updated: 2026-08-19

---

## The 10% premium and where it hides

Sole-tenant nodes give a VM a physical host it shares with nobody, and GCP prices that
isolation as a fixed 10% premium on the underlying vCPU and memory cost. The Cloud
Billing Catalog publishes it as its own SKU line ("Sole Tenancy Premium for … Instance
Core/Ram running in …"), separate from the node charge itself. Workloads that needed it
for a licensing term or a compliance audit often keep paying it years after the
requirement lapsed.

## Detection works; pricing is withheld

The placement signal is solid: the discoverer stamps `sole_tenant=true` from the
instance's node affinity, and the rule accepts it from either the metadata sink or its
legacy label mirror, failing closed when neither is present. What the rule refuses to do
is attach dollars. Earlier revisions shipped flat fractions: 30% of the bill, later a
9.09% premium-removal approximation. Both were retired because the premium applies
to the vCPU-plus-memory slice, not the whole bill, and no live rate backed either number.

## Why not just multiply by 10%

Two inputs are missing. The pricing pipeline currently collapses every sole-tenancy SKU
into a single node-rate key, so the distinct premium rate is indistinguishable from the
regular per-core rate. And the discovered VM record carries no vCPU or memory quantity to
multiply a per-core premium against. Until both exist, any figure would be an estimate
wearing a price tag, so the rule surfaces nothing rather than a number it cannot defend.

## Confirm node affinity on a VM

```bash
gcloud compute instances describe my-vm --zone us-central1-a \
  --format="yaml(scheduling.nodeAffinities)"
```

A populated `nodeAffinities` block confirms sole-tenant placement. Migrating off is a
recreate onto shared tenancy, not an in-place flag change, so plan it like a resize with
downtime.

## Legitimate reasons to stay sole-tenant

Bring-your-own-license Windows or SQL Server workloads, per-core licensing audits, and
hard isolation mandates all justify the premium. The point of the flag is to force the
question annually, not to assume the answer is always "move".
