Skip to content

laincloud/networkd

Repository files navigation

Networkd

codecov

layer 0 network daemon.

Dependency

  • ip (iproute-3.10.0-13.el7.x86_64)
  • arping (iputils-20121221-6.el7.x86_64)
  • iptables (iptables-1.4.21-13.el7.x86_64)
  • docker
  • etcd
  • lainlet

Float IP

  1. watch etcd/lainlet key: /lain/config/vips/*
  2. watch procs in /lain/config/vips/*
  3. config node vip

virtual ip config protocol

  • key: /lain/config/vips/{IP}

  • value:

    {
        "app": "APP1", # lain app name, required
        "proc": "PROC1", # lain app proc name, required
        "ports": [
            {
                "src": "PORT1", # source port (virtual ip/host port), required
                "proto": "tcp", # port protocol, optional, default: `tcp`, options: `tcp`, `udp`
                "dest": "APPPORT1" # destination port (lain app port), optional, default: `PORT1(current virtual ip port)`
            },
            {
                ...
            }
        ], # lain app ports, required
        "excluded_nodes": ["NODE1", "NODE2"] # optional, default: `[]`
    }

interface

TBD

PS: only support default interface now

example

vip: 192.168.10.254

  1. lock key
    • key: /lain/networkd/vips/192.168.10.254.lock
    • value:node1 # node hostname
  2. config key
    • key: /lain/config/vips/192.168.10.254

    • value: json # ip config

      {
          "app": "resource.elb.webrouter",
          "proc": "haproxy",
          "ports": [
              {
                  "src": "80",
                  "proto": "tcp"
              },
              {
                  "src": "443",
                  "proto": "tcp"
              },
              {
                  "src": "5555",
                  "proto": "udp",
                  "dest": "53"
              },
          ]
      }

Dns

Networkd contains a embedded dns server similar to dnsmasq. All resolvable domains from etcd are configured in /lain/config/domains.

  1. key
    • exact domain, e.g., /lain/config/domains/etcd.lain, /lain/config/domains/docker.lain.
    • wildcard domain begins with *., e.g., /lain/config/domains/*.lain, /lain/config/domains/*.lain.local.
  2. value
    • type `` to resolve to the specified IPs, e.g., {"ips":["10.131.0.72"],"type":""}.
    • type node to resolve to node IP, e.g., {"ips":[],"type":"node"}.
    • type webrouter to resolve to webrouter IPs, e.g., {"ips":[],"type":"webrouter"}.
  3. dump dns config
    • curl http://127.0.0.1:3000/v1/dns/config

Tinydns

dynamic dns server conf of tinydns app

Swarm

  1. dynamic dns host conf of swarm manager
    1. swarm.lain
  2. /lain/swarm/docker/swarm/leader

Deployd

  1. dynamic dns host conf of deployd
    1. deployd.lain
  2. /lain/deployd/leader

Webrouter

  1. dynamic webrouter.lain when no vip for webrouter

Resolv.conf

  1. Watch /etc/resolv.conf
  2. Ensure nameserver 127.0.0.1 in the first line.
  3. synchronize name servers from /etc/resolv.conf
  4. Remove rotate options

TODO

  1. Split lock & health goroutine
  2. Print iptables acl rules

License

Networkd is released under the MIT license.