Stage 0 learning document for request section 17. This distinction is a core purpose of Project 1.5.
| VM migration (rehost) | Application modernization (replatform / refactor) | |
|---|---|---|
| What moves | The whole machine: OS, kernel, packages, config, data | Only the application and its configuration/content |
| Unit after the move | A KubeVirt VirtualMachine |
A container image, run by a Deployment |
| Guest OS | Kept. Still patched, hardened and backed up like a VM. | Gone. The node kernel is shared; the image contains only user space. |
| Application change | None | Some: packaging, config via env/ConfigMap, logs to stdout, health endpoints |
| Scaling | Vertical (bigger VM); one instance unless you clone VMs | Horizontal (replicas), autoscaling |
| Updates | In-place (apt/yum inside the guest) | Build a new image, roll out by digest |
| Speed and risk | Fast, low risk, repeatable at scale | Slower, needs app knowledge and testing |
| When to choose | Many VMs, deadline, vendor appliances, apps you cannot change, stateful legacy | Apps you own, stateless or cleanly stateful, where Kubernetes benefits matter |
Migration to KubeVirt preserves the VM model. Modernization removes the VM dependency.
KubeVirt is valuable precisely because it lets both live on one platform: migrate everything first (one control plane, one GitOps flow, one observability stack), then modernize the workloads that justify it, one by one.
legacy VM (Linux + nginx on ESXi)
-> nginx
-> assess workload
-> containerization candidate
-> container image
-> Deployment
-> Service
| Question | Answer for our demo VM | Why it matters |
|---|---|---|
| What does it run? | nginx from the distro package, static site in /var/www, config in /etc/nginx |
Defines what goes in the image |
| State? | None beyond the static content | Stateless = easy candidate |
| Ports? | 80/tcp | Becomes containerPort and Service port |
| OS dependencies? | None special (no kernel modules, no local cron jobs that matter) | Kernel-level needs block containerization |
| Config and secrets? | Plain nginx config, no secrets | Maps to ConfigMap; secrets would map to Secret |
| Logs? | Files under /var/log/nginx |
Container should log to stdout/stderr |
| Identity / licensing tied to MAC or hostname? | No | Would favor keeping it as a VM |
| Verdict | Containerization candidate: yes |
FROM nginx:<pinned version>, COPY the site content and a reviewed nginx.conf extracted from the VM, run as non-root if possible, push, and reference by digest (practice from Project 1).replicas: 2, readiness and liveness probes on /, CPU/memory requests and limits, rolling update strategy.