<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Cloud With Joey]]></title><description><![CDATA[Cloud With Joey]]></description><link>https://cloudwithjoey.com</link><image><url>https://cdn.hashnode.com/res/hashnode/image/upload/v1767604492280/d9933ce4-f064-4f50-a50d-959922a837ff.png</url><title>Cloud With Joey</title><link>https://cloudwithjoey.com</link></image><generator>RSS for Node</generator><lastBuildDate>Thu, 16 Apr 2026 19:41:23 GMT</lastBuildDate><atom:link href="https://cloudwithjoey.com/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Migrating VMware ESXi Workloads to OpenStack Using MigrateKit]]></title><description><![CDATA[This guide describes a practical, production-tested workflow to migrate virtual machines from VMware ESXi to OpenStack using MigrateKit — an open-source migration tool developed by VEXXHOST.
The approach focuses on:

Near-zero downtime

Full data int...]]></description><link>https://cloudwithjoey.com/migrating-vmware-esxi-workloads-to-openstack-using-migratekit</link><guid isPermaLink="true">https://cloudwithjoey.com/migrating-vmware-esxi-workloads-to-openstack-using-migratekit</guid><category><![CDATA[MigrateKit]]></category><category><![CDATA[vmware]]></category><category><![CDATA[openstack]]></category><category><![CDATA[migration]]></category><dc:creator><![CDATA[Joey Tran]]></dc:creator><pubDate>Fri, 31 Oct 2025 02:56:32 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1761879361482/c138bc24-746b-4782-9724-0643457d10ea.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>This guide describes a <strong>practical, production-tested workflow</strong> to migrate virtual machines from <strong>VMware ESXi to OpenStack</strong> using <strong>MigrateKit</strong> — an open-source migration tool developed by VEXXHOST.</p>
<p>The approach focuses on:</p>
<ul>
<li><p>Near-zero downtime</p>
</li>
<li><p>Full data integrity</p>
</li>
<li><p>Repeatable and automated execution</p>
</li>
</ul>
<hr />
<h2 id="heading-objectives">Objectives</h2>
<ul>
<li><p>Migrate virtual machines from VMware ESXi to OpenStack</p>
</li>
<li><p>Minimize service downtime (typically 5–10 minutes)</p>
</li>
<li><p>Preserve data integrity</p>
</li>
<li><p>Enable repeatable and automated migration runs</p>
</li>
</ul>
<hr />
<h2 id="heading-architecture-overview">Architecture Overview</h2>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1767687108801/d363d98b-b9ac-4fb0-9af3-8dff78a8bab1.png" alt class="image--center mx-auto" /></p>
<hr />
<h2 id="heading-prerequisites">Prerequisites</h2>
<h3 id="heading-migratekit-server">MigrateKit Server</h3>
<ul>
<li><p>OS: Ubuntu 22.04 LTS</p>
</li>
<li><p>Memory: minimum 4 GB</p>
</li>
<li><p>Disk: minimum 50 GB</p>
</li>
<li><p>Network access to both VMware and OpenStack endpoints</p>
</li>
</ul>
<h3 id="heading-vmware-vddk">VMware VDDK</h3>
<ul>
<li><p>Version: 8.0.3 or later</p>
</li>
<li><p>Download from VMware Developer Portal</p>
</li>
</ul>
<h3 id="heading-source-environment-vmware">Source Environment (VMware)</h3>
<ul>
<li><p>ESXi 6.7+ or vCenter-managed environment</p>
</li>
<li><p>Change Block Tracking (CBT) must be enabled</p>
</li>
</ul>
<h3 id="heading-target-environment-openstack">Target Environment (OpenStack)</h3>
<ul>
<li><p>OpenStack Bobcat (2023.2) or later</p>
</li>
<li><p>Required services: Cinder, Nova, Neutron</p>
</li>
</ul>
<hr />
<h2 id="heading-part-1-migratekit-server-setup">Part 1: MigrateKit Server Setup</h2>
<h3 id="heading-install-docker">Install Docker</h3>
<pre><code class="lang-bash">sudo apt update &amp;&amp; sudo apt upgrade -y
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
docker --version
</code></pre>
<h3 id="heading-install-vmware-vddk">Install VMware VDDK</h3>
<pre><code class="lang-bash">scp VMware-vix-disklib-8.0.3-*.tar.gz root@migratekit:/tmp/
ssh root@migratekit

