Skip to content
Edouard Topin's Blog
VKS on VCF 9 / Series 04/05

Day-2 ops on VKS: lifecycle, upgrades, observability

From creation to upgrade through backup and observability — operating a VKS cluster on VCF 9 without surprises. CAPI, VKr, Prom/Graf/Loki, and VCF Operations.

Edouard Topin
7 min read
Abstract editorial illustration of a clock face combined with a maintenance toolkit silhouette over a Kubernetes grid.

Provisioning a VKS cluster is the easy part. Keeping it alive six months later, with upgrades, capacity management, and incidents that don’t wait, is what separates a real platform from a POC dressed as production.

This article walks through the day-2 operations that frame a seriously-operated VKS cluster: CAPI lifecycle, upgrades, backup, observability, and scaling. The goal is to give reference practices and the traps the official docs don’t highlight.

Audience: you already have a running VKS cluster (see the architect’s guide) and you’re preparing for production.

CAPI lifecycle in practice

VKS is built on Cluster API. Understanding its primitives is understanding how you operate your cluster — every action goes through a YAML manifest applied to the Supervisor.

Cluster — the root resource. Describes the desired topology (control plane replicas, workers, version). Editing its fields triggers reconciliation by CAPI.

MachineDeployment — the equivalent of a Kubernetes Deployment but for node VMs. Manages a worker pool with native rolling updates.

Machine — an individual VM. Has its own lifecycle (provisioning, running, deleting). Deleting a Machine triggers replacement by CAPI.

KubeadmControlPlane — manages the control plane. Encapsulates the etcd + API server upgrade logic, which doesn’t tolerate approximation.

ClusterClass — the parameterizable template installed by the Supervisor. It’s what turns a standard CAPI manifest into a VKS-specific cluster.

The rule that changes everything. All modifications go through the manifest. No kubectl edit directly on Machines. No manual edits of VMs in vCenter. If you need to “fix” a node, you delete it through CAPI and let reconciliation recreate it. It’s counterintuitive coming from classic vSphere, but it’s the only way to keep state coherent.

Scaling: horizontal vs vertical

Two dimensions to scale, two different mechanics.

Horizontal (adding nodes). Edit replicas in the worker pool’s MachineDeployment. Going from N to N+1 triggers provisioning of a new worker. Going down triggers a clean drain + delete — pods are evicted according to their PDBs. This is the routine, safe operation.

Vertical (changing node sizing). Editing the vmClass (e.g. guaranteed-mediumguaranteed-large) triggers a rolling replace: each existing node is progressively replaced by a node of the new class. Heavier, and during the operation the cluster temporarily holds more nodes than the target. Plan namespace quotas to absorb that transient surplus.

Kubernetes upgrades: the sequence to respect

The Supervisor / VKS version decoupling is the platform’s main operational argument. You still have to use it correctly.

┌─────────────────────────────────────────────────────────┐
│  Supervisor (vCenter embed)                             │
│  ├── VKr v1.30  (cluster A)   ←  upgradable             │
│  ├── VKr v1.31  (cluster B)   ←  independently          │
│  └── VKr v1.32  (cluster C)   ←  of one another         │
└─────────────────────────────────────────────────────────┘

Step 1 — Fetch the target VKr. In synchronous mode (default), the Subscribed Content Library automatically receives new VKrs from the Broadcom repo. In asynchronous mode, the admin validates and imports manually. Always verify the target OVA is locally present before any upgrade.

Step 2 — Edit the version in the Cluster manifest. Change topology.version from v1.30.0+vmware.1 to v1.31.0+vmware.1, then kubectl apply. CAPI triggers the upgrade sequence.

Step 3 — Control plane upgrade. KubeadmControlPlane upgrades CP nodes one by one with etcd validation at each step. If etcd doesn’t regain quorum after a node restart, the upgrade halts. That’s the right behavior — don’t force past it.

Step 4 — Worker upgrade. Once the control plane is stable, MachineDeployments start their rolling update. Pods are drained according to their PDBs. Stricter PDBs mean slower upgrades — that’s the point.

Step 5 — Post-upgrade validation. Smoke test of critical workloads, CRD verification (some are versioned), metrics check (the kubelet changes version, some metric labels too).

Backup and restore

A topic often deferred. Don’t defer it.

What — snapshot of the etcd store containing all Kubernetes state (resources, secrets, statuses).

When — automatic with KubeadmControlPlane on configurable intervals. Stored on a dedicated PVC, to be exported regularly to external storage.

Restore — manual procedure, complex. Practice in non-prod before you need it in prod. Covers cluster state only, not workloads.

What — application-level backup at the Kubernetes layer (manifests, PVCs, CSI snapshots). The de-facto standard for Kubernetes backup.

When — deploy from production day 1. Regular schedule on namespaces with stateful workloads. Storage to S3 (on-premise object storage or cloud).

Restore — granular (per namespace, per resource), with or without PVCs. The primitive to know for migrating workloads between clusters or recovering from accidental deletion.

What — node VM snapshots at hypervisor level, via vSphere or third-party tools (Veeam, Rubrik, etc.).

When — useful for Supervisor VMs and control plane nodes. Avoid for workers — restoring a worker doesn’t make sense, CAPI replaces them more cleanly.

Restore — VM-level, not resource-level. Insufficient on its own for a Kubernetes cluster — combine with etcd snapshots and Velero.

Stated recommendation. Velero for application workloads, automatic etcd snapshots for cluster state, vSphere snapshots for Supervisor VMs. The three are complementary; none replaces the others.

Observability: the standard stack

The CNCF ecosystem is usable as-is on VKS, with integrations to VCF Operations to correlate infrastructure and workloads.

┌─ Workloads (pods) ─────────────────────────┐
│   ↓ metrics                                │
│   ↓ logs                                   │
│   ↓ traces (optional)                      │
├────────────────────────────────────────────┤
│   Prometheus (metrics scrape)              │
│   Loki (logs ingestion)                    │
│   OpenTelemetry Collector (traces)         │
├────────────────────────────────────────────┤
│   Grafana (dashboards)                     │
│   Alertmanager (alerting)                  │
├────────────────────────────────────────────┤
│   forward → VCF Operations for Logs        │
│   forward → VCF Operations for Apps        │
└────────────────────────────────────────────┘

Metrics. Prometheus Operator deployed via Helm. ServiceMonitor for workloads, PodMonitor for pods without Service. Default retention (15 days) is too short for post-mortem analysis past the sprint — bump to 30-90 days, and offload cold data to Thanos or Mimir.

Logs. Loki with Promtail as node-level collector. Simple architecture to operate, but watch chunk sizing (defaults are too conservative for clusters with many ephemeral pods). Forward critical logs to VCF Operations for Logs to correlate with vSphere events.

Grafana dashboards. The default Kubernetes dashboards (kubernetes-mixin) cover the essentials. Customize for application SLIs, not for infra metrics — those are better served by VCF Operations dashboards.

Alerting. Alertmanager for pod-level alerts. For infra alerts (host failure, full datastore), VCF Operations is better positioned. Avoid duplicating alert sources — golden rule: one alert, one source.

Capacity management

The cluster grows. The cluster must also be constrained.

vSphere namespace quotas. CPU, memory, storage, number of clusters per namespace. Calibrate by team profile: a data team namespace ≠ a web team namespace. Quotas are the most effective governance tool against cost drift — and they’re free.

ResourceQuota and LimitRange inside the cluster. Within a cluster, ResourceQuota and LimitRange control consumption per Kubernetes namespace. Mandatory on multi-tenant clusters.

Capacity planning. Based on Prometheus metrics, model expected growth (pod count, namespace count, RPS) and anticipate adding capacity. Once a quarter is enough for most platforms — except during application growth phases when it should be monthly.

Gotchas and common traps

PDBs too strict = upgrades that never finish
A PodDisruptionBudget with minAvailable: 100% blocks any node drain. During an upgrade, the rolling replace stops at the first worker to drain. Audit PDBs before each upgrade and adjust temporarily if needed — a PDB that indefinitely blocks an upgrade is an operational vulnerability.
Desynced Content Library = silently failing upgrades
If the Subscribed Content Library hasn't synced the target VKr, the upgrade starts and fails with an unhelpful message. Always verify the OVA is in the Content Library before editing topology.version.
etcd full disk = control plane down
etcd has a size limit (8 GB default). On clusters with many Secrets or Custom Resources, the limit can be hit. Symptom: API server refusing writes. Monitor etcd store size via Prometheus and alert at 70%. Regular compaction and defrag are mandatory.
Loki cardinality explosion
Loki indexes labels, not content. Putting UUIDs or trace IDs in labels (instead of leaving them in the message) explodes cardinality and makes Loki unusable. Rule: labels are for coarse filtering (namespace, app, level), not for unique values.
Prometheus storage saturating during upgrade
During a rolling update, new nodes appear with new labels. Prometheus series temporarily double. On clusters tight on disk, this can saturate Prometheus's PVC. Plan 30% headroom on the PVC, or enable auto-expand if the storage class allows it.
Velero PVC restore: namespaces must pre-exist
Restoring a workload with PVC requires the storage class and namespace to exist at restore time. If you restore into a fresh cluster, create the storage class first. Test the procedure end-to-end in non-prod, not on incident day.
Upgrades on stateful workload clusters
Databases and queue systems with strong node affinity may handle drains poorly. Test upgrades in a representative environment, not just with stateless deployments. And don't neglect anti-affinity rules in workload manifests — without them, all replicas may end up on a single node and the drain takes them all down at once.

Conclusion and what’s next

Key takeaways. Day-2 ops on VKS are framed by CAPI: everything goes through the manifest, never through direct edits. Kubernetes upgrades are decoupled from the Supervisor but respect the upstream matrix — no skipping minors. Velero is non-negotiable for application workloads. The standard observability stack works well and integrates with VCF Operations. Gotchas are rarely in individual components, more often in their interactions (PDBs + upgrades, cardinality + Loki, etcd + Custom Resources).

What’s next. The final article in this series covers GitOps on VKS: how to automate application deployment with Argo CD, manage secrets with External Secrets Operator, and extend the pattern to multi-cluster. That’s the step that turns an operated cluster into a self-service platform.

Resources.

Going further:

Get the next one by email

New articles and series, sent when they are published. No other mail.

One click to unsubscribe, any time.

Back to blog
Share

Related articles

  1. 16 min read

    FinOps cost models: what AWS, Azure and GCP bill — and what VCF calculates

    An EKS cluster-hour, an AKS tier, a GKE Pod request and depreciated VCF hardware are not four values of one variable. What each platform bills, and what VCF calculates instead.

  2. 23 min read

    Network policies and Cilium: building a defensible default-deny

    The NetworkPolicy API ships with Kubernetes; enforcing it is the CNI's job. What Cilium adds, what stays standard, and how to reach default-deny by watching real flows before blocking any.

  3. 18 min read

    Kubernetes RBAC: the foundations, and the pitfalls that survive an audit

    Every one of these pitfalls is published on kubernetes.io. What is missing is the ordering — and the path that leads from a vSphere Namespace straight to cluster-admin.

Follow along

New articles, thoughts, and updates.