Skip to content

host-device: copy host interface IP addresses and routes into container#1257

Open
SchSeba wants to merge 1 commit intocontainernetworking:mainfrom
SchSeba:host-device-l3-info
Open

host-device: copy host interface IP addresses and routes into container#1257
SchSeba wants to merge 1 commit intocontainernetworking:mainfrom
SchSeba:host-device-l3-info

Conversation

@SchSeba
Copy link
Copy Markdown
Contributor

@SchSeba SchSeba commented May 4, 2026

Add a new configuration option useInterfaceNetwork that instructs the host-device plugin to capture the interface's IP addresses and routes from the host before moving the device into the container namespace, and then apply them inside the container.

This is critical for virtual environments (AWS, IBM Cloud, GPC) where the cloud provider configures IP addresses and routes directly on the network device. In these environments, there is no traditional IPAM source; the ground truth for L3 configuration lives on the host interface itself.

When useInterfaceNetwork is enabled, the plugin:

  • Captures all global-scope addresses and non-local routes from the host device before moving it into the container namespace.
  • Applies the captured addresses and routes to the interface inside the container.
  • Reports the addresses and routes in the CNI result (merged with any IPAM result if an IPAM plugin is also configured).

NOTE: The interface configuration on the host node must be persistent. When the device is moved back to the host (via DEL) and renamed to its original name, the system's network management service (e.g. NetworkManager, systemd-networkd, cloud-init, or cloud-specific agents) is expected to detect the device and re-apply the IP addresses and routes. This plugin does NOT re-configure the host interface on DEL; it relies on the node's network configuration being declarative and reconciled by the platform's networking stack.

Also implements the STATUS command to verify the host device exists, replacing the previous TODO stub.

@SchSeba SchSeba force-pushed the host-device-l3-info branch from f19acf4 to 0feea32 Compare May 4, 2026 15:06
Add a new configuration option `useInterfaceNetwork` that instructs the
host-device plugin to capture the interface's IP addresses and routes
from the host before moving the device into the container namespace,
and then apply them inside the container.

This is critical for virtual environments (AWS, IBM Cloud, GPC) where
the cloud provider configures IP addresses and routes directly on the
network device. In these environments, there is no traditional IPAM
source; the ground truth for L3 configuration lives on the host
interface itself.

When `useInterfaceNetwork` is enabled, the plugin:
  - Captures all global-scope addresses and non-local routes from the
    host device before moving it into the container namespace.
  - Applies the captured addresses and routes to the interface inside
    the container.
  - Reports the addresses and routes in the CNI result (merged with
    any IPAM result if an IPAM plugin is also configured).

NOTE: The interface configuration on the host node must be persistent.
When the device is moved back to the host (via DEL) and renamed to its
original name, the system's network management service (e.g.
NetworkManager, systemd-networkd, cloud-init, or cloud-specific agents)
is expected to detect the device and re-apply the IP addresses and
routes. This plugin does NOT re-configure the host interface on DEL; it
relies on the node's network configuration being declarative and
reconciled by the platform's networking stack.

Also implements the STATUS command to verify the host device exists,
replacing the previous TODO stub.

Signed-off-by: Sebastian Sch <sebassch@gmail.com>
@SchSeba SchSeba force-pushed the host-device-l3-info branch from 0feea32 to df398aa Compare May 4, 2026 17:27
@SchSeba
Copy link
Copy Markdown
Contributor Author

SchSeba commented May 4, 2026

Hi @s1061123 @squeed @LionelJouin if you have time please take a look on the PR.
This is critical for us to support virtual clusters running on clouds where the VFs are pass into the cluster VMs nodes with network configuration.

localRouteTable = 255
)

// HostNetworkStateFile holds the captured host-side L3 configuration
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.

personal preference no comment unless exported


// HostNetworkStateFile holds the captured host-side L3 configuration
// (addresses, routes, and rules) that should be applied to the container interface.
type HostNetworkStateFile struct {
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.

prefix ^File$ not very nice not really a file. May InterfaceInfo, InterfaceConfig, or just Interface

type HostNetworkStateFile struct {
HostIfName string `json:"hostIfName"`
HostLinkWasUp bool `json:"hostLinkWasUp"`
Addresses []string `json:"addresses,omitempty"`
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.

can we use netlink.Addr, netlink.routes, rule


// applyNetworkStateToPod applies captured state to the moved interface inside the pod namespace.
func applyNetworkStateToPod(containerNs ns.NetNS, contDev netlink.Link, state *HostNetworkStateFile) error {
if state == nil {
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.

having that check, (imo) indicates that this function maybe should be method to the struct.

},
},
}
mergeNetworkStateIntoResult(result, state)
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.

imo if user decides to keep network config from the host then we should ignore IPAM or block the combination witt IPAM in the config. I think is either IPAM, or host network config (no ip is also valid config)

)

// TestUseInterfaceNetwork verifies useInterfaceNetwork boolean behavior.
func TestUseInterfaceNetwork(t *testing.T) {
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.

what exactly this test is doing?

}

// TestStateJSONHasNoNeighbors verifies state serialization excludes neighbors.
func TestStateJSONHasNoNeighbors(t *testing.T) {
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.

what exactly this test is doing? Not sure the tests in the file really add value

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.

2 participants