<span class="hljs-built_in">cd</span> /tmp
tar -xzf VMware-vix-disklib-8.0.3-*.tar.gz
sudo mkdir -p /usr/lib64/vmware-vix-disklib
sudo cp -r vmware-vix-disklib-distrib/lib64/* /usr/lib64/vmware-vix-disklib/
ls -la /usr/lib64/vmware-vix-disklib/
</code></pre>
<h3 id="heading-configure-openstack-credentials">Configure OpenStack Credentials</h3>
<pre><code class="lang-bash">cat &gt; ~/openstack-credentials.env &lt;&lt; <span class="hljs-string">'EOF'</span>
<span class="hljs-built_in">export</span> OS_AUTH_URL=https://your-openstack.com:5000
<span class="hljs-built_in">export</span> OS_PROJECT_NAME=your-project
<span class="hljs-built_in">export</span> OS_PROJECT_ID=your-project-id
<span class="hljs-built_in">export</span> OS_USERNAME=your-username
<span class="hljs-built_in">export</span> OS_PASSWORD=your-password
<span class="hljs-built_in">export</span> OS_REGION_NAME=RegionOne
<span class="hljs-built_in">export</span> OS_INTERFACE=public
<span class="hljs-built_in">export</span> OS_IDENTITY_API_VERSION=3
<span class="hljs-built_in">export</span> OS_USER_DOMAIN_NAME=default
<span class="hljs-built_in">export</span> OS_PROJECT_DOMAIN_NAME=default
EOF

<span class="hljs-built_in">source</span> ~/openstack-credentials.env
</code></pre>
<p>Validate connectivity:</p>
<pre><code class="lang-bash">docker run --rm \
  --env-file &lt;(env | grep OS_) \
  python:3-slim bash -c \
  <span class="hljs-string">"pip install python-openstackclient &amp;&amp; openstack token issue"</span>
</code></pre>
<hr />
<h2 id="heading-part-2-preparing-the-vmware-source">Part 2: Preparing the VMware Source</h2>
<h3 id="heading-enable-change-block-tracking-cbt">Enable Change Block Tracking (CBT)</h3>
<pre><code class="lang-bash">ssh root@esxi-host
vim-cmd vmsvc/getallvms | grep your-vm-name
vim-cmd vmsvc/power.off &lt;VM_ID&gt;

vi /vmfs/volumes/datastore1/your-vm/your-vm.vmx
<span class="hljs-comment"># Add:</span>
ctkEnabled = <span class="hljs-string">"TRUE"</span>
scsi0:0.ctkEnabled = <span class="hljs-string">"TRUE"</span>

vim-cmd vmsvc/reload &lt;VM_ID&gt;
vim-cmd vmsvc/power.on &lt;VM_ID&gt;
</code></pre>
<hr />
<h2 id="heading-part-3-migration-workflow">Part 3: Migration Workflow</h2>
<h3 id="heading-phase-1-initial-full-sync">Phase 1: Initial Full Sync</h3>
<pre><code class="lang-bash">docker run -it --rm --privileged \
  --network host \
  -v /dev:/dev \
  -v /usr/lib64/vmware-vix-disklib/:/usr/lib64/vmware-vix-disklib:ro \
  --env-file &lt;(env | grep OS_) \
  ghcr.io/vexxhost/migratekit:main \
  migrate \
  --vmware-endpoint &lt;ESXI_IP&gt; \
  --vmware-username root \
  --vmware-password <span class="hljs-string">"&lt;ESXI_PASSWORD&gt;"</span> \
  --vmware-path /ha-datacenter/vm/&lt;VM_NAME&gt; \
  --debug
</code></pre>
<p>Expected output:</p>
<pre><code class="lang-plaintext">INFO[0001] Creating snapshot
INFO[0003] Volume created and set bootable
Full copy 100% (25 GiB, 533 MiB/s)
INFO[0061] Migration completed
</code></pre>
<h3 id="heading-phase-2-incremental-sync">Phase 2: Incremental Sync</h3>
<p>Re-run the <code>migrate</code> command to copy only changed blocks.<br />This phase can be repeated multiple times to reduce final cutover time.</p>
<h3 id="heading-phase-3-final-cutover">Phase 3: Final Cutover</h3>
<pre><code class="lang-bash">openstack network list
openstack subnet list

docker run -it --rm --privileged \
  --network host \
  -v /usr/lib64/vmware-vix-disklib/:/usr/lib64/vmware-vix-disklib:ro \
  --env-file &lt;(env | grep OS_) \
  ghcr.io/vexxhost/migratekit:main \
  cutover \
  --vmware-endpoint &lt;ESXI_IP&gt; \
  --vmware-username root \
  --vmware-password <span class="hljs-string">"&lt;ESXI_PASSWORD&gt;"</span> \
  --vmware-path /ha-datacenter/vm/&lt;VM_NAME&gt; \
  --flavor &lt;FLAVOR_ID&gt; \
  --network-mapping mac=&lt;MAC&gt;,network-id=&lt;NETWORK_ID&gt;,subnet-id=&lt;SUBNET_ID&gt; \
  --debug
</code></pre>
<p>Cutover sequence:</p>
<ol>
<li><p>Create Neutron port</p>
</li>
<li><p>Perform final incremental sync</p>
</li>
<li><p>Power off source VM</p>
</li>
<li><p>Create volume and Nova instance</p>
</li>
<li><p>Boot the migrated VM</p>
</li>
</ol>
<hr />
<h2 id="heading-verification">Verification</h2>
<pre><code class="lang-bash">openstack volume list
openstack server list
openstack console url show &lt;INSTANCE_NAME&gt;
ssh ubuntu@&lt;INSTANCE_IP&gt;
</code></pre>
<hr />
<h2 id="heading-troubleshooting">Troubleshooting</h2>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Issue</td><td>Cause</td><td>Resolution</td></tr>
</thead>
<tbody>
<tr>
<td>Authentication error</td><td>Domain variables misconfigured</td><td>Remove <code>OS_PROJECT_DOMAIN_ID</code> and <code>OS_USER_DOMAIN_ID</code></td></tr>
<tr>
<td>CBT not enabled</td><td>Missing CBT flags</td><td>Verify <code>.vmx</code> configuration</td></tr>
<tr>
<td>Network mapping failed</td><td>MAC mismatch</td><td>Validate VMware and Neutron mappings</td></tr>
<tr>
<td>Kernel panic on boot</td><td>Unsupported virtual hardware version</td><td>Use older <code>virtualHW.version</code></td></tr>
</tbody>
</table>
</div><hr />
<h2 id="heading-performance-observations">Performance Observations</h2>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Metric</td><td>Result</td></tr>
</thead>
<tbody>
<tr>
<td>Disk size</td><td>25 GB</td></tr>
<tr>
<td>Throughput</td><td>~533 MiB/s</td></tr>
<tr>
<td>Full sync time</td><td>~47 seconds</td></tr>
<tr>
<td>Downtime</td><td>5–10 minutes</td></tr>
<tr>
<td>Data loss</td><td>None</td></tr>
</tbody>
</table>
</div><hr />
<h2 id="heading-operational-best-practices">Operational Best Practices</h2>
<p><strong>Before migration</strong></p>
<ul>
<li><p>Test with non-production workloads</p>
</li>
<li><p>Enable CBT early</p>
</li>
<li><p>Maintain backups</p>
</li>
<li><p>Perform multiple sync cycles</p>
</li>
</ul>
<p><strong>During migration</strong></p>
<ul>
<li><p>Monitor network throughput</p>
</li>
<li><p>Keep source VM running until cutover</p>
</li>
<li><p>Review logs in debug mode</p>
</li>
</ul>
<p><strong>After migration</strong></p>
<ul>
<li><p>Validate application behavior</p>
</li>
<li><p>Update DNS and routing</p>
</li>
<li><p>Monitor system performance</p>
</li>
<li><p>Retain source VM temporarily for rollback</p>
</li>
</ul>
<hr />
<h2 id="heading-conclusion">Conclusion</h2>
<p>MigrateKit provides a <strong>clean and reliable migration path</strong> from VMware ESXi to OpenStack when Change Block Tracking is available.</p>
<p>Key strengths:</p>
<ul>
<li><p>Minimal downtime</p>
</li>
<li><p>Deterministic workflow</p>
</li>
<li><p>Open-source and production-ready</p>
</li>
</ul>
<p>Limitations:</p>
<ul>
<li><p>Requires CBT support</p>
</li>
<li><p>Dependent on ESXi API access</p>
</li>
<li><p>Network performance impacts total time</p>
</li>
</ul>
<hr />
<h2 id="heading-references">References</h2>
<ul>
<li><p>MigrateKit GitHub</p>
</li>
<li><p>VEXXHOST: Introducing MigrateKit</p>
</li>
<li><p>VMware VDDK Documentation</p>
</li>
<li><p>OpenStack Official Documentation</p>
</li>
</ul>
]]></content:encoded></item></channel></rss>