Fixing etcd Latency Issues in OpenShift

Troubleshooting etcd latency in OpenShift (OCP) is one of the most important skills for an OpenShift Architect because etcd performance directly impacts the Kubernetes API server and the entire cluster.

When etcd becomes slow, you’ll typically see:

oc get pods --> slow
oc apply --> slow
Operators --> degraded
Authentication --> slow
API Server --> high latency

Understanding the flow

User
API Server
etcd
Disk

Most etcd latency issues are actually caused by:

  1. Storage latency (most common)
  2. CPU starvation
  3. Memory pressure
  4. Network latency between masters
  5. Large etcd database
  6. Excessive API writes

Symptoms

Check cluster operators:

oc get co

Typical:

etcd Degraded=True
kube-apiserver Degraded=True

Step 1: Check etcd operator status
oc get co etcd

Detailed:

oc describe co etcd

Look for messages:

High fsync latency
High commit latency
Leader changes
Database size warning

Step 2: Check etcd metrics

Login to Prometheus:

Observe → Metrics

Important metrics:

WAL fsync latency
histogram_quantile(
0.99,
rate(etcd_disk_wal_fsync_duration_seconds_bucket[5m])
)

Target:

< 10ms

Problem:

> 50ms

Backend commit latency
histogram_quantile(
0.99,
rate(etcd_disk_backend_commit_duration_seconds_bucket[5m])
)

Target:

< 25ms

Leader changes
increase(etcd_server_leader_changes_seen_total[1h])

Expected:

0

Frequent changes indicate network or resource issues.


Step 3: Check API server latency

oc adm top pods -n openshift-kube-apiserver

Also:

apiserver_request_duration_seconds

If API latency spikes with etcd latency:

etcd is likely the bottleneck.


Step 4: Check etcd pod health
oc get pods -n openshift-etcd

Should be:

etcd-master-0 Running
etcd-master-1 Running
etcd-master-2 Running

Check logs:

oc logs -n openshift-etcd etcd-master-0

Look for:

apply request took too long
waiting for ReadIndex response took too long
leader changed

These are classic etcd latency indicators.


Step 5: Check database size
oc exec -n openshift-etcd etcd-master-0 \
-- etcdctl endpoint status -w table

Look at:

DB SIZE

Rule of thumb:

SizeStatus
<4GBGood
4-8GBWatch
>8GBInvestigate

Step 6: Check storage latency (MOST COMMON)

SSH to master:

oc debug node/master-0
chroot /host

Run:

iostat -xm 5

Look at:

await

Healthy:

< 10ms

Problem:

> 20ms

Critical:

> 50ms

Also check:

sar -d 1 10

Step 7: Check CPU pressure
top

or

oc adm top nodes

Look for:

CPU > 80%

on control plane nodes.


Step 8: Check memory pressure
free -g

or

oc adm top nodes

If swapping occurs:

vmstat 1

etcd performance drops dramatically.


Step 9: Check network latency between masters

From master:

ping <master2>
ping <master3>

Latency should be:

< 1ms

Also:

mtr <master2>

Look for:

  • packet loss
  • jitter

Step 10: Check API churn

One hidden cause:

Too many updates
Too many watches
Bad operators

Check:

rate(apiserver_request_total[5m])

and:

apiserver_current_inflight_requests

Common Real-World Root Causes
Storage issue (70% of cases)

Symptoms:

High WAL fsync
High backend commit

Fix:

  • Faster disks
  • Premium SSD
  • Dedicated storage

Large etcd DB

Symptoms:

DB > 8GB

Fix:

etcdctl compact
etcdctl defrag

(OpenShift usually automates maintenance, but investigate excessive object growth.)


API storm

Example:

Misconfigured operator
Bad controller
Thousands of writes/sec

Fix:

Identify offending namespace/operator.


Leader instability

Symptoms:

Leader changes
Election storms

Fix:

Network troubleshooting between control plane nodes.


Quick Triage Flow
etcd latency alert
Check etcd operator
Check WAL fsync latency
Check backend commit latency
Check storage (iostat)
Check DB size
Check leader changes
Check API churn

Interview Answer (2-Minute Version)

When troubleshooting etcd latency in OpenShift, I first check the etcd operator and Prometheus metrics such as WAL fsync latency, backend commit latency, and leader changes. The most common root cause is storage latency, so I verify disk performance using iostat and ensure etcd is running on low-latency SSD storage. I also check etcd database size, API server request rates, CPU and memory utilization on control plane nodes, and network latency between masters. If needed, I investigate excessive API writes, large object counts, or leader election instability. Since etcd is the cluster’s source of truth, even small increases in disk latency can significantly impact API responsiveness and overall cluster health.

Understanding CVO and MCO in OpenShift

In Red Hat OpenShift, the Cluster Version Operator (CVO) and the Machine Config Operator (MCO) are the two most critical automation engines driving Day-2 operations. Together, they eliminate manual cluster maintenance by treating the entire platform—from the high-level Kubernetes APIs down to the bare-metal Linux kernel—as software that can be updated declaratively.

If you think of an OpenShift cluster as a cruise ship, the CVO is the Captain directing the route and orchestrating the crew, while the MCO is the Chief Engineer down in the engine room making sure the structural hardware and operating systems are tuned and running.

1. The Cluster Version Operator (CVO)

The CVO is responsible for the lifecycle of the OpenShift platform layer. It manages all the internal cluster operators (such as Network, Ingress, Monitoring, and Authentication) and orchestrates automated cluster upgrades.

How CVO Works Internally

Instead of downloading individual binaries, the CVO consumes a single artifact called a Release Payload Image (an OCI container image stored in a registry like Quay.io). This payload contains the exact container images and precise Kubernetes manifests for every single operator needed to run that specific version of OpenShift.

The Step-by-Step Upgrade Loop:
  1. The Target: You or a GitOps pipeline change the cluster’s desired version (e.g., using oc adm upgrade --to=4.16.5).
  2. The Graph: The CVO contacts the OpenShift Update Service to validate the upgrade path graph, ensuring the jump is safe and certified.
  3. The Unpacking: It pulls down the release payload image and reads the release-manifests/ directory.
  4. The Dependency Graph Routing: The CVO updates cluster operators in a highly orchestrated sequence. For example, it updates etcd and the kube-apiserver first. It waits until those components report a Healthy status before it tells secondary operators (like Monitoring or Logging) to update their underlying payloads.
  5. Continuous Verification: The CVO continuously tracks the status of all operators, ensuring the cluster achieves the exact desired state declared in the payload image.

2. The Machine Config Operator (MCO)

While the CVO handles the cluster applications and APIs, the MCO manages the host Operating System (RHCOS/FCOS) running on the physical or virtual worker and master nodes. It treats the operating system configuration itself as “just another Kubernetes object.”

If you need to update a file in /etc, inject an enterprise SSH key, modify a sysctl network parameter, or upgrade the Linux kernel version, you do not SSH into nodes. You write a MachineConfig YAML file, and the MCO executes it.

The Sub-Components of the MCO

The MCO orchestrates its node-level automation using three specialized background utilities:

  • Machine-Config-Controller: Sits on the control plane. It watches for changes to your MachineConfig manifests and compiles (“renders”) them into unified Ignition configuration files. It also coordinates with the node daemons to execute updates safely without dropping active application workloads.
  • Machine-Config-Server: An internal utility that listens on port 22623. When a brand-new bare-metal server boots up for the first time, its internal Ignition agent contacts this server to fetch its initial operating system blueprint.
  • Machine-Config-Daemon (MCD): This runs as a DaemonSet (one pod on every single node in your cluster). The MCD has root access to the host file system. It takes the instructions sent by the controller and writes them directly to the node’s disk.
The MCO Update Sequence (The Safety Loop)

When the CVO updates the cluster version, or when you manually submit a new MachineConfig, the MCO triggers an automated rolling update across your MachineConfigPools (Master pool or Worker pool):

  1. The machine-config-controller generates a new target profile.
  2. The machine-config-daemon on Node 1 picks up the change.
  3. The controller safely drains and cordons Node 1, migrating all application pods to neighboring nodes.
  4. The MCD writes the new OS configuration files to disk using rpm-ostree (atomic OS layering).
  5. If the change requires a kernel tweak or driver reload, the MCD reboots the physical node.
  6. Once Node 1 boots up healthy and passes verify checks, the MCO uncordons it and moves on to Node 2.

Architectural Summary: How They Interact During an Upgrade

When you run a standard cluster upgrade, the CVO and MCO work in lockstep to keep the platform online:

Plaintext

 ┌────────────────────────────────────────────────────────┐
 │ 1. Admin triggers upgrade via CVO (oc adm upgrade)     │
 └───────────────────────────┬────────────────────────────┘
                             ▼
 ┌────────────────────────────────────────────────────────┐
 │ 2. CVO unpacks payload & updates Cluster Operators     │
 └───────────────────────────┬────────────────────────────┘
                             ▼
 ┌────────────────────────────────────────────────────────┐
 │ 3. CVO triggers the Machine Config Operator (MCO)      │
 └───────────────────────────┬────────────────────────────┘
                             ▼
 ┌────────────────────────────────────────────────────────┐
 │ 4. MCO commands Machine Config Daemons to update OS    │
 └───────────────────────────┬────────────────────────────┘
                             ▼
 ┌────────────────────────────────────────────────────────┐
 │ 5.Nodes are drained, updated via rpm-ostree, & rebooted│
 └────────────────────────────────────────────────────────┘

By separating responsibilities—with CVO owning the cluster software state and MCO owning the immutable node operating systems—OpenShift eliminates manual cluster maintenance, providing a highly scalable and resilient platform.

Step-by-Step OKD Installation on Azure VM

Here’s a complete step-by-step guide for installing OKD (the upstream OpenShift) on a single Azure VM — this is an SNO (Single Node OpenShift/OKD) style install using the Agent-Based Installer.


Prerequisites

Local machine (your laptop/workstation)

  • openshift-install binary (OKD build)
  • oc CLI
  • az CLI, authenticated to your Azure subscription
  • ssh-keygen key pair ready

Azure VM spec (minimum for SNO)

ResourceMinimum
vCPUs8
RAM16 GB (32 GB recommended)
OS Disk120 GB SSD
OSRHCOS (installed by OKD — you don’t pick the OS)

Step 1 — Create the Azure VM (bare metal style)

# Variables
RG="okd-snо-rg"
LOCATION="canadacentral"
VM_NAME="okd-sno"
VNET="okd-vnet"
SUBNET="okd-subnet"
# Resource group
az group create --name $RG --location $LOCATION
# VNet + Subnet
az network vnet create \
--resource-group $RG \
--name $VNET \
--address-prefix 10.0.0.0/16 \
--subnet-name $SUBNET \
--subnet-prefix 10.0.1.0/24
# Public IP (static)
az network public-ip create \
--resource-group $RG \
--name okd-pip \
--sku Standard \
--allocation-method Static
# NSG + rules
az network nsg create --resource-group $RG --name okd-nsg
for PORT in 22 80 443 6443 22623; do
az network nsg rule create \
--resource-group $RG \
--nsg-name okd-nsg \
--name "allow-$PORT" \
--priority $((1000 + PORT % 1000)) \
--destination-port-ranges $PORT \
--access Allow --protocol Tcp
done
# NIC
az network nic create \
--resource-group $RG \
--name okd-nic \
--vnet-name $VNET \
--subnet $SUBNET \
--public-ip-address okd-pip \
--network-security-group okd-nsg
# VM (no OS — we'll boot from ISO)
az vm create \
--resource-group $RG \
--name $VM_NAME \
--nics okd-nic \
--size Standard_D8s_v3 \
--os-disk-size-gb 120 \
--image "RedHat:RHEL:8-lvm-gen2:latest" \ # placeholder — replaced by RHCOS
--admin-username azureuser \
--ssh-key-values ~/.ssh/id_rsa.pub \
--storage-sku Premium_LRS

In practice for OKD SNO you boot from the agent ISO — the VM image above is just to get the disk. We’ll write RHCOS over it.


Step 2 — Get the OKD installer & pull secret

# Download latest OKD release
OKD_VERSION="4.15.0-0.okd-2024-03-10-010116"
wget https://github.com/okd-project/okd/releases/download/${OKD_VERSION}/openshift-install-linux-${OKD_VERSION}.tar.gz
tar xvf openshift-install-linux-*.tar.gz
sudo mv openshift-install /usr/local/bin/
# Pull secret — OKD uses a fake/empty one (no Red Hat subscription needed)
# Use this minimal pull secret:
cat > pull-secret.json << 'EOF'
{"auths":{"fake":{"auth":"aWQ6cGFzcw=="}}}
EOF

Step 3 — Generate install-config.yaml

