Request an exact quote
Containers & PaaS migration path

From Mirantis Kubernetes Engine to Kubernetes (upstream)

Leaving the per-node MKE/UCP subscription for vanilla Kubernetes, converting Swarm and compose workloads, and standing up a conformant cluster without a delivery freeze.

Effort
High
Est. timeline
~18 wks
Kubernetes (upstream) model
Free (self-managed)
Open source
Yes
▶ Model your savings in the interactive calculator

Docker Enterprise became Mirantis Kubernetes Engine (MKE) after Mirantis acquired the Docker EE business, and with it came a per-node control-plane subscription that scales with cluster size. Plenty of teams now run that workload on upstream, CNCF-conformant Kubernetes instead, removing the license and the UCP/Swarm layer. The good news: if your workloads already run as containers, the application contract barely changes. The work is in replacing the management plane and translating any Swarm-specific or compose-specific config into native Kubernetes objects.

Know which layer you are leaving

MKE bundles several things: the Kubernetes distribution, the legacy Swarm/UCP orchestration, DTR/MSR (the registry), and RBAC/UI on top. Your migration effort depends entirely on what you actually use:

  • Already on MKE’s Kubernetes: mostly a cluster rebuild plus RBAC and ingress re-wiring. The manifests largely carry over.
  • Still on Swarm/UCP: more work, you are converting an orchestration model, not just a distro.

Inventory this first, it determines whether this is a weekend or a quarter.

The conveniences Swarm handed you for free

Naming what the subscription bundled keeps the rebuild grounded. MKE packaged the Kubernetes distribution, the legacy Swarm/UCP orchestration, the DTR/MSR registry, and a unified RBAC and UI as one supported stack. Swarm in particular made some things effortless that Kubernetes makes explicit: the routing mesh published a port cluster-wide with no ingress object, overlay networks connected services without a CNI to choose, and compose files described a whole app in one place. Upstream Kubernetes trades that simplicity for flexibility. You choose the CNI, the ingress controller, the storage class, the registry, and the monitoring stack, and you own keeping them working across upgrades. The application contract barely moves because your services are already containers. The work, and the ongoing cost, is reproducing the management plane and the conveniences Swarm gave you for free.

Turning compose files into manifests

For Swarm or compose-based services, kompose converts docker-compose/stack files into Kubernetes manifests as a starting point, not a finished product. Expect to refine:

  • Services become Deployments (or StatefulSets for stateful apps) plus Services.
  • Published ports / routing become an Ingress controller (NGINX, Traefik) instead of Swarm’s routing mesh.
  • Secrets and configs map to Kubernetes Secrets and ConfigMaps, re-create them, do not copy plaintext.
  • Overlay networks map to Kubernetes networking + NetworkPolicies.
  • Volumes map to PersistentVolumeClaims with a real storage class.

Stand up the cluster and cut over

  1. Pick a distribution: upstream via kubeadm, or a conformant build (k3s, Talos, RKE2) sized for your environment, with a real CNI, ingress controller, and storage class.
  2. Move the registry: repoint images from DTR/MSR to your new registry (Harbor is the common open-source choice); update image references in manifests.
  3. Rebuild RBAC: MKE’s RBAC and teams do not transfer, recreate roles and bindings in Kubernetes RBAC.
  4. Migrate namespace by namespace: deploy a workload to the new cluster, validate, shift traffic, then move the next. Keep MKE running until the last namespace is across.

Validation and cutover, namespace by namespace

Migrate one namespace at a time and validate it before touching the next. Deploy the converted workloads to the new cluster and confirm pods schedule with the resource limits and probes you added, that PVCs bind to a real storage class and mount the migrated data, and that Ingress resolves the hostnames Swarm used to publish. Verify images pull from the new registry, that the rebuilt RBAC grants each namespace exactly what it needs, and that NetworkPolicies enforce the isolation the overlay network used to imply. Shift traffic only after a namespace serves real requests cleanly, and keep MKE running until the last namespace is across so any wave can roll back.

The details that bite

  • kompose is a draft. Treat its output as scaffolding, review every manifest for resource limits, probes, and security context that Swarm did not require.
  • Stateful workloads need a plan. Databases and queues need StatefulSets, real storage classes, and a data-migration step, do not lift-and-shift their volumes blindly.
  • Ingress and TLS. Swarm’s routing mesh has no direct equivalent, design ingress and certificate management (cert-manager) deliberately.
  • Operational tooling is yours now. MKE’s UI, monitoring, and upgrades were managed, plan for upstream equivalents (Prometheus/Grafana, an upgrade cadence, backups via Velero) or you trade license cost for operational gaps.

