Skip to content

Conversation

@riccardotornesello
Copy link
Contributor

Description

This PR aims to add a small section regarding Calico configuration to the page on installing liqo.

The suggestion is not to use VXLANCrossSubnet as it breaks Geneve tunnel connections.

How Has This Been Tested?

A k3d cluster was created with Calico configured first with VXLANCrossSubnet encapsulation and then VXLAN.

In the first case, the connection between the gateway and the other nodes did not work, while in the second case it did.

@riccardotornesello riccardotornesello marked this pull request as ready for review January 10, 2026 16:49
@adamjensenbot
Copy link
Collaborator

Hi @riccardotornesello. Thanks for your PR!

I am @adamjensenbot.
You can interact with me issuing a slash command in the first line of a comment.
Currently, I understand the following commands:

  • /rebase: Rebase this PR onto the master branch (You can add the option test=true to launch the tests
    when the rebase operation is completed)
  • /merge: Merge this PR into the master branch
  • /build Build Liqo components
  • /test Launch the E2E and Unit tests
  • /hold, /unhold Add/remove the hold label to prevent merging with /merge

Make sure this PR appears in the liqo changelog, adding one of the following labels:

  • feat: 🚀 New Feature
  • fix: 🐛 Bug Fix
  • refactor: 🧹 Code Refactoring
  • docs: 📝 Documentation
  • style: 💄 Code Style
  • perf: 🐎 Performance Improvement
  • test: ✅ Tests
  • chore: 🚚 Dependencies Management
  • build: 📦 Builds Management
  • ci: 👷 CI/CD
  • revert: ⏪ Reverts Previous Changes

@github-actions github-actions bot added the docs Updates or adds documentation label Jan 10, 2026

When using Calico in **VXLAN encapsulation mode**, you need to ensure that the encapsulation is enabled for all the traffic, not only for cross-subnet traffic.

This ensures that the GENEVE traffic is not affected by NAT rules that may be applied on the nodes, which would break the encapsulation.
Copy link
Member

Choose a reason for hiding this comment

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

Can you explain better where this NAT is performed. Because, in order to avoid Node IP natting when the geneve traffic leaves the gateway, we have this flag networking.fabric.config.fullMasquerade

In general, it would be better to find a solution to avoid changing the calico setup

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Sorry for the delay in responding.
I think mine is a special case, using k3d, but I had a similar problem on bare-metal clusters with kubeadm, so I'll try again there too. I don't know if the fullMasquerade option will solve this problem.
I'll explain the scenario so you can evaluate it too.

NOTE: VXLANCrossSubnet is the configuration found in the example variable files, but without specifying a value for “encapsulation,” the default setting is IPIP.

Scenario

In this example, a Pod on the Consumer (PO1) is trying to ping a pod on the Provider.
The traffic will be checked on the Consumer's nodes.

  • Nodes CIDR: 172.19.0.0/16
  • Pods CIDR: 10.200.0.0/16
  • Provider CIDR: 10.71.0.0/16
image

Results

Case 1: VXLAN (working)

In this scenario, VXLAN encapsulation is applied, so there is no NAT on the tunnel packet.

Step 1:

cali781879d0173 In IPv4: 10.200.0.1 > 10.71.0.3: ICMP echo request
liqo.79mdz7jl4m Out IPv4: 10.70.0.0 > 10.71.0.3: ICMP echo request
vxlan.calico Out IPv4: 10.200.208.128.42083 > 10.200.0.2.6091: UDP
eth0 Out IPv4: 172.19.0.4.39049 > 172.19.0.3.4789: VXLAN, flags [I] (0x08), vni 4096

Step 2:

eth0 In IPv4: 172.19.0.4.39049 > 172.19.0.3.4789: VXLAN, flags [I] (0x08), vni 4096
vxlan.calico In IPv4: 10.200.208.128.42083 > 10.200.0.2.6091: UDP
calib7d0f79f595 Out IPv4: 10.200.208.128.42083 > 10.200.0.2.6091: UDP

Step 3: out of scope

Step 4:

calib7d0f79f595 In IPv4: 10.200.0.2.42083 > 10.200.208.128.6091: UDP
vxlan.calico Out IPv4: 10.200.0.2.42083 > 10.200.208.128.6091: UDP
eth0 Out IPv4: 172.19.0.3.39049 > 172.19.0.4.4789: VXLAN, flags [I] (0x08), vni 4096

Step 5

eth0 In IPv4: 172.19.0.3.39049 > 172.19.0.4.4789: VXLAN, flags [I] (0x08), vni 4096
vxlan.calico In IPv4: 10.200.0.2.42083 > 10.200.208.128.6091: UDP
liqo.79mdz7jl4m In IPv4: 10.71.0.3 > 10.70.0.0: ICMP echo reply
cali781879d0173 Out IPv4: 10.71.0.3 > 10.200.0.1: ICMP echo reply

Case 2: VXLANCrossSubnet (not working)

In this example the request is stuck in a step before: the ARP request in the GENEVE tunnel.

Step 1:

liqo.bgsq4nrt2b Out ARP: Request who-has 10.80.0.4 tell 10.80.0.2
eth0 Out IPv4: 172.19.0.4.1184 > 10.200.0.2.6091: UDP

Something strange happens here: the packet is sent to eth0 even though the destination subnet is different, but the packet reaches the gateway, which even responds.
The response manages to reach the Pod node but is discarded.
NAT is applied in the gateway node, so the Pod node sees the packet arriving from 172.19.0.3 instead of 10.200.0.2.

@riccardotornesello
Copy link
Contributor Author

@cheina97
UPDATE
I confirm that, as you said, the problem was in my implementation.
I definitely solved it by changing the encapsulation mode from VXLANCrossSubnet to VXLAN, but only because of my network configuration and not because of any incompatibility with Liqo.
I am closing the PR; no changes are necessary.

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

Labels

docs Updates or adds documentation size/S

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants