Coder Social home page Coder Social logo

circuit's Introduction

 ________  ___  ________  ________  ___  ___  ___  _________
|\   ____\|\  \|\   __  \|\   ____\|\  \|\  \|\  \|\___   ___\
\ \  \___|\ \  \ \  \|\  \ \  \___|\ \  \\\  \ \  \|___ \  \_|
 \ \  \    \ \  \ \   _  _\ \  \    \ \  \\\  \ \  \   \ \  \
  \ \  \____\ \  \ \  \\  \\ \  \____\ \  \\\  \ \  \   \ \  \
   \ \_______\ \__\ \__\\ _\\ \_______\ \_______\ \__\   \ \__\
    \|_______|\|__|\|__|\|__|\|_______|\|_______|\|__|    \|__|

Circuit manages networks for runc.

  • CNI network management (define and manage CNI networks and connectivity)
  • CNI compatible (use CNI plugins)
  • Quality of service management for networks and container interfaces
  • Load balancing using IPVS

Circuit has been designed for flexibility. For example, the controller has been designed to be replaced. Circuit leverages CNI for setting up networking using various plugins such as bridge, ptp, etc. Define multiple CNI networks and connect/disconnect, load balance, etc.

Huge thanks to @jessfraz netns for inspiration :)

Usage

The following examples assume you have CNI plugins. Checkout the CNI docs on getting started (mainly just clone and ./build). From there you can place those binaries somewhere on your PATH and it should just work.

Create a Network

Specify a CNI network config when creating. For the examples following, we will assume a network config like so:

{
    "cniVersion": "0.3.0",
    "name": "br-sandbox",
    "type": "bridge",
    "bridge": "cni0",
    "ipMasq": true,
    "isGateway": true,
    "ipam": {
        "type": "host-local",
        "subnet": "10.100.10.0/24",
        "routes": [
            {
                "dst": "0.0.0.0/0"
            }
        ]
    }
}
$> circuit network create /path/to/cni.conf

View Networks

$> circuit network list
NAME                TYPE                VERSION             PEERS
local               ipvlan              0.3.0
sandbox             bridge              0.3.0
shell               bridge              0.3.0               10.30.30.2 (19022)

Connect a Container to a Network

$> runc list
ID          PID         STATUS      BUNDLE         CREATED
web-00      4668        running     /root/web-00   2016-10-12T18:45:27.787840219Z

$> circuit network connect 4668 sandbox
connected container 4668 to network sandbox

Set QoS for Network

This will set the target rate of 5mbps with a ceiling of 6mbps

$> circuit network qos set --rate 5000 --ceiling 6000 sandbox
qos configured for sandbox

This will add 50ms latency to the network

$> circuit network qos set --delay 50ms sandbox
qos configured for sandbox

An example ping from the container with before and after QOS:

$> ping 10.254.1.1
64 bytes from 10.254.1.1: icmp_seq=1 ttl=64 time=0.176 ms
64 bytes from 10.254.1.1: icmp_seq=2 ttl=64 time=0.136 ms
64 bytes from 10.254.1.1: icmp_seq=3 ttl=64 time=0.150 ms
64 bytes from 10.254.1.1: icmp_seq=4 ttl=64 time=0.138 ms
64 bytes from 10.254.1.1: icmp_seq=5 ttl=64 time=50.361 ms
64 bytes from 10.254.1.1: icmp_seq=6 ttl=64 time=50.323 ms
64 bytes from 10.254.1.1: icmp_seq=7 ttl=64 time=50.280 ms
64 bytes from 10.254.1.1: icmp_seq=8 ttl=64 time=50.352 ms

Clear QoS for a Network

$> circuit network qos reset sandbox
qos reset for sandbox

Circuit supports basic load balancing via IPVS.

Note: this is experimental and the implementation may change.

Create a Load Balancer Service

$> circuit lb create demo 192.168.100.235:80
service demo created

Create a Load Balancer Service with Custom Scheduler

$> circuit lb create demo-wrr --scheduler wrr 192.168.100.235:80
service demo-wrr created

List Load Balancer Services

$> circuit lb list
NAME                ADDR                 PROTOCOL            SCHEDULER
demo                192.168.100.235:80   tcp                 rr

Add Target to Service

$> circuit lb add demo 10.254.1.196:80
service demo updated

List Load Balancer Services with Details

$> circuit lb list --details
NAME                ADDR                 PROTOCOL            SCHEDULER
demo                192.168.100.235:80   tcp                 rr
  -> 10.254.1.196:80

Remove Target from Service

$> circuit lb remove demo 10.254.1.196:80
service demo updated

Remove Service

$> circuit lb delete demo
service demo removed

Disconnect Container from Network

$> runc list
ID          PID         STATUS      BUNDLE         CREATED
web-00      4668        running     /root/web-00   2016-10-12T18:45:27.787840219Z

$> circuit network disconnect 4668 sandbox
disconnected container 4668 from network sandbox

Delete Network

$> circuit network delete sandbox
sandbox deleted

runc Hooks

Circuit also supports runc hooks. This will automatically create and configure networks upon start / stop for runc containers. To setup, simply add Circuit as prestart and poststop hooks in a runc config:

...

"hooks": {
    "prestart": [
        {
            "path": "/usr/local/bin/circuit",
            "env": [
                "CNI_CONF=/etc/cni/conf.d/bridge.conf",
                "CNI_PATH=/path/to/cni/plugins",
                "PATH=/bin:/usr/bin:/usr/sbin:/sbin"
            ]
        }
    ],
    "poststop": [
        {
            "path": "/usr/local/bin/circuit",
            "env": [
                "CNI_CONF=/etc/cni/conf.d/bridge.conf",
                "CNI_PATH=/path/to/cni/plugins",
                "PATH=/bin:/usr/bin:/usr/sbin:/sbin"
            ]
        }
    ]
},
...

circuit's People

Contributors

ehazlett avatar

Watchers

 avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.