History

net: retrieve netns cookie via getsocketopt

It's getting more common to run nested container environments for testing cloud software. One of such examples is Kind [1] which runs a Kubernetes cluster in Docker containers on a single host. Each container acts as a Kubernetes node, and thus can run any Pod (aka container) inside the former. This approach simplifies testing a lot, as it eliminates complicated VM setups. Unfortunately, such a setup breaks some functionality when cgroupv2 BPF programs are used for load-balancing. The load-balancer BPF program needs to detect whether a request originates from the host netns or a container netns in order to allow some access, e.g. to a service via a loopback IP address. Typically, the programs detect this by comparing netns cookies with the one of the init ns via a call to bpf_get_netns_cookie(NULL). However, in nested environments the latter cannot be used given the Kubernetes node's netns is outside the init ns. To fix this, we need to pass the Kubernetes node netns cookie to the program in a different way: by extending getsockopt() with a SO_NETNS_COOKIE option, the orchestrator which runs in the Kubernetes node netns can retrieve the cookie and pass it to the program instead. Thus, this is following up on Eric's commit 3d368ab87cf6 ("net: initialize net->net_cookie at netns setup") to allow retrieval via SO_NETNS_COOKIE. This is also in line in how we retrieve socket cookie via SO_COOKIE. [1] https://kind.sigs.k8s.io/

Martynas Pumputis committed 5 years ago

Commit e8b9eab1 parent 35713d96 files · +17 −0Browse files

Showing the changes to include/uapi (1 of 6 files). Show all

Unified · Split

include/uapi/asm-generic/socket.h+2−0
@@ -122,6 +122,8 @@ · 121 unmodified lines
122#define SO_PREFER_BUSY_POLL 69122#define SO_PREFER_BUSY_POLL 69
123#define SO_BUSY_POLL_BUDGET 70123#define SO_BUSY_POLL_BUDGET 70
124 124
125#define SO_NETNS_COOKIE 71
126
125#if !defined(__KERNEL__)127#if !defined(__KERNEL__)
126 128
127#if __BITS_PER_LONG == 64 || (defined(__x86_64__) && defined(__ILP32__))129#if __BITS_PER_LONG == 64 || (defined(__x86_64__) && defined(__ILP32__))

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t