Open vSwitch, Multiple network interfaces that associate with kubernetes pods, etc.
# generate protocol buffer
make pb
# make server binary
make server
# make client binary
make client
# make test (You should run this before push codes)
make testThe network-controller server provide two ways to listen, TCP and Unix domain socket. If you want to run as a UNIX domain socket server, you should specify a path to store the sock file and server will remove that file when server is been terminated.
./server/network-controller-server -unix=/tmp/a.sockFor the TCP server, just use the IP:PORT format, for example, 0.0.0.0:50051
./server/network-controller-server -tcp=0.0.0.0:50051The clinet is used for the kubernetes pod to create the veth and you can see the example yaml in example/kubernetes/*.yaml to see how to use this client.
For creating a veth for Pod, the client needs the following information
- Pod Name
- Pod Namespace
- Pod UUID
- Target Bridge Name
- The Interface Name in the container
- IP Address of the interface in the container
- Add VLAN tag into the interface
- Add a IP routing table(Add route)
- The server address
The first three variable can passed by the environemtn POD_NAME, POD_NAMESPACE and POD_UUID.
-b or --bridge Target bridge name.
-n or --nic The interface name in the container.
-i or --ip The ip address of the interface, should be a valid v4 CIDR address.
-v or --vlan The Vlan Tag of the interface.
--route-gw Add route for the destination network cidr on interface.
--route-intf Add route for the destination network cidr and gateway ip on interface.
--net The destination network for add IP routing table, like "-net target".
-g or --gateway The gateway of the interface subnet.
The clinet support two way to connect to the server, TCP socket and UNIX domain socket. In the TCP mode, use the IP:PORT format to connect to TCP server.
./client/network-controller-client -server=0.0.0.0:50051Fot the UNIX domain socket mode, you should use the unix://PATH format to connect to server. Assume the path is /tmp/a.sock and you can use the following command to connect
./client/network-controller-client -server=unix:///tmp/a.sockFollowing is an example of the client and you can see more use the --help.
./clinet/network-controller-client \
--server unix:///tmp/vortex/vortex.sock \
--bridge br100 \
--nic eth100 \
--ip 192.168.2.2/24 \
--net 239.0.0.0/4 \
--gateway 0.0.0.0
./clinet/network-controller-client \
--server unix:///tmp/vortex/vortex.sock \
--bridge br99 \
--nic eth99 \
--route-intf 239.0.0.0/4 \
--route-intf 224.0.0.0/4
./clinet/network-controller-client \
--server unix:///tmp/vortex/vortex.sock \
--bridge br98 \
--nic eth98 \
--route-gw 192.168.2.0/24,192.168.2.254 \
--route-gw 192.168.1.0/24,192.168.1.1
./clinet/network-controller-client \
--server unix:///tmp/vortex/vortex.sock \
--bridge br98 \
--nic eth98 \
--route-intf 239.0.0.0/4 \
--route-gw 192.168.1.0/24,192.168.1.1