mkdir ~/okd-install
cat > ~/okd-install/install-config.yaml << EOF
apiVersion: v1
baseDomain: yourdomain.com # e.g. azure.example.com
metadata:
name: okd-sno # cluster name
compute:
- name: worker
replicas: 0 # SNO = 0 workers
controlPlane:
name: master
replicas: 1 # SNO = 1 master
platform:
baremetal: {}
platform:
none: {} # Agent-based uses "none"
pullSecret: '{"auths":{"fake":{"auth":"aWQ6cGFzcw=="}}}'
sshKey: '$(cat ~/.ssh/id_rsa.pub)'
EOF

Step 4 — Generate the Agent ISO

# Copy install-config (installer consumes it)
cp ~/okd-install/install-config.yaml ~/okd-install/
# Generate agent-config.yaml for SNO
cat > ~/okd-install/agent-config.yaml << EOF
apiVersion: v1alpha1
kind: AgentConfig
metadata:
name: okd-sno
rendezvousIP: 10.0.1.10 # VM's private IP
hosts:
- hostname: okd-sno
role: master
interfaces:
- name: eth0
macAddress: "$(az network nic show -g $RG -n okd-nic --query 'macAddress' -o tsv | tr '[:upper:]' '[:lower:]')"
networkConfig:
interfaces:
- name: eth0
type: ethernet
state: up
ipv4:
enabled: true
address:
- ip: 10.0.1.10
prefix-length: 24
dhcp: false
dns-resolver:
config:
server:
- 168.63.129.16 # Azure DNS
routes:
config:
- destination: 0.0.0.0/0
next-hop-address: 10.0.1.1
next-hop-interface: eth0
EOF
# Generate the ISO
openshift-install agent create image --dir ~/okd-install/
# Output: ~/okd-install/agent.x86_64.iso

Step 5 — Boot the VM from the Agent ISO

# Upload ISO to Azure Storage
az storage account create --name okdiso$RANDOM --resource-group $RG --sku Standard_LRS
STORAGE_ACCOUNT=$(az storage account list -g $RG --query '[0].name' -o tsv)
az storage container create --name isos --account-name $STORAGE_ACCOUNT
az storage blob upload \
--account-name $STORAGE_ACCOUNT \
--container-name isos \
--name agent.iso \
--file ~/okd-install/agent.x86_64.iso
ISO_URL=$(az storage blob url \
--account-name $STORAGE_ACCOUNT \
--container-name isos \
--name agent.iso -o tsv)
# Attach as virtual DVD and set boot order
az vm disk attach \
--resource-group $RG \
--vm-name $VM_NAME \
--new --sku Premium_LRS \
--lun 1 --size-gb 2 # not needed — use virtual media approach below
# Easier: use az vm run-command or Serial Console to dd the ISO to disk
# OR use Azure's trusted launch + boot from ISO via az vm boot-diagnostics

Tip for Azure: The cleanest approach is to use a Gen1 VM and attach the ISO as a managed disk image, or use dd via serial console to write the ISO to a secondary disk and set it as the boot device in BIOS via Azure Serial Console.

# On the VM via Serial Console — write ISO to disk and reboot
sudo dd if=/dev/cdrom of=/dev/sda bs=512k status=progress
# OR if uploaded as blob, stream directly:
sudo curl -o /dev/sdb "$ISO_URL"
sudo reboot

Step 6 — DNS records (critical)

OKD requires these DNS records pointing to your VM’s public IP:

api.okd-sno.yourdomain.com → <public-ip>
*.apps.okd-sno.yourdomain.com → <public-ip>
PUBLIC_IP=$(az network public-ip show -g $RG -n okd-pip --query ipAddress -o tsv)
echo "Set these DNS A records to: $PUBLIC_IP"
echo " api.okd-sno.yourdomain.com"
echo " *.apps.okd-sno.yourdomain.com"

Step 7 — Monitor the install

# Watch installation progress from your local machine
openshift-install agent wait-for bootstrap-complete --dir ~/okd-install/ --log-level=info
# Then wait for full install completion
openshift-install agent wait-for install-complete --dir ~/okd-install/ --log-level=info
# Expected output when done:
# INFO Install complete!
# INFO To access the cluster as the system:admin user use 'export KUBECONFIG=...'
# INFO Access the OpenShift web-console: https://console-openshift-console.apps.okd-sno.yourdomain.com
# INFO Login to the console with user: kubeadmin, and password: XXXXX-XXXXX-XXXXX-XXXXX

Step 8 — Access the cluster

export KUBECONFIG=~/okd-install/auth/kubeconfig
# Verify
oc get nodes
# NAME STATUS ROLES AGE VERSION
# okd-sno Ready control-plane,master,worker 10m v1.28.x
oc get clusteroperators # all should be Available=True
oc whoami # system:admin
# Web console
# https://console-openshift-console.apps.okd-sno.yourdomain.com
# user: kubeadmin
# pass: cat ~/okd-install/auth/kubeadmin-password

Common Issues

ProblemFix
Bootstrap never completesCheck DNS — api.* record is the most common miss
Pods stuck PendingSNO has no workers — ensure replicas: 0 for compute
CrashLoopBackOff on etcdVM has < 16 GB RAM or disk I/O too slow (use Premium SSD)
Console unreachableNSG missing port 443 or *.apps wildcard DNS not set
Clock skew errorsSync VM time — Azure VMs can drift during install

Total install time: ~45–60 minutes after the VM boots from the ISO. The bulk of that is the cluster operators coming up one by one.

Understanding OKD vs OCP: Key Differences Explained

OKD (officially the Community Distribution of Kubernetes) is the upstream, open-source community edition of Red Hat OpenShift.

To put it in perspective using the open-source ecosystem model:

  • Fedora is the upstream testing ground for Red Hat Enterprise Linux (RHEL).
  • OKD is the upstream testing ground for Red Hat OpenShift Container Platform (OCP).

OKD contains nearly all the same architectural features, consoles, operators, and CLI tools as the commercial enterprise OpenShift platform, but it is entirely community-driven, free to use, and does not require commercial Red Hat licensing.

1. Architectural Differences: OKD vs. OCP

While the user interface and developer workflows are identical, the underlying operating system and support mechanics differ fundamentally.

Operating System Foundation
  • OpenShift OCP: Built strictly on top of Red Hat Enterprise Linux CoreOS (RHCOS), which requires a commercial RHEL subscription ecosystem.
  • OKD: Built on top of Fedora CoreOS (FCOS). FCOS is a minimal, monolithic, container-optimized operating system that features automated remote updates and uses Ignition files for declarative provisioning, but is completely free and community-supported.

Release Cadence & Stability

Because OKD is the upstream pipeline, new versions of Kubernetes, the OpenShift Web Console, and core operators land in OKD first. Once those features are tested, hardened, and proven stable by the community, they are pulled down, bundled, and officially released into the commercial OpenShift OCP codebase.

