Skip to content

Document BYOC Azure centralized egress with Azure Firewall - #643

Open
ppanagiotis wants to merge 1 commit into
mainfrom
DOC-2384
Open

Document BYOC Azure centralized egress with Azure Firewall#643
ppanagiotis wants to merge 1 commit into
mainfrom
DOC-2384

Conversation

@ppanagiotis

@ppanagiotis ppanagiotis commented Jul 21, 2026

Copy link
Copy Markdown
Contributor

Add hub setup and configuration pages for the beta NAT Gateway-free egress feature on Azure, mirroring the existing AWS Transit Gateway and GCP VPC Peering equivalents. Unlike AWS/GCP, this is API-only today (no Cloud UI support), so the pages route through the Cloud API using egress_spec.azure.hub_vnet_id and firewall_private_ip.

Description

Resolves https://redpandadata.atlassian.net/browse/DOC-2384

Page previews

Checks

  • New feature
  • Content gap
  • Support Follow-up
  • Small fix (typos, links, copyedits, etc)

@netlify

netlify Bot commented Jul 21, 2026

Copy link
Copy Markdown

Deploy Preview for rp-cloud ready!

Name Link
🔨 Latest commit c087bfa
🔍 Latest deploy log https://app.netlify.com/projects/rp-cloud/deploys/6a674b412f003f00084bd064
😎 Deploy Preview https://deploy-preview-643--rp-cloud.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify project configuration.

@coderabbitai

coderabbitai Bot commented Jul 21, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Important

Review skipped

Auto incremental reviews are disabled on this repository.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 7a8b7fc3-d771-41b1-b876-a053fb76693b

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Adds Azure BYOC centralized egress documentation covering hub VNet and Azure Firewall provisioning, traffic flow, prerequisites, limitations, troubleshooting, and API configuration through egress_spec.azure. Updates the Control Plane API guide with a complete Azure network creation example, adds cluster setup and release-note references, broadens the beta feature listing, and adds both new pages to navigation.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Azure BYOC cluster
  participant Azure spoke VNet
  participant Azure hub VNet
  participant Azure Firewall
  participant Internet
  Azure BYOC cluster->>Azure spoke VNet: Send internet-bound traffic
  Azure spoke VNet->>Azure hub VNet: Forward traffic through peering
  Azure hub VNet->>Azure Firewall: Route traffic to firewall private IP
  Azure Firewall->>Internet: SNAT traffic through static public IP
  Internet->>Azure Firewall: Return traffic
  Azure Firewall->>Azure spoke VNet: Forward return traffic
Loading

Possibly related PRs

