<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>VPC on Cosmin.us</title><link>https://cosmin.us/tags/vpc/</link><description>Recent content in VPC on Cosmin.us</description><generator>Hugo</generator><language>en-US</language><dc:creator>Cosmin Trif</dc:creator><lastBuildDate>Wed, 21 Oct 2026 08:20:00 +0000</lastBuildDate><atom:link href="https://cosmin.us/tags/vpc/index.xml" rel="self" type="application/rss+xml"/><item><title>One-Host Supervisor on VCF 9.1, Part 3: NSX VPC Networking Without Edges</title><link>https://cosmin.us/one-host-supervisor-vcf-9-1-part-3-nsx-vpc-without-edges/</link><pubDate>Wed, 21 Oct 2026 08:20:00 +0000</pubDate><dc:creator>Cosmin Trif</dc:creator><guid>https://cosmin.us/one-host-supervisor-vcf-9-1-part-3-nsx-vpc-without-edges/</guid><description>&lt;p&gt;In &lt;a href="https://cosmin.us/one-host-supervisor-vcf-9-1-part-2-vsan-esa-cluster/"&gt;Part 2&lt;/a&gt; we built the one-host cluster. Before we can enable a Supervisor on it, NSX needs a way to get VPC traffic in and out. My management domain has NSX with an overlay transport zone, but no edge cluster, no Tier-0 and no Tier-1. In VCF 9.1 that is fine: a Supervisor on VPC networking can use a distributed transit gateway and a small cluster of Virtual Network Appliances (VNAs) instead of edges.&lt;/p&gt;</description><content:encoded>&lt;p&gt;In &lt;a href="https://cosmin.us/one-host-supervisor-vcf-9-1-part-2-vsan-esa-cluster/"&gt;Part 2&lt;/a&gt; we built the one-host cluster. Before we can enable a Supervisor on it, NSX needs a way to get VPC traffic in and out. My management domain has NSX with an overlay transport zone, but no edge cluster, no Tier-0 and no Tier-1. In VCF 9.1 that is fine: a Supervisor on VPC networking can use a distributed transit gateway and a small cluster of Virtual Network Appliances (VNAs) instead of edges.&lt;/p&gt;&#10;&lt;p&gt;This post covers four new NSX objects and two changes to existing ones, in the order I made them.&lt;/p&gt;&#10;&lt;h2 id="how-it-fits-together"&gt;How it fits together&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Distributed VLAN connection:&lt;/strong&gt; connects NSX to one VLAN. The gateway of that VLAN lives on your router.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Transit gateway attachment:&lt;/strong&gt; attaches that VLAN connection to the project&amp;rsquo;s default transit gateway.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;External IP block:&lt;/strong&gt; the addresses NSX hands out for the Supervisor API VIP, SNAT and LoadBalancer services. I used a range inside the VLAN&amp;rsquo;s subnet, so the router reaches them directly with no routes to add.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;VNA cluster:&lt;/strong&gt; two appliances that give the VPCs NAT and load balancing. The VNA rides on the TEP network of the host it runs on, so it needs no network of its own beyond a management address. Two is the minimum (&lt;a href="https://vstellar.com/2026/07/vcf-9-1-home-lab-series-part-13-vna-cluster-for-distributed-connectivity/"&gt;vStellar&amp;rsquo;s VNA post&lt;/a&gt; covers the VNA in depth).&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;VPC connectivity profile&lt;/strong&gt; (a change to an existing object): tells every VPC in the project to use the VNA cluster as its service gateway and the external block for public addresses.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;The other change is a flag on the new cluster&amp;rsquo;s transport node collection, in Step 2.&lt;/p&gt;&#10;&lt;p&gt;We put the VNAs on the existing 4-host cluster, not on the GPU host. With the VNAs on two different hosts, one host going down does not take out both, and the GPU host keeps its resources for AI workloads.&lt;/p&gt;&#10;&lt;h2 id="what-i-needed-from-the-network"&gt;What I needed from the network&lt;/h2&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Item&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;My lab&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;VLAN for the distributed connection, trunked to the hosts of both clusters&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;VLAN 22&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Gateway of that VLAN on the router&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;10.1.7.129/25&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;External IP block, inside that subnet, gateway excluded&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;10.1.7.192/26&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Two management IPs for the VNAs, with forward and reverse DNS&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;10.1.1.178&lt;/code&gt;, &lt;code&gt;10.1.1.179&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;Holodeck&amp;rsquo;s router already had VLAN 22 with that gateway. At the customer, this table is what we handed to the network team.&lt;/p&gt;&#10;&lt;h2 id="step-1-check-the-transport-zone-and-the-span"&gt;Step 1: Check the transport zone and the span&lt;/h2&gt;&#10;&lt;p&gt;Two checks before any change. They catch the one mistake that breaks this design: the new cluster ending up on its own transport zone.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;The new cluster&amp;rsquo;s transport node profile must use the &lt;strong&gt;same overlay transport zone object&lt;/strong&gt; as the rest of the domain, not a new zone with the same name. Find the cluster&amp;rsquo;s transport node collection under &lt;code&gt;GET /policy/api/v1/infra/sites/default/enforcement-points/default/transport-node-collections&lt;/code&gt;, read its transport node profile, and compare the &lt;code&gt;transport_zone_id&lt;/code&gt; with the existing zone&amp;rsquo;s path.&lt;/li&gt;&#10;&lt;li&gt;The transport node collection must sit inside the span of the default transit gateway (&lt;code&gt;GET /policy/api/v1/orgs/default/projects/default/transit-gateways/default&lt;/code&gt;, field &lt;code&gt;span.span_path&lt;/code&gt;). A collection with no explicit &lt;code&gt;network_span_paths&lt;/code&gt; uses the default span.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;In my case both passed, because the cluster spec in Part 2 named the existing zone.&lt;/p&gt;&#10;&lt;h2 id="step-2-turn-on-nsx-for-dvpgs-on-the-new-cluster"&gt;Step 2: Turn on NSX for DVPGs on the new cluster&lt;/h2&gt;&#10;&lt;p&gt;Set &lt;code&gt;enable_nsx_on_dvpg&lt;/code&gt; to &lt;code&gt;true&lt;/code&gt; on the new cluster&amp;rsquo;s transport node collection. Read the whole object, change that one field and send it back:&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;PUT /policy/api/v1/infra/sites/default/enforcement-points/default/transport-node-collections/&amp;lt;id&amp;gt;&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="step-3-create-the-distributed-vlan-connection"&gt;Step 3: Create the distributed VLAN connection&lt;/h2&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;PUT /policy/api/v1/infra/distributed-vlan-connections/distributed-gw-mgmt-a&#10;&lt;/code&gt;&lt;/pre&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;resource_type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;DistributedVlanConnection&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;distributed-gw-mgmt-a&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;display_name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;distributed-gw-mgmt-a&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;gateway_addresses&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;10.1.7.129/25&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;],&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;vlan_id&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;22&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="step-4-attach-it-to-the-default-transit-gateway"&gt;Step 4: Attach it to the default transit gateway&lt;/h2&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;PATCH /policy/api/v1/orgs/default/projects/default/transit-gateways/default/attachments/dtgw-att-mgmt-02a&#10;&lt;/code&gt;&lt;/pre&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;connection_path&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;/infra/distributed-vlan-connections/distributed-gw-mgmt-a&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="step-5-create-the-external-ip-block"&gt;Step 5: Create the external IP block&lt;/h2&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;PATCH /policy/api/v1/infra/ip-blocks/dtgw-ext-mgmt-a&#10;&lt;/code&gt;&lt;/pre&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;display_name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;dtgw-ext-mgmt-a&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;cidr&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;10.1.7.192/26&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;visibility&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;EXTERNAL&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="step-6-deploy-the-vna-cluster"&gt;Step 6: Deploy the VNA cluster&lt;/h2&gt;&#10;&lt;p&gt;The VNA cluster goes in through a hierarchical PATCH on &lt;code&gt;/policy/api/v1/infra&lt;/code&gt;. These are the bodies from VMware&amp;rsquo;s Holodeck 9.1 toolkit, which is where I learned the shape. Both appliances go in the same PATCH, as two &lt;code&gt;ChildBaseNetworkAppliance&lt;/code&gt; entries in the same &lt;code&gt;children&lt;/code&gt; array. Below is the body with the first one. The second entry is the same apart from its &lt;code&gt;id&lt;/code&gt;, &lt;code&gt;display_name&lt;/code&gt;, &lt;code&gt;hostname&lt;/code&gt; and IP:&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;PATCH /policy/api/v1/infra?enforce_revision_check=true&#10;&lt;/code&gt;&lt;/pre&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;resource_type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Infra&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;children&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;resource_type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ChildResourceReference&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;default&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;target_type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Site&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;children&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;resource_type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ChildResourceReference&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;default&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;target_type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;EnforcementPoint&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;children&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;resource_type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ChildVirtualNetworkApplianceCluster&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;VirtualNetworkApplianceCluster&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;resource_type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;VirtualNetworkApplianceCluster&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;vna-cluster-mgmt-a&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;display_name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;vna-cluster-mgmt-a&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;appliance_form_factor&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;MEDIUM&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;children&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;resource_type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ChildBaseNetworkAppliance&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;BaseNetworkAppliance&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;resource_type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;VirtualNetworkAppliance&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;vna-mgmt-01a&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;display_name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;vna-mgmt-01a&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;hostname&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;vna-mgmt-01a.site-a.vcf.lab&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;credentials&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{},&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;vm_deployment_config&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;compute_manager_id&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;lt;compute manager id&amp;gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;cluster_or_resource_pool_id&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;lt;cluster moref, e.g. domain-c9&amp;gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;datastore_id&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;lt;datastore moref&amp;gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;management_interface&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;network_id&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;lt;management portgroup moref&amp;gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;ip_assignment_specs&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;ip_assignment_type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;StaticIpv4&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;management_port_subnets&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;ip_addresses&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;10.1.1.178&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;prefix_length&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;24&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;],&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;default_gateway&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;10.1.1.1&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The compute manager ID comes from &lt;code&gt;GET /api/v1/fabric/compute-managers&lt;/code&gt;. The cluster, datastore and portgroup IDs are vCenter morefs of the cluster the VNAs go on (for me, &lt;code&gt;cluster-mgmt-01a&lt;/code&gt;), its vSAN datastore and its management portgroup.&lt;/p&gt;&#10;&lt;p&gt;I left &lt;code&gt;credentials&lt;/code&gt; empty, so NSX generates the appliance passwords. I have not checked yet where to read them back, so find that out before you need a VNA console.&lt;/p&gt;&#10;&lt;p&gt;Watch the status:&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;GET /policy/api/v1/infra/sites/default/enforcement-points/default/virtual-network-appliance-clusters/vna-cluster-mgmt-a/status&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;In my case it went from &lt;code&gt;UNKNOWN&lt;/code&gt;, to &lt;code&gt;DEGRADED&lt;/code&gt; with both members &lt;code&gt;ADMIN_DOWN&lt;/code&gt;, to &lt;code&gt;UP&lt;/code&gt; with both members &lt;code&gt;UP&lt;/code&gt;, about 10 minutes after the PATCH.&lt;/p&gt;&#10;&lt;p&gt;Then keep the two VNAs on different hosts with a DRS rule:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$cl&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Get-Cluster&lt;/span&gt; &lt;span class="n"&gt;-Name&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;cluster-mgmt-01a&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;New-DrsRule&lt;/span&gt; &lt;span class="n"&gt;-Cluster&lt;/span&gt; &lt;span class="nv"&gt;$cl&lt;/span&gt; &lt;span class="n"&gt;-Name&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;vna-mgmt-a-separate&amp;#39;&lt;/span&gt; &lt;span class="n"&gt;-KeepTogether&lt;/span&gt; &lt;span class="vm"&gt;$false&lt;/span&gt; &lt;span class="n"&gt;-Enabled&lt;/span&gt; &lt;span class="vm"&gt;$true&lt;/span&gt; &lt;span class="n"&gt;-VM&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Get-VM&lt;/span&gt; &lt;span class="n"&gt;-Location&lt;/span&gt; &lt;span class="nv"&gt;$cl&lt;/span&gt; &lt;span class="n"&gt;-Name&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;vna-mgmt-01a&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;vna-mgmt-02a&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Mine ended up on &lt;code&gt;esx-01a&lt;/code&gt; and &lt;code&gt;esx-03a&lt;/code&gt;.&lt;/p&gt;&#10;&lt;h2 id="step-7-point-the-vpc-connectivity-profile-at-the-vnas"&gt;Step 7: Point the VPC connectivity profile at the VNAs&lt;/h2&gt;&#10;&lt;p&gt;Read the project&amp;rsquo;s default VPC connectivity profile, add the service gateway and the external block, and PATCH it back:&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;GET /policy/api/v1/orgs/default/projects/default/vpc-connectivity-profiles/default&#10;PATCH /policy/api/v1/orgs/default/projects/default/vpc-connectivity-profiles/default&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The two fields that change:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;service_gateway&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;enable&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;nat_config&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;enable_default_snat&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;edge_cluster_paths&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;/infra/sites/default/enforcement-points/default/virtual-network-appliance-clusters/vna-cluster-mgmt-a&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;external_ip_blocks&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;/infra/ip-blocks/dtgw-ext-mgmt-a&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Yes, the VNA cluster path goes in a field called &lt;code&gt;edge_cluster_paths&lt;/code&gt;.&lt;/p&gt;&#10;&lt;p&gt;This profile is shared. Every VPC in the project that uses it gets the new service gateway and external block too. My lab had no VPCs yet, so that was safe. On a site that already runs VPCs, list them first and consider a dedicated profile for the Supervisor.&lt;/p&gt;&#10;&lt;p&gt;NSX is ready. In the &lt;a href="https://cosmin.us/one-host-supervisor-vcf-9-1-part-4-enable-supervisor/"&gt;next post&lt;/a&gt; we enable the Supervisor with a single control plane VM, and deal with the two things that stalled it.&lt;/p&gt;&#10;</content:encoded></item></channel></rss>