2. Core Pillars Shared with OpenShift

If you deploy OKD, you are getting an enterprise-grade application platform out of the box, rather than the “assemble-it-yourself” experience of native vanilla Kubernetes:

The Operator Framework & Lifecycle Automation

Like OCP, OKD is entirely managed by operators. It utilizes the Cluster Version Operator (CVO) to manage over-the-air platform updates. When a new release drops, the control plane automates its own component updates, node operating system upgrades, and health validations with a single click.

Developer-Centric Experience

OKD includes the identical, highly praised OpenShift Web Console. Developers get access to the “Developer Perspective,” complete with visual topology graphs, built-in pipelines, and automated application containerization tools (like Source-to-Image / S2I) that bypass the need to manually write Dockerfiles.

Embedded OAuth & Security

Vanilla Kubernetes requires external reverse proxies to handle enterprise identity validation. OKD features the built-in OpenShift OAuth Server, allowing administrators to secure cluster access via OIDC, LDAP, or GitHub authentication paths straight out of the box.

3. When should you use OKD instead of OCP?
Operational ScenarioChoose OKD (Community)Choose OpenShift OCP (Commercial)
Financial BudgetFree ($0): Ideal for home labs, startups, universities, and non-production testing environments.Paid Subscription: Priced per core/socket; built for enterprise budgets.
Technical SupportCommunity-Led: Relies on GitHub Issues, Slack channels, and public forums for troubleshooting.Red Hat Support: Backed by 24/7/365 production-grade SLAs and direct access to Red Hat SRE teams.
Compliance & HardeningExperimental: Fast feature release cadence; contains newer, occasionally untested cutting-edge code.Enterprise-Vetted: Fully certified for strict regulatory compliance environments (FIPS, PCI-DSS, HIPAA).

In summary, OKD is the perfect platform if you want to learn the OpenShift ecosystem, build a high-performance Kubernetes home lab, or run an engineering environment without paying enterprise software licensing fees—all while utilizing the exact same declarative workflows used by Fortune 500 engineering teams.

Master OpenShift: Top Interview Questions & Answers

To help you ace a senior-level Red Hat OpenShift Container Platform (OCP) interview, you need to be prepared for deep architectural questions, scenario-based troubleshooting, and Day-2 operational challenges.

Here is a compilation of high-impact OCP interview questions, categorized by domain, complete with the “Architect-Level” answers interviewers look for.

1. Architecture & Control Plane Internals

Q1: What happens under the hood when you run an OpenShift cluster upgrade? How does it differ from upstream Kubernetes?
  • The Expected Answer: Upstream Kubernetes requires manual, step-by-step updates of binaries (kubeadm, etcd, kubelet) across nodes. OpenShift automates this entirely via the Cluster Version Operator (CVO) and the Machine Config Operator (MCO).
  • When an upgrade is triggered, the CVO updates the cluster’s internal operators in a strict dependency graph. The MCO then generates new OS boot images or configurations (Ignition files) for the Red Hat Enterprise Linux CoreOS (RHCOS) nodes. Worker nodes are gracefully drained one by one, cordoned, updated at the OS level, rebooted, and uncordoned without application downtime.
Q2: How does OpenShift manage node configurations declaratively?
  • The Expected Answer: OpenShift uses the Machine Config Operator (MCO). You do not SSH into RHCOS nodes to change settings. Instead, you create a MachineConfig or a Tuned CRD. The MCO applies these changes by updating the underlying Ignition files, writing files to disk, or modifying kernel parameters, and handles rolling reboots across the designated Machine Config Pools (e.g., workers or masters) if required.

2. Networking & Traffic Management

Q3: Explain the difference between an OpenShift Route and a standard Kubernetes Ingress.
  • The Expected Answer: A Route is an OpenShift-native Custom Resource (CRD) created long before Kubernetes standardized the Ingress object. It is managed by the OpenShift Ingress Controller (powered by HAProxy). Routes support advanced features out-of-the-box like explicit FQDN configurations, split-traffic split weights for canary deployments, and simple TLS edge/passthrough/re-encryption parameters without needing complex annotation syntax required by generic Ingress controllers.
Q4: What is the purpose of the Multus CNI in OpenShift, and when would you architect a solution around it?
  • The Expected Answer: By default, a Kubernetes pod only has one network interface connected to the cluster’s internal overlay network (OVNKubernetes). Multus CNI is a meta-plugin that allows a pod to attach to multiple network interfaces.
  • This is critical for telecommunications (NFV workloads), low-latency databases, or legacy applications that require one interface for standard cluster service communication and a secondary, raw interface mapped directly to a physical corporate VLAN or storage network (via SR-IOV or Macvlan).

3. Performance & Day-2 Operations

Q5: If an etcd metric indicates that disk peer-to-peer response times or commit latencies are spiking, what are the architectural implications and how do you remediate it?
  • The Expected Answer: Spiking etcd latency risks a cluster split-brain or control plane panic, as the Raft consensus engine relies on strict, rapid disk synchronization. If latencies cross thresholds, control plane components lose connection to state.
  • Remediation: First, ensure etcd is backed by dedicated, low-latency NVMe/SSD storage (at least 500-1000 sustained IOPS). Second, run a proactive etcd defragmentation script across control plane pods to clear dead space. Third, implement proper ResourceQuotas to stop applications from spamming the API server with ephemeral object writes (like excessive ConfigMaps or build histories).
Q6: How do you optimize OpenShift for real-time or ultra-low-latency workloads?
  • The Expected Answer: I use the Node Tuning Operator (NTO) and declare a PerformanceProfile. This allows me to implement:
    • CPU Pinning/Isolation: Dedicating specific CPU cores strictly to application workloads while reserving cores 0-3 for OS and Kubelet overhead.
    • HugePages: Allocating 1G or 2M memory chunks to prevent the Linux kernel from wasting cycles on translation lookaside buffer (TLB) lookups.
    • Real-time Kernel (kernel-rt): Enabling the real-time kernel extensions built into RHCOS to eliminate microsecond-level scheduling jitter.

4. Security & Fleet Governance

Q7: What is Red Hat Advanced Cluster Management (ACM), and how does it manage application delivery at scale?
  • The Expected Answer: ACM is a multi-cluster control plane running on a Hub-and-Spoke model. It manages cluster lifecycles, configuration compliance, and application routing across a hybrid-cloud fleet.
  • For application delivery, ACM utilizes Placement Rules based on labels. Instead of deploying an app to a single cluster, you tell ACM: “Deploy this payload to all clusters labeled environment=production and region=eu.” It hooks directly into GitOps tools like ArgoCD to orchestrate application rollouts automatically when new clusters are spun up or imported.
