You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Two VIP bindings on one port in a VPC overwrite each other #764
A node's VIP translation entries are keyed only by the VPC, protocol, direction and port, never by the VIP or backend address. Two bindings in one VPC on that node that share a port overwrite each other without any error, and removing one deletes the other's entry.
The reply side is wider still. Any workload in that VPC on the node whose traffic leaves from a bound backend port gets its source rewritten to the VIP, whether or not it is a backend.
This stays inside one tenant, unlike #716, but it sends a VIP's clients to the wrong backend and breaks unrelated flows. It must be fixed before any VIP serves traffic.
Acceptance criteria
Two VIPs in one VPC on the same port and protocol each reach their own backend on a shared node
Deleting one binding leaves every other binding on the node working
Traffic from a workload that is not a VIP backend leaves with its own source address and port
A binding that cannot be programmed without displacing another reports that on its status instead of overwriting it
usid_ingress looks it up by the inner destination port and usid_egress by the source port. VipXlatTable.register in internal/plumbing/ebpf/vipxlatmap/vipxlat.go does a plain Put, and UnregisterIngress/UnregisterEgress take only block, argument, proto and port, so a second binding with the same tuple replaces the first and either binding's delete removes the shared row. The ServiceVIPBinding reconciler passes the VIP and backend addresses only as row values.
The ingress row probably needs the VIP address in its key, and the egress row the backend address, which grows the key past 16 bytes and changes the pinned map's layout, so the migration needs a plan. No binding serves traffic in staging or prod today (all NetworkRules and ServiceVIPBindings are gone from both staging cells as of 2026-10-06), so nothing live depends on the current layout.
Activity
privateip commentedon Oct 7, 2026
Read at main 6077189. The key in
internal/plumbing/ebpf/prog/usid.cis:usid_ingresslooks it up by the inner destination port andusid_egressby the source port.VipXlatTable.registerininternal/plumbing/ebpf/vipxlatmap/vipxlat.godoes a plainPut, andUnregisterIngress/UnregisterEgresstake only block, argument, proto and port, so a second binding with the same tuple replaces the first and either binding's delete removes the shared row. The ServiceVIPBinding reconciler passes the VIP and backend addresses only as row values.The ingress row probably needs the VIP address in its key, and the egress row the backend address, which grows the key past 16 bytes and changes the pinned map's layout, so the migration needs a plan. No binding serves traffic in staging or prod today (all NetworkRules and ServiceVIPBindings are gone from both staging cells as of 2026-10-06), so nothing live depends on the current layout.
docs: Describe the VIP translation key by its current contract
fix: Give each VIP binding its own translation rows