Standing up the operational layer first

The mistake that turns a clean migration into an incident is moving workloads before the operations around them exist. MKE gave you a console, monitoring, an upgrade path, and a backup story as managed features, and none of that arrives with an empty upstream cluster. Before the first production namespace moves, stand up monitoring with Prometheus and Grafana, log shipping to a store you can query, an ingress controller with certificate management through cert-manager, a real storage class for stateful workloads, and Velero for scheduled backups. Decide an upgrade cadence for the distribution and its add-ons, and write down who owns it. Building this ahead of the workloads means each namespace lands on a platform that can already observe, back up, and recover it, rather than one you are assembling under pressure after something breaks.

The short version

MKE to upstream Kubernetes removes the per-node subscription in exchange for owning the cluster yourself. Scope the effort by how much Swarm/UCP you still use, convert compose/stack files with kompose as a draft and refine every manifest, move the registry and rebuild RBAC, then migrate namespace by namespace while MKE keeps running. Stand up the operational layer (ingress, storage, monitoring, backups) before you cut over, and model the removed subscription against the engineering time to run Kubernetes in the calculator above.

Tooling & automation for this path

Convert Compose/Swarm definitions to Kubernetes manifests (kompose); stand up the cluster; migrate volumes; validate and cut over.

Primary references: official Kubernetes (upstream) documentation ↗ and the Mirantis Kubernetes Engine documentation ↗ , always verify version-specific behavior against them before you migrate.

Frequently asked questions

Does kompose fully convert my docker-compose and Swarm stack files to Kubernetes?

kompose gives you a starting point, not a finished manifest set. It maps services to Deployments and Services and volumes to PersistentVolumeClaims, but it does not add resource limits, liveness and readiness probes, or a sensible securityContext, and it cannot infer StatefulSet semantics for stateful services. Treat its output as scaffolding and review every generated file before it goes near production.

What replaces Swarm's routing mesh when I move to Kubernetes?

Swarm's routing mesh has no direct Kubernetes equivalent, so published ports become Services fronted by an Ingress controller such as NGINX or Traefik. You design host and path rules explicitly and add certificate management, commonly with cert-manager, rather than getting cluster-wide port publishing for free. Plan ingress and TLS as a deliberate piece of work, not an afterthought.

Can I keep using DTR/MSR, or do I have to move the registry too?

The registry moves with the platform. Stand up a new registry, Harbor is the common open-source choice, mirror or re-push your images, and update every image reference in your manifests to point at it. Leaving images in DTR/MSR keeps you tied to the MKE stack you are trying to retire, so cutting the registry over is part of the migration rather than a later cleanup.

Does MKE's RBAC transfer to Kubernetes RBAC?

No. MKE's teams, grants, and UCP roles do not map onto native Kubernetes RBAC, so you recreate roles and role bindings from scratch. Take the inventory as an opportunity to tighten access rather than replicate old grants verbatim, and validate that each namespace's bindings grant exactly what its workloads and operators need.

Model your 3-year cost

Pre-filled for Mirantis Kubernetes Engine → Kubernetes (upstream); adjust every figure with your own numbers. Estimates are illustrative, not vendor quotes, see our methodology.

Sized at 512 vCPU cores, cost is computed on this.
Stay on Mirantis Kubernetes Engine (3yr)
$184,320
Move to Kubernetes (upstream) (3yr + migration)
$84,288
Projected savings
$100,032 (54%)
Payback period
15.1 mo
Build a decision report from these numbers:

Illustrative, editable figures, not vendor pricing (defaults reviewed May 2026).

Request a vendor-accurate Kubernetes (upstream) quote

A guided builder that turns your estimates into a requirements report (RFQ) you can send to a vendor, partner, or distributor for a binding quote, then feed the real prices back into the calculator above. How our estimates work.

  1. 1Size it
  2. 2Requirements
  3. 3Your details
  4. 4Channels & export

How big is your Mirantis Kubernetes Engine estate?

vSphere licenses physical cores across all hosts (16-core minimum per CPU). Not sure? Enter rough numbers, the distributor confirms exact counts later.

512 vCPU cores
Default mid-size assumption (512 vCPU cores)