Suggested reviewers: michelerp

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and concisely summarizes the main change: documenting BYOC Azure centralized egress with Azure Firewall.
Description check ✅ Passed The description includes the issue link, page previews, and check selection; only the review deadline field is missing.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch DOC-2384

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@ppanagiotis
ppanagiotis marked this pull request as ready for review July 22, 2026 11:07
@ppanagiotis
ppanagiotis requested a review from a team as a code owner July 22, 2026 11:07

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 8

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@modules/networking/pages/byoc/azure/azure-hub-egress.adoc`:
- Around line 358-366: Update the “Plan for high availability” section to state
that new Azure Firewall deployments are zone-redundant by default in regions
supporting availability zones. Clarify that explicit zone settings are only
needed for single-zone deployments or regions without zone support, and align
the Terraform reference module guidance with this behavior.
- Around line 270-285: Update the firewall deployment sequence after `az network
firewall ip-config create` and before collecting or using its frontend IP by
adding the `az network firewall update` step for `$FIREWALL_NAME` and
`$RESOURCE_GROUP`. Alternatively, verify and document that the targeted CLI
extension version no longer requires this step.

In `@modules/networking/pages/byoc/azure/nat-free-egress.adoc`:
- Around line 87-90: Update the warning in
modules/networking/pages/byoc/azure/nat-free-egress.adoc lines 87-90 to present
10.255.0.0/16 only as an example and require users to verify it does not overlap
existing network ranges. Update the default-values note in
modules/networking/pages/byoc/azure/azure-hub-egress.adoc lines 67-73 to warn
that this range may conflict with enterprise RFC 1918 networks.
- Around line 140-159: Align both Azure network examples with the API’s
canonical request envelope: in
modules/networking/pages/byoc/azure/nat-free-egress.adoc lines 140-159, wrap the
existing request fields under a network object; in
modules/manage/partials/controlplane-api.adoc lines 188-209, retain that
canonical envelope and update the Azure example fields to match the actual API
schema. Use the same envelope and Azure field structure in both examples.
- Around line 119-121: Update the Azure centralized-egress documentation to
consistently reflect dependency order: in
modules/networking/pages/byoc/azure/nat-free-egress.adoc lines 119-121, remove
the requirement to complete VNet peering before network creation; in
modules/manage/partials/controlplane-api.adoc line 188, state that VNet peering
is provisioned after the network request; in
modules/networking/pages/byoc/azure/azure-hub-egress.adoc lines 46-52, explain
that the hub and firewall are prepared first and the spoke ID is collected
afterward; and in lines 289-297, explicitly identify hub-side peering as
occurring after network provisioning.
- Around line 84-85: The Azure peering prerequisites incorrectly conflate
gateway transit with Azure Firewall forwarding. In
modules/networking/pages/byoc/azure/nat-free-egress.adoc lines 84-85, document
allow_forwarded_traffic for the firewall path and make allow_gateway_transit
conditional on exporting a VPN/ExpressRoute gateway; apply the corresponding
clarification at lines 101-106. Update
modules/networking/pages/byoc/azure/azure-hub-egress.adoc lines 293-321
consistently, preserving gateway transit only for hub gateway scenarios.
- Around line 165-178: The Internet endpoints section in
modules/networking/pages/byoc/azure/nat-free-egress.adoc lines 165-178 must
identify Azure Firewall application rules for hostname-based entries and
document the DNS proxy configuration required for FQDN filtering. In
modules/networking/pages/byoc/azure/azure-hub-egress.adoc lines 188-234, mark
the AllowAll policy as bootstrap-only or replace it with a restricted
production-oriented example so it is not presented as the default allowlist.
- Around line 180-182: Update the DNS resolution section to state that
Azure-provided DNS at 168.63.129.16 bypasses UDRs and does not depend on
0.0.0.0/0 being routed through the hub. If custom DNS is supported, document
that it requires a separate reachable network path; otherwise remove the
implication that hub routing controls DNS resolution.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: a6a2b2d4-7bcc-4481-89e1-644f1fecf66a

📥 Commits

Reviewing files that changed from the base of the PR and between b6a9a28 and fedcb55.

📒 Files selected for processing (7)
  • modules/ROOT/nav.adoc
  • modules/get-started/pages/cloud-overview.adoc
  • modules/get-started/pages/cluster-types/byoc/azure/create-byoc-cluster-azure.adoc
  • modules/get-started/pages/whats-new-cloud.adoc
  • modules/manage/partials/controlplane-api.adoc
  • modules/networking/pages/byoc/azure/azure-hub-egress.adoc
  • modules/networking/pages/byoc/azure/nat-free-egress.adoc

Comment thread modules/networking/pages/byoc/azure/azure-hub-egress.adoc
Comment thread modules/networking/pages/byoc/azure/azure-hub-egress.adoc Outdated
Comment on lines +84 to +85
* You have created the VNet peering from the hub to the Redpanda spoke VNet, with `allow_forwarded_traffic` enabled on both sides and `allow_gateway_transit` enabled on the hub side.
* Your hub VNet address space and the planned Redpanda spoke VNet address space do not overlap.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

printf '\n== File list ==\n'
git ls-files modules/networking/pages/byoc/azure/nat-free-egress.adoc modules/networking/pages/byoc/azure/azure-hub-egress.adoc

printf '\n== nat-free-egress.adoc (around cited lines) ==\n'
sed -n '70,120p' modules/networking/pages/byoc/azure/nat-free-egress.adoc

printf '\n== azure-hub-egress.adoc (around cited lines) ==\n'
sed -n '285,330p' modules/networking/pages/byoc/azure/azure-hub-egress.adoc

printf '\n== Search for allow-gateway-transit / allow-forwarded-traffic usage ==\n'
rg -n "allow-gateway-transit|allow_forwarded_traffic|forwarded traffic|gateway transit" modules/networking/pages/byoc/azure

Repository: redpanda-data/cloud-docs

Length of output: 7725


🌐 Web query:

Azure virtual network peering allow-forwarded-traffic allow-gateway-transit documentation forwarded traffic gateway transit separate semantics

💡 Result:

In Azure virtual network (VNet) peering, allowForwardedTraffic and allowGatewayTransit are distinct settings that control different aspects of network traffic routing [1][2]. allowForwardedTraffic This setting determines whether a VNet will accept traffic that does not originate from within the directly peered VNet [1][3]. By default, this is disabled [1]. Enabling this is necessary in scenarios where you have network virtual appliances (NVAs) or other routing configurations that forward traffic from external sources (such as other peered networks or on-premises environments) into the local VNet through the peering [1]. It essentially tells the local VNet to permit packets where the source IP address belongs to a range outside of the directly peered VNet [1]. allowGatewayTransit This setting is a property of the peering connection that permits a VNet to use a VPN gateway or ExpressRoute gateway residing in the peered (remote) VNet [4][5]. Enabling this allows the peered VNet to act as a transit point for connectivity to on-premises networks or other VNets [4][6]. - For this to function, the gateway-hosting VNet must have allowGatewayTransit enabled [1][7]. - The VNet using the gateway must have the useRemoteGateways property set to true [3][2]. - A VNet cannot use a remote gateway if it already has its own local gateway configured [4][1]. Summary of Differences The key distinction is that allowForwardedTraffic manages the acceptance of traffic forwarded by internal network components (like NVAs) [1], whereas allowGatewayTransit manages the architectural ability of a VNet to leverage the routing infrastructure (gateway) of another VNet for external connectivity [4][5]. They are independent settings that serve different networking requirements in hub-and-spoke or complex topology designs [5][6].

Citations:


🏁 Script executed:

#!/bin/bash
set -euo pipefail

printf '\n== nat-free-egress.adoc (around lines 35-70) ==\n'
sed -n '35,70p' modules/networking/pages/byoc/azure/nat-free-egress.adoc

printf '\n== nat-free-egress.adoc (around lines 180-210) ==\n'
sed -n '180,210p' modules/networking/pages/byoc/azure/nat-free-egress.adoc

printf '\n== azure-hub-egress.adoc (around lines 1-60) ==\n'
sed -n '1,60p' modules/networking/pages/byoc/azure/azure-hub-egress.adoc

Repository: redpanda-data/cloud-docs

Length of output: 8271


Separate gateway transit from Azure Firewall forwarding. allow_forwarded_traffic is what lets the spoke’s UDR to the firewall cross the peering; allow_gateway_transit should only be required when the hub is actually exporting a VPN/ExpressRoute gateway.

📍 Affects 2 files
  • modules/networking/pages/byoc/azure/nat-free-egress.adoc#L84-L85 (this comment)
  • modules/networking/pages/byoc/azure/nat-free-egress.adoc#L101-L106
  • modules/networking/pages/byoc/azure/azure-hub-egress.adoc#L293-L321
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@modules/networking/pages/byoc/azure/nat-free-egress.adoc` around lines 84 -
85, The Azure peering prerequisites incorrectly conflate gateway transit with
Azure Firewall forwarding. In
modules/networking/pages/byoc/azure/nat-free-egress.adoc lines 84-85, document
allow_forwarded_traffic for the firewall path and make allow_gateway_transit
conditional on exporting a VPN/ExpressRoute gateway; apply the corresponding
clarification at lines 101-106. Update
modules/networking/pages/byoc/azure/azure-hub-egress.adoc lines 293-321
consistently, preserving gateway transit only for hub gateway scenarios.