Q8: How do you enforce a Zero-Trust architecture across developer-facing namespaces?

The Expected Answer:

  • 1. Authentication: Bind OpenShift OAuth to a corporate OIDC provider (like Okta/Entra ID) with MFA active.
  • 2. Authorization: Implement strict RBAC, eliminating cluster-admin roles and enforcing localized RoleBindings per tenant namespace.
  • 3. Network Isolation: Apply a default-deny-all NetworkPolicy at the namespace boundary, explicitly whitelisting only known ingress/egress service lines.
  • 4. Runtime Security: Enforce the restricted Pod Security Admission (PSA) profile to prevent containers from running as root or accessing host IPC spaces.
Interview Technique Tip:

When answering these, use the STAR Method (Situation, Task, Action, Result) whenever possible. Don’t just explain what the component is—explain a real scenario where you configured or troubleshot it to save money, reduce latency, or stop a security incident.

Cloud-Native Solutions for Legacy Systems Challenges

Modernizing legacy infrastructure into cloud-native platforms is rarely a simple “lift-and-shift” operation. It requires a strategic combination of application refactoring, database modernization, and platform re-engineering.

Below are three architectural patterns detailing how real-world enterprises modernise their infrastructure to solve critical scaling, security, and operational bottlenecks.

Example 1: The Retail Monolith-to-Microservices Migration

The Legacy State

A major global e-commerce retailer processed all transactions through a massive, monolithic Java application running on bare-metal servers.

  • The Bottleneck: During high-traffic events (like Black Friday), scaling the application meant copying the entire multi-gigabyte monolith onto new hardware.
  • The Risk: A bug in the review system could crash the entire checkout pipeline, causing catastrophic revenue drops.
The Modernized Architecture

The engineering team decoupled the monolith into containerized microservices (Inventory, Checkout, Reviews) running on a managed Red Hat OpenShift (OCP) platform.

  • Traffic Routing: They deployed an OpenShift Service Mesh (Istio) to manage internal microservice communication. This enabled Canary Deployments, allowing them to route just 5% of live traffic to a new version of the Checkout service to test stability before a full rollout.
  • Observability: They implemented Jaeger and OpenTelemetry (OTel). When a user experienced a slow checkout, engineers used distributed tracing to see exactly which microservice or database query was causing the latency spike.
  • The Result: The retailer reduced deployment frequencies from once a month to multiple times a day, and scaled individual microservices independently within milliseconds during flash sales.

Example 2: Financial Services Hybrid-Cloud & Zero-Trust Lockdowns

The Legacy State

A retail banking institution operated dozens of standalone Kubernetes clusters spread across on-premises VMware farms and public cloud infrastructure (AWS).

  • The Bottleneck: “Cluster Sprawl.” Central platform teams had no clear visibility into what versions were running where, and developers were routinely deploying insecure configurations.
  • The Risk: Strict regulatory frameworks (PCI-DSS and HIPAA) risked being violated due to manual drift in network policies and local admin access.
The Modernized Architecture

The bank implemented a federated Hub-and-Spoke fleet management model to enforce standard enterprise compliance.

  • Centralized Fleet Governance: They deployed Red Hat Advanced Cluster Management (ACM) on a central control plane. ACM used Policy-as-Code to automatically push down identical security policies to all remote clusters. If a developer deleted a mandatory security constraint on an AWS spoke, ACM instantly recreated it (Self-Healing).
  • Zero-Trust Identity Integration: They eliminated local static bootstrap credentials by integrating OpenShift’s OAuth layers with their corporate OIDC provider (Okta), enforcing multi-factor authentication (MFA) for command-line (oc login) and web console access.
  • Runtime Hardening: They deployed Red Hat Advanced Cluster Security (ACS / StackRox). ACS acted as an admission controller, actively blocking any deployment manifest that attempted to run containers as root or expose unauthorized network paths.
  • The Result: The security team achieved continuous compliance auditing, turning a weeks-long manual regulatory audit process into an automated, real-time dashboard visualization.

Example 3: Legacy Database & VM Coexistence at a Telecom Giant

The Legacy State

A telecommunications provider built a modern, containerized web interface for its customers, but the application relied on heavy, stateful backend processing workloads and legacy Windows/Linux virtual machines (VMs).

  • The Bottleneck: The team was forced to split their operational workflows down the middle: developers managed containers via GitOps, while the infrastructure team managed the legacy VMs using old-school hypervisors (like VMware vSphere).
  • The Risk: Maintaining two entirely separate infrastructure silos doubled licensing fees, hardware footprints, and operational complexity.
The Modernized Architecture

Instead of wasting years completely rewriting the legacy VM applications into containers, the telecom giant chose a hyperconverged approach by deploying OpenShift Virtualization.

  • Unified Pod Architecture: They imported their legacy RHEL and Windows VMs straight into OpenShift using the KubeVirt engine. Under the hood, the virtual machines were wrapped inside standard Kubernetes pods, passing bare-metal hardware extensions straight down to the KVM/QEMU layers.
  • Advanced Networking via Multus: Many legacy VMs had hardcoded IP schemas that could not exist on a standard container overlay network. Engineers used the Multus CNI to attach two network interfaces to the VM pod: one to talk internally to the new microservices, and a secondary bridge interface mapping directly to a physical corporate VLAN.
  • Unified Storage: They migrated the virtual disks onto OpenShift Data Foundation (ODF / powered by Ceph) using high-performance, persistent ReadWriteMany (RWX) block storage classes. This allowed the platform to execute live migrations, shifting active virtual machines across different physical nodes with zero downtime during hardware maintenance.
  • The Result: The telecom provider eliminated their standalone hypervisor licensing fees, unified their engineering teams under a single GitOps pipeline, and monitored both containers and virtual machines using a singular Prometheus and Thanos telemetry ecosystem.

Kubernetes kubectl apply Process Explained

When you run kubectl apply -f <file.yaml>, here’s what happens step by step:

1. Client-side (kubectl)

  • kubectl reads and parses the YAML/JSON manifest
  • It serializes it and sends an HTTP PATCH (or POST if new) request to the Kubernetes API server

2. API Server receives the request

  • Authentication — is the caller who they say they are? (cert, token, OIDC)
  • Authorization — does this user/serviceaccount have RBAC permission to create/update this resource?
  • Admission Controllers — the request passes through mutating then validating webhooks (e.g. OPA/Gatekeeper can reject it here, cert-manager webhooks can mutate it, Pod Security Admission enforces SCCs/PSA)
  • Schema validation — does the object match the CRD or built-in schema?

3. Persisted to etcd

  • Once approved, the desired state is written to etcd — the cluster’s source of truth
  • At this point kubectl apply returns success to you

4. Controllers react (the reconciliation loop)

  • The relevant controller (Deployment controller, ReplicaSet controller, StatefulSet controller, etc.) is watching etcd via the API server
  • It detects the delta between desired state (what you just wrote) and current state (what’s running)
  • It acts to close that gap — e.g. creates Pods, updates a ReplicaSet

5. Scheduler

  • New/unscheduled Pods are picked up by the kube-scheduler
  • It evaluates node selectors, taints/tolerations, affinity rules, resource requests, and picks the best node
  • It writes the node assignment back to etcd

6. kubelet on the target node

  • The kubelet on the assigned node watches for Pods bound to it
  • It calls the container runtime (containerd / CRI-O) to pull images and start containers
  • It sets up volumes, mounts secrets/configmaps, configures liveness/readiness probes
  • It reports Pod status back to the API server

7. kube-proxy / CNI

  • If a Service was part of your manifest, kube-proxy updates iptables/ipvs rules on all nodes
  • The CNI plugin (OVN-Kubernetes, Calico, Cilium, etc.) wires up the Pod network and applies NetworkPolicies

The key mental model is declarative reconciliation — you describe what you want, and Kubernetes continuously works to make reality match that description. Every controller runs an infinite loop: observe → diff → act.

Mastering Kubernetes: Understanding Control Plane Mechanics

To truly master Kubernetes and Red Hat OpenShift, you have to look past the YAML manifests and understand the underlying mechanics of the control plane, the data plane, and how Red Hat overlays enterprise-grade security and automation onto upstream Kubernetes.

Here is a deep dive into the internal machinery that powers these platforms.

1. Upstream Kubernetes Control Plane Internals

The Kubernetes control plane is a distributed system that manages the global state of your cluster. It operates on a continuous reconciliation loop (Current State vs. Desired State).

etcd: The Distributed Truth Engine
  • The Mechanics: etcd is a strongly consistent, distributed key-value store using the Raft Consensus Algorithm. Every single configuration, pod status, and secret lives here.
  • The Reality: The API server is the only component allowed to talk directly to etcd. All other components must query the API server.
  • Performance Trap: etcd writes sequentially to disk and relies heavily on fast disk fsync times. If your underlying storage IOPS drop, Raft leader elections will fail, causing the entire cluster control plane to crash.
kube-apiserver: The Gatekeeper

The API server is a stateless REST engine that processes cluster requests. When you run kubectl apply -f, the API server processes the request through three distinct internal phases:

  1. Authentication & Authorization: Checks who you are (via Client Certificates, Webhooks, or OIDC tokens) and what you can do (RBAC roles).
  2. Mutating Admission Controllers: Modifies the request object on the fly (e.g., injecting default storage classes or sidecar proxies like Istio).
  3. Validating Admission Controllers: Evaluates the finalized object against structural safety schemas. If it passes, the API server serializes the data and commits it to etcd.
kube-scheduler: The Placement Engine

The scheduler’s sole job is to watch for newly created Pods that have no nodeName assigned, select the optimal node for them, and bind them. It evaluates nodes using a two-stage process:

  • Filtering (Predicates): Knocks out nodes that don’t match the pod’s requirements (e.g., insufficient CPU/RAM, unmatched nodeSelector, or disk/port conflicts).
  • Scoring (Priorities): Ranks the remaining nodes based on optimization rules (e.g., balancing resource utilization, keeping pods from the same deployment spread across different availability zones via anti-affinity rules).
kube-controller-manager: The Orchestrator

This is a collection of background continuous loops wrapped into a single binary. It runs the DeploymentController, StatefulSetController, NodeController, and others. Each controller watches the API server for changes to its assigned resource type, detects when reality deviates from your desired YAML declaration, and fires commands to fix it.

2. Worker Node Data Plane Internals

The worker nodes execute your actual containers. Three core components handle the heavy lifting:

Kubelet: The Node Captain

The kubelet is an agent that runs directly on the bare-metal or virtual machine operating system. It watches the API server for PodSpecs assigned to its specific node.

  • It interacts with the local runtime via the Container Runtime Interface (CRI) to start or stop containers.
  • It performs continuous health monitoring (liveness and readiness probes) on running pods and reports node status back to the API server.
Container Runtime (CRI-O / containerd)

Modern Kubernetes does not use Docker directly. It relies on lightweight runtimes compliant with the Open Container Initiative (OCI). OpenShift standardizes on CRI-O, while upstream Kubernetes frequently uses containerd. The runtime pulls images, configures cgroups (resource limits), and configures namespaces (isolation boundaries) at the Linux kernel level.

Kube-Proxy: The Traffic Director

kube-proxy manages network routing rules on each node to fulfill the Kubernetes Service abstraction. Depending on your configuration, it manipulates packet routing in one of two ways:

  • IPTables Mode (Legacy): Appends sequential firewall rules to the node’s Linux network stack. While highly reliable, it suffers from scaling bottlenecks when thousands of services exist because every packet must traverse long, sequential rule lists.
  • IPVS Mode / eBPF: Utilizes Linux Virtual Server hashing algorithms or high-performance eBPF (Extended Berkeley Packet Filter) kernel hooks to route packets at near-instant, constant speed ($O(1)$ complexity) regardless of cluster size.

3. The OpenShift Structural Transformation

Red Hat OpenShift is not a fork of Kubernetes; it is a highly opinionated packaging of upstream Kubernetes, hard-coded to run exclusively on top of Red Hat Enterprise Linux CoreOS (RHCOS).

The Operator Framework: Automated Day-2 Operations

In native Kubernetes, upgrading a cluster requires manually upgrading etcd, updating API server binaries, and migrating network plugins. OpenShift automates this via the Cluster Version Operator (CVO) and specific component operators.

  • Every foundational component of OpenShift (DNS, Ingress, Monitoring, Storage) is controlled by an internal Operator.
  • To upgrade an OpenShift cluster, the CVO changes a single target image tag. The internal operators see this, orchestrate their own database migrations, gracefully drain worker nodes, update the host OS under the hood, and verify component health completely automatically.
Enterprise Identity & Integration

Upstream Kubernetes contains no built-in user database; it relies entirely on administrators setting up complex external authentication proxies. OpenShift includes a native, built-in OAuth Server. Out of the box, it provides a unified login mechanism that bridges cluster CLI access (oc login) and the visual Web Console dashboard directly into enterprise directories via OIDC, LDAP, or Keystone.

4. Deep-Dive Networking Comparison: Upstream vs. OCP

Kubernetes mandates that every pod must receive a unique IP address and be able to communicate with any other pod across the cluster without NAT. How this is executed depends entirely on the Container Network Interface (CNI) plugin.

Upstream Kubernetes (Calico / Flannel / Cilium)

Upstream allows you to select your own networking provider. Historically, implementations relied on simple Overlay Networks using VXLAN or Geneve encapsulation, which wraps pod-to-pod packets inside standard UDP host packets. While highly portable, this introduces a performance tax due to the packet encapsulation/decapsulation overhead on the node CPU.

OpenShift: OVNKubernetes CNI

OpenShift standardizes on OVNKubernetes, an enterprise-grade CNI built on top of Open Virtual Network (OVN) and Open vSwitch (OVS).

  • Native Network Policies: It enforces highly performant network access control lists (ACLs) directly inside the OVS kernel space, preventing rogue pods from executing lateral network discovery attacks.
  • Egress IPs: It provides native configuration to assign static, public egress IPs to specific namespaces. This allows legacy corporate firewalls outside the cluster to whitelist traffic originating from specific container microservices, which is historically difficult with standard, volatile Kubernetes pod routing.
  • Hybrid Cloud Connectivity via Submariner: Through OVN integrations, OpenShift can leverage Submariner to securely map and route traffic across completely different physical clouds, allowing a pod in an AWS cluster to communicate natively with a pod on an on-premises VMware cluster using encrypted, private IP tunnels.

Virtualization vs Containerization: Key Tradeoffs Explained

When designing modern infrastructure, the choice between Virtualization (VMs) and Containerization (Containers) isn’t about which technology is better—it’s about understanding where you want to draw your boundary lines in the software stack.

The fundamental difference lies in what they abstract: Virtualization abstracts physical hardware, while containerization abstracts the operating system kernel.

The Structural Difference

To understand the tradeoffs, you must first look at how they sit on physical hardware:

  • Virtualization (VMs): A physical server runs a host OS and a Hypervisor (like VMware ESXi or KVM). The hypervisor carves up the physical CPU, memory, and storage to create completely isolated Guest Operating Systems. Each VM runs its own full, heavy instance of Linux or Windows.
  • Containerization: A physical or virtual server runs a single Host Operating System and a container engine (like Docker or CRI-O). Containers running on that host share the underlying host kernel directly. They are simply isolated processes running on the same OS, walled off from each other using Linux kernel features like namespaces and cgroups.

The Core Tradeoffs

Because of these structural differences, choosing one over the other forces you to balance four critical engineering dimensions: Speed/Efficiency, Isolation/Security, Portability, and Legacy Compatibility.

1. Speed, Resource Overhead, and Efficiency
  • The VM Tradeoff (Heavy & Slow): Because every VM boots a full guest operating system, it carries massive overhead. A blank VM can easily consume 1GB to 2GB of RAM just to keep its OS alive before your application even starts. Boot times are measured in minutes because the virtual machine has to go through a full virtual BIOS check and OS initialization phase.
  • The Container Tradeoff (Light & Instant): Containers share the host kernel, meaning they carry virtually zero OS overhead. A containerized application only consumes the exact memory required by its application process. Because there is no OS to boot, containers start in milliseconds. You can easily bin-pack hundreds of containers onto a single physical server where you could only fit a dozen VMs.
2. Isolation and Security Posture
  • The VM Tradeoff (Strong Hard Isolation): Virtualization provides a highly secure boundary. If an attacker compromises an application inside a VM, they are still trapped inside that virtual guest OS. Breaking out of a VM requires exploiting the hypervisor itself, which is incredibly difficult. This makes VMs the industry standard for untrusted code execution or multi-tenant cloud environments.
  • The Container Tradeoff (Soft Process Isolation): Containers offer weaker isolation. Because every container shares the same host kernel, a kernel-level vulnerability (a flaw in the underlying Linux host OS) can potentially allow an attacker to break out of the container and gain root access to the entire physical host machine, compromising every other container sharing that server.
3. Portability and Configuration Drift
  • The VM Tradeoff (Environmentally Bound): Moving a virtual machine across different hypervisors (e.g., from VMware on-premises to AWS EC2) is notoriously painful. It often requires converting the virtual disk formats (VMDK to AMI) and adjusting network drivers. VMs are also prone to “configuration drift,” where manual patches over time make the OS snowflake-like and impossible to replicate exactly.
  • The Container Tradeoff (Absolute Portability): Containers are built on immutable, declarative engine images (Dockerfiles). If a container runs on your local laptop, it is guaranteed to run exactly the same way in a production Kubernetes cluster, regardless of whether that cluster is running on bare-metal hardware or inside Google Cloud.
4. Application Architecture and Legacy Support
  • The VM Tradeoff (Monolith Friendly): Legacy enterprise applications (like an old SAP system, a massive Oracle Database, or Windows .NET Framework 4.5 apps) expect deep, permanent hooks into an operating system registry, local storage paths, and specific kernel modules. VMs are perfectly suited for these heavy, stateful, traditional monolithic architectures.
  • The Container Tradeoff (Microservice Native): Containers are designed to be ephemeral (disposable). They are built for stateless, modern microservices architectures where applications can be torn down and scaled up instantly to handle web traffic spikes. Forcing a massive, stateful legacy legacy application into a container often breaks the app or introduces massive configuration complexity.

Architectural Summary Matrix

Engineering DimensionVirtualization (VMs)Containerization (Containers)
Primary AbstractionHardware Layer (CPU, RAM, Disks)Operating System Kernel
Resource FootprintGigabytes per instance (Heavy)Megabytes per instance (Lightweight)
Startup PerformanceMinutes (Full OS Boot sequence)Milliseconds (Standard process execution)
Security BoundaryHard Isolation (Hypervisor boundary)Soft Isolation (Shared host kernel space)
Lifecycle StateStateful, long-lived, persistentEphemeral, stateless, easily disposable
Best Used ForMonoliths, traditional databases, Windows legacy, strict multi-tenant isolationCloud-native microservices, CI/CD pipelines, high-density scale-out architectures

The Modern Convergence: Hyperconverged Platforms

Historically, engineering teams treated this as a binary choice: you either ran a VMware farm for your VMs or a Kubernetes cluster for your containers.

Today, enterprise architectures are converging. Modern cloud-native platforms use frameworks like KubeVirt (OpenShift Virtualization) to run legacy virtual machines inside containers. This allows organizations to get the strong isolation and legacy support of a VM, while managing it with the declarative, fast, and automated GitOps workflows originally built for containers.

Designing Legacy Virtual Machine Platforms in OpenShift

Designing a platform to run legacy virtual machines (VMs) natively inside Red Hat OpenShift is accomplished using OpenShift Virtualization.

OpenShift Virtualization is built on the upstream KubeVirt open-source project. It allows you to run, manage, and orchestrate standard virtual machines (Windows, RHEL, Ubuntu) side-by-side with containerized workloads on the exact same Kubernetes platform, using the same compute nodes, storage structures, and network definitions.

1. Architectural Overview

OpenShift Virtualization does not run a separate hypervisor layer like VMware ESXi or Red Hat Virtualization (RHV) alongside the cluster. Instead, it converts Kubernetes pods into hypervisors.

When you launch a VM inside OpenShift:

  • The control plane spins up a standard Kubernetes pod running a specialized wrapper process called virt-launcher.
  • Inside that pod, a standard Linux KVM (Kernel-based Virtual Machine) and QEMU instance is initialized.
  • The legacy virtual machine boots inside that container container-namespace layer.

Because the VM is running inside a standard pod framework, it inherits all native Kubernetes benefits out-of-the-box: declarative YAML management, service routing, resource scheduling, network policies, and cluster monitoring.

2. Infrastructure Design Requirements

To build a production-grade OpenShift Virtualization platform, your underlying bare-metal hardware and operating system layers must be architected for high-performance virtualization.

A. Compute Infrastructure (Bare-Metal vs. Cloud)
  • Bare-Metal Nodes (Recommended): For maximum performance, worker nodes must be physical bare-metal servers. This allows OpenShift’s Red Hat Enterprise Linux CoreOS (RHCOS) layer to pass bare-metal Intel VT-x or AMD-V hardware virtualization extensions directly down to the VM pods.
  • Nested Virtualization: If you are running OpenShift inside a cloud provider (like AWS, Azure, or GCP), you must utilize specific instance types that support nested hardware virtualization (e.g., AWS metal instances or Azure Dv3/Ev3 series).
B. High-Performance Storage Grid

Virtual machines are highly sensitive to disk I/O latency. Your storage backend must support specific access modes to enable advanced lifecycle capabilities like Live Migration.

  • Storage Provider: Deploy Red Hat OpenShift Data Foundation (ODF / Powered by Ceph) as your primary storage engine.
  • Access Modes: You must use storage classes configured for ReadWriteMany (RWX) block storage. This allows two separate cluster nodes to attach to the exact same virtual disk file simultaneously during migration events.

3. Platform Deployment: Step-by-Step Installation

Step 1: Prepare the Node Configuration via MachineConfig

Before installing the operator, ensure your bare-metal workers are optimized to host heavy virtual machine page files. Use a MachineConfig to configure the kernel if you require dedicated host tuning configurations, though the virtualization operator handles most hardware validation automatically.

Step 2: Install the OpenShift Virtualization Operator
  1. From the OpenShift Web Console, navigate to Operators -> OperatorHub.
  2. Search for OpenShift Virtualization and click Install.
  3. Accept the default namespace (openshift-cnv) and click Install.
Step 3: Initialize the Hyperconverged Cluster Control Plane

Once the operator pod is active, trigger the creation of the virtualization control plane by instantiating the HyperConverged custom resource:

YAML

apiVersion: hco.kubevirt.io/v1beta1
kind: HyperConverged
metadata:
name: kubevirt-hyperconverged
namespace: openshift-cnv
spec:
# Instructs the system to auto-tune VM workloads based on your cluster profile
workloadEvaluationFrequency: 1m

4. Declarative VM Blueprint Configuration

Once OpenShift Virtualization is initialized, you define a virtual machine exactly like any other Kubernetes resource using a VirtualMachine (VM) manifest file.

The blueprint below showcases a production-ready Windows/Linux legacy VM instance complete with explicit CPU topology mappings, persistent enterprise block storage, and dual network attachments:

YAML

apiVersion: kubevirt.io/v1
kind: VirtualMachine
metadata:
name: legacy-billing-app
namespace: finance-workloads
spec:
running: true # Ensures the VM boots immediately upon creation
template:
metadata:
labels:
kubevirt.io/domain: legacy-billing-app
spec:
domain:
cpu:
cores: 4 # Explicit virtual CPU core allocation
sockets: 1
threads: 1
resources:
requests:
memory: 8Gi # Memory footprint boundaries
devices:
disks:
- name: root-boot-disk
disk:
bus: virtio # Uses high-performance paravirtualized disk controllers
interfaces:
- name: default-pod-network
masquerade: {} # Primary cluster network interface
- name: corporate-vlan-nic
bridge: {} # Attaches secondary flat corporate network
volumes:
- name: root-boot-disk
persistentVolumeClaim:
claimName: billing-os-disk-pvc # Points to your enterprise ODF/Ceph storage disk
networks:
- name: default-pod-network
pod: {}
- name: corporate-vlan-nic
multus:
networkName: engineering-vlan-100 # Multi-NIC isolation via Multus CNI

5. Advanced Day-2 Platform Capabilities

Once your legacy VMs are running inside OpenShift, you gain access to cloud-native management paradigms that traditional hypervisors struggle to emulate easily.

A. Live Migration

If a physical bare-metal host node needs hardware maintenance or a kernel patch, OpenShift Virtualization can move running VMs to another physical node with zero downtime to the application.

Because the underlying disk volume is pinned to shared ReadWriteMany ODF/Ceph storage, OpenShift copies the live memory state over the cluster network fabric while the execution plane switches nodes dynamically. You can trigger this manually via the CLI:

Bash

oc virt migrate legacy-billing-app -n finance-workloads
B. Advanced Networking via Multus CNI

Legacy applications often have hardcoded IP schemas or require direct access to physical corporate VLANs. Standard Kubernetes pods are isolated behind an internal overlay network.

OpenShift solves this using the Multus CNI. Multus lets you attach multiple network interfaces directly to a single virtual machine pod. Interface 1 can connect to the standard internal cluster network to communicate with modern microservices, while Interface 2 bridges directly into a physical corporate VLAN (VLAN 100), retaining its static external IP infrastructure seamlessly.

C. Unified Operational Monitoring

Because the VM is running inside a pod wrapper, its telemetry automatically hooks into the platform’s native Prometheus and Thanos ecosystem. You can build unified Grafana dashboards that present CPU, memory, network packet drops, and disk IOPS metrics for container workloads and legacy virtual machines right alongside each other on a single pane of glass.