Comment thread modules/networking/pages/byoc/azure/nat-free-egress.adoc
Comment thread modules/networking/pages/byoc/azure/nat-free-egress.adoc Outdated
Comment thread modules/networking/pages/byoc/azure/nat-free-egress.adoc
Comment thread modules/networking/pages/byoc/azure/nat-free-egress.adoc
Comment thread modules/networking/pages/byoc/azure/nat-free-egress.adoc Outdated
@ppanagiotis
ppanagiotis force-pushed the DOC-2384 branch 2 times, most recently from 67c460a to caee206 Compare July 23, 2026 14:45
@david-yu

Copy link
Copy Markdown
Contributor

@ppanagiotis I think we should also provide Terraform based docs as well, do you know how the TF provider is progressing?

@ppanagiotis

Copy link
Copy Markdown
Contributor Author

@ppanagiotis I think we should also provide Terraform based docs as well, do you know how the TF provider is progressing?

I will work on update the Terraform providers next week. And I will update docs also.

@micheleRP

Copy link
Copy Markdown
Contributor

PR Review (docs-team-standards)

Critical issues (must fix)

  1. nat-free-egress.adoc (Use the Cloud API): the standalone API example uses a different, likely invalid JSON shape than every other example. Every other /v1/networks example in controlplane-api.adoc — including the Azure one this PR adds to the partial — wraps the payload in "network": { ... } and includes "resource_group_id". The standalone example in nat-free-egress.adoc omits both. If the enveloped form is correct (it's the canonical one used repo-wide), this copy-paste example would fail, and the two examples of the same call disagree.

    • Fix: Make the nat-free-egress.adoc example match the partial: wrap in "network": {} and add "resource_group_id". Confirm the correct shape against the API before changing.
  2. Contradictory dependency order for VNet peering. nat-free-egress.adoc Prerequisites lists "You have created the VNet peering from the hub to the Redpanda spoke VNet" as done before configuring egress. But azure-hub-egress.adoc states the spoke VNet resource ID is only "visible in the Redpanda Cloud console after the network is created," and that the hub-side peering "stays in a non-connected state until Redpanda creates the reciprocal peering during cluster provisioning." Readers can't create the hub→spoke peering before the network exists (no spoke ID yet), yet the prerequisite says they must.

    • Fix: Clarify the actual sequence (hub + firewall first → create network to get spoke VNet ID → create hub-side peering → cluster provisioning completes the reciprocal peering) and align the prerequisite wording with the hub page.

Suggestions (should consider)

  1. azure-hub-egress.adoc (Create the Azure Firewall): "approximately $1.25 per hour" will go stale. Consider linking to Azure Firewall pricing instead of stating a figure.
  2. Beta glossterm: The What's New entry uses glossterm:beta[], but the new pages use plain "beta" in prose (they do set :page-beta: true for the badge). Optional: use glossterm:beta[] on first mention in prose for consistency.
  3. create-byoc-cluster-azure.adoc (TIP): Minor repetition — "...is only enabled if centralized egress is enabled for your organization." Consider "...only if centralized egress is enabled for your organization."
  4. nat-free-egress.adoc Prerequisites: 10.255.0.0/16 is described as a "safe default." It's already hedged with an overlap WARNING, so this is minor, but "example range you should verify against your networks" is safer phrasing.

Add hub setup and configuration pages for the beta NAT Gateway-free
egress feature on Azure, mirroring the existing AWS Transit Gateway
and GCP VPC Peering equivalents. Unlike AWS/GCP, this is API-only
today (no Cloud UI support), so the pages route through the Cloud
API using egress_spec.azure.hub_vnet_id and firewall_private_ip.

Co-Authored-By: Claude Sonnet 5 <[email protected]>
@micheleRP

Copy link
Copy Markdown
Contributor

PR Review, round 2 (docs-team-standards)

Thanks for the quick turnaround — the latest push addresses everything from my last review and all of the CodeRabbit comments. I verified the API surface this time (request envelopes, required fields, the PATCH field-mask shape, the two-apply toggle behavior and the agent warning, the spoke-side peering flags, and the 0.0.0.0/0 UDR), and it all checks out. Four things left.

Critical issues (must fix)

  1. nat-free-egress.adoc lines 119 and 182: the Cloud UI does support changing egress on an existing network. Both spots say it doesn't ("Changing centralized egress on an existing network is not yet available in the Cloud UI; use the Cloud API instead"). But on the network details page there's a Hub VNet setting row with Add/Edit (and a remove option) that updates egress_spec on the existing network and then prompts you to run rpk cloud byoc azure apply. It's behind the same per-organization gate as the create-time fields.

    • Fix: Replace both statements, and document the network details procedure (Networks → select the network → Hub VNet → Add/Edit → re-run rpk cloud byoc azure apply). The PR description says "API-only today (no Cloud UI support)" — worth updating that too.
  2. nat-free-egress.adoc lines 119 and 253: broken cross-references in the published site. Both reference <<update-existing-network,Update egress on an existing network>> from outside the ifdef::show-preview-api[] block, but that anchor is inside it (lines 179–205). show-preview-api isn't set anywhere in this repo, so on the live site those render as broken references — and the update flow ends up documented nowhere, even though the UI supports it.

    • Fix: Falls out of item 1. Document the UI update path ungated, and keep only the curl variants inside the gate.
  3. nat-free-egress.adoc lines 46 and 238: allow_gateway_transit fix applied only partway. The prose (line 93), the responsibility table (line 106), and the second troubleshooting row (line 241) now correctly say allow_forwarded_traffic is the flag that matters. Two spots still disagree with them:

    • Line 238 tells readers to verify "the hub-side peering has allow_gateway_transit enabled" when cluster creation fails → should be allow_forwarded_traffic.
    • Line 46, the diagram, labels the hub side allow_gateway_transit=true → should be allow_forwarded_traffic=true.
  4. Two ungated pages point readers at the Cloud API path that the rest of the PR deliberately hides. The API sections are gated behind show-preview-api because the field is still preview, but:

    • whats-new-cloud.adoc line 22: "You can set this up in the Cloud UI or Cloud API when you create the network, or add or change it on an existing network through the Cloud API" — sends readers to a path no published page documents.
    • create-byoc-cluster-azure.adoc TIP: names egress_spec.azure.hub_vnet_id and firewall_private_ip plus the Cloud API. The AWS and GCP equivalents in that same file mention only the UI fields.
    • Fix: Describe only the UI path in both, which is the complete story once item 1 is in.

Suggestions (should consider)

  1. UI field labels: they render as Hub egress VNet ID (optional) and Firewall private IP (optional), and the form requires the two to be supplied together. Worth noting the pairing requirement in the Cloud Console step, not just in the gated API section.
  2. Worth adding: the hub-egress route table is created with BGP route propagation disabled, so the default route to the firewall can't be overridden. Since the page discusses hub VPN/ExpressRoute gateways, readers may expect BGP routes to reach the Redpanda subnets — they won't.
  3. "creates one Azure NAT Gateway per availability zone" is a fixed count; the NAT Gateway count is configurable. "One or more NAT Gateways in the Redpanda VNet" avoids going stale.
  4. Terminology: the heading === Use the Cloud Console and three uses of "Redpanda Cloud console" (lowercase) run against the repo baseline of "Redpanda Cloud Console" / "Redpanda Cloud UI"; the AWS and GCP siblings use prose ("use the Redpanda Cloud UI") with no heading. learning-objective-1 also says "Redpanda Cloud UI" while the heading says "Cloud Console."
  5. azure-hub-egress.adoc, Plan for high availability: "New Azure Firewall deployments are zone-redundant by default in regions that support availability zones" is a strong platform claim with no citation — link the Microsoft availability-zones doc. (The paired claim that the Terraform module sets no explicit zones is accurate.)

What works well

  • Faithful mirror of the AWS and GCP page pair, so all three providers now read consistently.
  • The two-apply explanation for toggling egress on or off, including the deferred-deletion warning, is exactly right. That's the detail most likely to generate a support ticket and it's covered.
  • Clear shared-responsibility table and a genuinely useful troubleshooting table.
  • Terraform escape hatch linked to a module that exists.

Happy to push these edits to DOC-2384 myself if that's easier than hand-applying them — just say the word. Separately, I'll file a follow-up for the AWS and GCP POST /v1/networks examples, which have a request-shape bug this PR's Azure example doesn't; no need to touch them here.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants