Compare commits

...
21 Commits
Author SHA1 Message Date
Bryan Boreham c7a235a54a Add release v2.6.4 2020-05-30 10:11:08 +00:00
Bryan Boreham bef50d3730 Merge pull request #3811 from weaveworks/allow-dnat-127
Only drop traffic to the Weave Net port on 127.0.0.1
2020-05-30 11:07:13 +01:00
Bryan Boreham a46d18da0c Use a more targeted iptables rule to block access to control port
Only block the specific port Weave Net is listening on.
Add a comment so users know what the rule is for.

Remove the rule added in v2.6.3 because it was too coarse.
2020-05-29 19:58:41 +00:00
Bryan Boreham 95c020fbe0 Merge pull request #3809 from weaveworks/move-ansible-install
Move ansible install out from every CI run
2020-05-29 20:58:05 +01:00
Bryan Boreham 7c2084b9af Move ansible install out from every CI run
to only where we create images.
2020-05-29 13:33:30 +00:00
Bryan Boreham f78c4dacc5 Add release v2.6.3 2020-05-28 10:12:54 +00:00
Bryan Boreham 9245b73913 Merge pull request #3805 from weaveworks/block-remote-localhost
Block non-local traffic to the Weave control port
2020-05-28 10:50:55 +01:00
Bryan Boreham 6ee961b068 Block non-local traffic to the Weave control port
We expect the loopback address 127.0.0.1 to be accessible only from
the local host.

We need to allow RELATED,ESTABLISHED traffic which may be the return
path of a Kubernetes HostPort.
2020-05-27 16:43:50 +00:00
Bryan Boreham 1f920513de Merge pull request #3804 from weaveworks/npc-errors-metrics2
metric for NPC errors
2020-05-23 20:43:55 +01:00
Bryan Boreham 15f21f1899 Merge pull request #3801 from weaveworks/disable-accept-ra
Disable accept_ra on Weave Net interfaces
2020-05-22 11:00:50 +01:00
Bryan Boreham 09a204b978 NPC: increment metric each time an error is logged 2020-05-22 09:55:07 +00:00
Murali Reddy 77fbb2c12b introduce weavenpc_policy_enforcement_errors prometheus metric
to track number of errors occured during enforcing network policies

Fixes #3791
2020-05-22 09:54:11 +00:00
Bryan Boreham 6ad3e69faf Plumb through /proc path config to Docker plugin 2020-05-18 14:47:26 +00:00
Bryan Boreham e2088ef401 Disable accept_ra setting on interfaces we create 2020-05-14 10:21:41 +00:00
Bryan Boreham 0f3864968e refactor: supply /proc path to CreateAndAttachVeth()
Move the assumptions about where we're running up towards the caller.
2020-05-14 10:21:09 +00:00
Bryan Boreham 2f235daa1c Merge pull request #3777 from weaveworks/eks
add steps to install weave-net on EKS
2020-04-02 12:32:21 +01:00
Murali Reddy 438a5f5fd1 clarify pods connect to api server 2020-04-02 16:12:02 +05:30
Bryan Boreham b051ef0878 Merge pull request #3790 from weaveworks/npc-errors
Weave-npc: while logging differentiate between fatal and non-fatal errors
2020-04-02 11:24:10 +01:00
Murali Reddy 48015aa7be Weave-npc: while logging differentiate between fatal and non-fatal errors 2020-04-02 15:08:15 +05:30
Murali Reddy 4e3acfdc02 add note on apiserver being on EKS managed network 2020-02-26 10:29:50 +05:30
Murali Reddy 11915948a2 add steps to install weave-net on EKS 2020-02-26 10:27:01 +05:30
15 changed files with 140 additions and 53 deletions

No files matched your search

+15
View File
@@ -1,3 +1,18 @@
## Release 2.6.4
Improves the iptables rule added in 2.6.3 to block just the Weave Net
control port and avoid blocking other uses of 127.0.0.1. #3811
## Release 2.6.3
This release has a couple of security improvements, and some other fixes.
* Block non-local traffic to the Weave control port #3805
* Tell Linux not to accept router advisory messages #3801
* Network Policy Controller: add a metric to show errors while operating #3804
* Network Policy Controller: don't treat named port as a fatal error #3790
## Release 2.6.2 ## Release 2.6.2
This release fixes a regression found in 2.6.1 release and removes a possible case This release fixes a regression found in 2.6.1 release and removes a possible case
-8
View File
@@ -13,13 +13,6 @@ function install_terraform() {
curl -fsS https://releases.hashicorp.com/terraform/0.11.14/terraform_0.11.14_linux_amd64.zip | gunzip >terraform && chmod +x terraform && sudo mv terraform /usr/bin curl -fsS https://releases.hashicorp.com/terraform/0.11.14/terraform_0.11.14_linux_amd64.zip | gunzip >terraform && chmod +x terraform && sudo mv terraform /usr/bin
} }
function install_ansible() {
sudo apt-get update || true
sudo apt-get install -qq -y python-pip python-dev libffi-dev libssl-dev \
&& pip install --user -U setuptools cffi \
&& pip install --user ansible
}
[ -n "$SECRET_KEY" ] || { [ -n "$SECRET_KEY" ] || {
echo "Cannot run smoke tests: no secret key" echo "Cannot run smoke tests: no secret key"
exit 1 exit 1
@@ -28,7 +21,6 @@ function install_ansible() {
source "$SRCDIR/bin/circle-env" source "$SRCDIR/bin/circle-env"
install_terraform install_terraform
install_ansible
# Only attempt to create GCP image in first container, wait for it to be created otherwise: # Only attempt to create GCP image in first container, wait for it to be created otherwise:
[ "$CIRCLE_NODE_INDEX" != "0" ] && export CREATE_IMAGE=0 [ "$CIRCLE_NODE_INDEX" != "0" ] && export CREATE_IMAGE=0
+6
View File
@@ -54,6 +54,12 @@ func SetLogLevel(levelname string) {
Log.Level = level Log.Level = level
} }
func CheckError(e error) {
if e != nil {
Log.Error(e)
}
}
func CheckFatal(e error) { func CheckFatal(e error) {
if e != nil { if e != nil {
Log.Fatal(e) Log.Fatal(e)
+28 -11
View File
@@ -63,10 +63,10 @@ const (
) )
type Bridge interface { type Bridge interface {
init(config *BridgeConfig) error // create and initialise bridge device(s) init(procPath string, config *BridgeConfig) error // create and initialise bridge device(s)
attach(veth *netlink.Veth) error // attach veth to bridge attach(veth *netlink.Veth) error // attach veth to bridge
IsFastdp() bool // does this bridge use fastdp? IsFastdp() bool // does this bridge use fastdp?
String() string // human-readable type string String() string // human-readable type string
} }
// Used to indicate a fallback to the Bridge type // Used to indicate a fallback to the Bridge type
@@ -221,6 +221,7 @@ type BridgeConfig struct {
MTU int MTU int
Mac string Mac string
Port int Port int
ControlPort string
NoMasqLocal bool NoMasqLocal bool
} }
@@ -250,7 +251,7 @@ func EnsureBridge(procPath string, config *BridgeConfig, log *logrus.Logger, ips
} }
for { for {
if err := bridgeType.init(config); err != nil { if err := bridgeType.init(procPath, config); err != nil {
if errors.Cause(err) == errBridgeNotSupported { if errors.Cause(err) == errBridgeNotSupported {
log.Warnf("Skipping bridge creation of %q due to: %s", bridgeType, err) log.Warnf("Skipping bridge creation of %q due to: %s", bridgeType, err)
bridgeType = bridgeImpl{} bridgeType = bridgeImpl{}
@@ -279,6 +280,10 @@ func EnsureBridge(procPath string, config *BridgeConfig, log *logrus.Logger, ips
return bridgeType, errors.Wrap(err, "setting proxy_arp") return bridgeType, errors.Wrap(err, "setting proxy_arp")
} }
} }
// No ipv6 router advertisments please
if err := sysctl(procPath, "net/ipv6/conf/"+config.WeaveBridgeName+"/accept_ra", "0"); err != nil {
return bridgeType, errors.Wrap(err, "setting accept_ra to 0")
}
if err := linkSetUpByName(config.WeaveBridgeName); err != nil { if err := linkSetUpByName(config.WeaveBridgeName); err != nil {
return bridgeType, err return bridgeType, err
@@ -345,11 +350,11 @@ func (b bridgeImpl) initPrep(config *BridgeConfig) error {
return nil return nil
} }
func (b bridgeImpl) init(config *BridgeConfig) error { func (b bridgeImpl) init(procPath string, config *BridgeConfig) error {
if err := b.initPrep(config); err != nil { if err := b.initPrep(config); err != nil {
return err return err
} }
if _, err := CreateAndAttachVeth(BridgeIfName, PcapIfName, config.WeaveBridgeName, config.MTU, true, false, func(veth netlink.Link) error { if _, err := CreateAndAttachVeth(procPath, BridgeIfName, PcapIfName, config.WeaveBridgeName, config.MTU, true, false, func(veth netlink.Link) error {
return netlink.LinkSetUp(veth) return netlink.LinkSetUp(veth)
}); err != nil { }); err != nil {
return errors.Wrap(err, "creating pcap veth pair") return errors.Wrap(err, "creating pcap veth pair")
@@ -361,7 +366,7 @@ func (b bridgeImpl) init(config *BridgeConfig) error {
return nil return nil
} }
func (f fastdpImpl) init(config *BridgeConfig) error { func (f fastdpImpl) init(procPath string, config *BridgeConfig) error {
odpSupported, err := odp.CreateDatapath(f.datapathName) odpSupported, err := odp.CreateDatapath(f.datapathName)
if !odpSupported { if !odpSupported {
msg := "" msg := ""
@@ -392,14 +397,14 @@ func (f fastdpImpl) init(config *BridgeConfig) error {
return nil return nil
} }
func (bf bridgedFastdpImpl) init(config *BridgeConfig) error { func (bf bridgedFastdpImpl) init(procPath string, config *BridgeConfig) error {
if err := bf.fastdpImpl.init(config); err != nil { if err := bf.fastdpImpl.init(procPath, config); err != nil {
return err return err
} }
if err := bf.bridgeImpl.initPrep(config); err != nil { if err := bf.bridgeImpl.initPrep(config); err != nil {
return err return err
} }
if _, err := CreateAndAttachVeth(BridgeIfName, DatapathIfName, config.WeaveBridgeName, config.MTU, true, false, func(veth netlink.Link) error { if _, err := CreateAndAttachVeth(procPath, BridgeIfName, DatapathIfName, config.WeaveBridgeName, config.MTU, true, false, func(veth netlink.Link) error {
if err := netlink.LinkSetUp(veth); err != nil { if err := netlink.LinkSetUp(veth); err != nil {
return errors.Wrapf(err, "setting link up on %q", veth.Attrs().Name) return errors.Wrapf(err, "setting link up on %q", veth.Attrs().Name)
} }
@@ -465,6 +470,18 @@ func configureIPTables(config *BridgeConfig, ips ipset.Interface) error {
} }
} }
if config.ControlPort != "" {
if err = ipt.AppendUnique("filter", "INPUT", "-p", "tcp", "--dst", "127.0.0.1", "--dport", config.ControlPort,
"-m", "addrtype", "!", "--src-type", "LOCAL",
"-m", "conntrack", "!", "--ctstate", "RELATED,ESTABLISHED",
"-m", "comment", "--comment", "Block non-local access to Weave Net control port",
"-j", "DROP"); err != nil {
return err
}
}
// Remove the rule from Weave Net 2.6.3 which dropped too much.
_ = ipt.Delete("filter", "INPUT", "-p", "tcp", "--dst", "127.0.0.1", "-m", "addrtype", "!", "--src-type", "LOCAL", "-m", "conntrack", "!", "--ctstate", "RELATED,ESTABLISHED", "-j", "DROP")
if config.NPC { if config.NPC {
// Steer traffic via the NPC. // Steer traffic via the NPC.
+3 -3
View File
@@ -55,9 +55,9 @@ func WithNetNSByPath(path string, work func() error) error {
} }
func NSPathByPid(pid int) string { func NSPathByPid(pid int) string {
return NSPathByPidWithRoot("/", pid) return NSPathByPidWithProc("/proc", pid)
} }
func NSPathByPidWithRoot(root string, pid int) string { func NSPathByPidWithProc(procPath string, pid int) string {
return filepath.Join(root, fmt.Sprintf("/proc/%d/ns/net", pid)) return filepath.Join(procPath, fmt.Sprint(pid), "/ns/net")
} }
+17 -8
View File
@@ -13,7 +13,7 @@ import (
) )
// create and attach a veth to the Weave bridge // create and attach a veth to the Weave bridge
func CreateAndAttachVeth(name, peerName, bridgeName string, mtu int, keepTXOn bool, errIfLinkExist bool, init func(peer netlink.Link) error) (*netlink.Veth, error) { func CreateAndAttachVeth(procPath, name, peerName, bridgeName string, mtu int, keepTXOn bool, errIfLinkExist bool, init func(peer netlink.Link) error) (*netlink.Veth, error) {
bridge, err := netlink.LinkByName(bridgeName) bridge, err := netlink.LinkByName(bridgeName)
if err != nil { if err != nil {
return nil, fmt.Errorf(`bridge "%s" not present; did you launch weave?`, bridgeName) return nil, fmt.Errorf(`bridge "%s" not present; did you launch weave?`, bridgeName)
@@ -49,6 +49,13 @@ func CreateAndAttachVeth(name, peerName, bridgeName string, mtu int, keepTXOn bo
if err := bridgeType.attach(veth); err != nil { if err := bridgeType.attach(veth); err != nil {
return cleanup("attaching veth %q to %q: %s", name, bridgeName, err) return cleanup("attaching veth %q to %q: %s", name, bridgeName, err)
} }
// No ipv6 router advertisments please
if err := sysctl(procPath, "net/ipv6/conf/"+name+"/accept_ra", "0"); err != nil {
return cleanup("setting accept_ra to 0: %s", err)
}
if err := sysctl(procPath, "net/ipv6/conf/"+peerName+"/accept_ra", "0"); err != nil {
return cleanup("setting accept_ra to 0: %s", err)
}
if !bridgeType.IsFastdp() && !keepTXOn { if !bridgeType.IsFastdp() && !keepTXOn {
if err := EthtoolTXOff(veth.PeerName); err != nil { if err := EthtoolTXOff(veth.PeerName); err != nil {
return cleanup(`unable to set tx off on %q: %s`, peerName, err) return cleanup(`unable to set tx off on %q: %s`, peerName, err)
@@ -112,6 +119,9 @@ func interfaceExistsInNamespace(netNSPath string, ifName string) bool {
} }
func AttachContainer(netNSPath, id, ifName, bridgeName string, mtu int, withMulticastRoute bool, cidrs []*net.IPNet, keepTXOn bool, hairpinMode bool) error { func AttachContainer(netNSPath, id, ifName, bridgeName string, mtu int, withMulticastRoute bool, cidrs []*net.IPNet, keepTXOn bool, hairpinMode bool) error {
// AttachContainer expects to be called in host pid namespace
const procPath = "/proc"
ns, err := netns.GetFromPath(netNSPath) ns, err := netns.GetFromPath(netNSPath)
if err != nil { if err != nil {
return err return err
@@ -124,12 +134,12 @@ func AttachContainer(netNSPath, id, ifName, bridgeName string, mtu int, withMult
id = id[:maxIDLen] // trim passed ID if too long id = id[:maxIDLen] // trim passed ID if too long
} }
name, peerName := vethPrefix+"pl"+id, vethPrefix+"pg"+id name, peerName := vethPrefix+"pl"+id, vethPrefix+"pg"+id
veth, err := CreateAndAttachVeth(name, peerName, bridgeName, mtu, keepTXOn, true, func(veth netlink.Link) error { veth, err := CreateAndAttachVeth(procPath, name, peerName, bridgeName, mtu, keepTXOn, true, func(veth netlink.Link) error {
if err := netlink.LinkSetNsFd(veth, int(ns)); err != nil { if err := netlink.LinkSetNsFd(veth, int(ns)); err != nil {
return fmt.Errorf("failed to move veth to container netns: %s", err) return fmt.Errorf("failed to move veth to container netns: %s", err)
} }
if err := WithNetNS(ns, func() error { if err := WithNetNS(ns, func() error {
return setupIface(peerName, ifName) return setupIface(procPath, peerName, ifName)
}); err != nil { }); err != nil {
return fmt.Errorf("error setting up interface: %s", err) return fmt.Errorf("error setting up interface: %s", err)
} }
@@ -206,7 +216,7 @@ func setupIfaceAddrs(veth netlink.Link, withMulticastRoute bool, cidrs []*net.IP
} }
// setupIface expects to be called in the container's netns // setupIface expects to be called in the container's netns
func setupIface(ifaceName, newIfName string) error { func setupIface(procPath, ifaceName, newIfName string) error {
ipt, err := iptables.New() ipt, err := iptables.New()
if err != nil { if err != nil {
return err return err
@@ -219,15 +229,14 @@ func setupIface(ifaceName, newIfName string) error {
if err := netlink.LinkSetName(link, newIfName); err != nil { if err := netlink.LinkSetName(link, newIfName); err != nil {
return err return err
} }
// This is only called by AttachContainer which is only called in host pid namespace if err := configureARPCache(procPath, newIfName); err != nil {
if err := configureARPCache("/proc", newIfName); err != nil {
return err return err
} }
return ipt.Append("filter", "INPUT", "-i", newIfName, "-d", "224.0.0.0/4", "-j", "DROP") return ipt.Append("filter", "INPUT", "-i", newIfName, "-d", "224.0.0.0/4", "-j", "DROP")
} }
// configureARP is a helper for the Docker plugin which doesn't set the addresses itself // configureARP is a helper for the Docker plugin which doesn't set the addresses itself
func ConfigureARP(prefix, rootPath string) error { func ConfigureARP(prefix, procPath string) error {
links, err := netlink.LinkList() links, err := netlink.LinkList()
if err != nil { if err != nil {
return err return err
@@ -235,7 +244,7 @@ func ConfigureARP(prefix, rootPath string) error {
for _, link := range links { for _, link := range links {
ifName := link.Attrs().Name ifName := link.Attrs().Name
if strings.HasPrefix(ifName, prefix) { if strings.HasPrefix(ifName, prefix) {
configureARPCache(rootPath+"/proc", ifName) configureARPCache(procPath, ifName)
if addrs, err := netlink.AddrList(link, netlink.FAMILY_V4); err == nil { if addrs, err := netlink.AddrList(link, netlink.FAMILY_V4); err == nil {
for _, addr := range addrs { for _, addr := range addrs {
arping.GratuitousArpOverIfaceByName(addr.IPNet.IP, ifName) arping.GratuitousArpOverIfaceByName(addr.IPNet.IP, ifName)
+9
View File
@@ -22,6 +22,12 @@ var (
}, },
[]string{"protocol", "dport"}, []string{"protocol", "dport"},
) )
PolicyEnforcementErrors = prometheus.NewCounter(
prometheus.CounterOpts{
Name: "weavenpc_policy_enforcement_errors",
Help: "Errors occured in enforcing the network policies.",
},
)
) )
func gatherMetrics() { func gatherMetrics() {
@@ -95,6 +101,9 @@ func Start(addr string) error {
if err := prometheus.Register(blockedConnections); err != nil { if err := prometheus.Register(blockedConnections); err != nil {
return err return err
} }
if err := prometheus.Register(PolicyEnforcementErrors); err != nil {
return err
}
http.Handle("/metrics", promhttp.Handler()) http.Handle("/metrics", promhttp.Handler())
+4 -2
View File
@@ -39,9 +39,10 @@ type driver struct {
// used only by plugin-v2 // used only by plugin-v2
forceMulticast bool forceMulticast bool
networks map[string]network networks map[string]network
procPath string
} }
func New(client *docker.Client, weave *weaveapi.Client, name, scope string, dns, isPluginV2, forceMulticast bool) (skel.Driver, error) { func New(client *docker.Client, weave *weaveapi.Client, name, scope string, dns, isPluginV2, forceMulticast bool, procPath string) (skel.Driver, error) {
driver := &driver{ driver := &driver{
name: name, name: name,
scope: scope, scope: scope,
@@ -51,6 +52,7 @@ func New(client *docker.Client, weave *weaveapi.Client, name, scope string, dns,
// make sure that it's used only by plugin-v2 // make sure that it's used only by plugin-v2
forceMulticast: isPluginV2 && forceMulticast, forceMulticast: isPluginV2 && forceMulticast,
networks: make(map[string]network), networks: make(map[string]network),
procPath: procPath,
} }
// Do not start watcher in the case of plugin v2, which prevents us from // Do not start watcher in the case of plugin v2, which prevents us from
@@ -134,7 +136,7 @@ func (driver *driver) CreateEndpoint(create *api.CreateEndpointRequest) (*api.Cr
// create veths. note we assume endpoint IDs are unique in the first 9 chars // create veths. note we assume endpoint IDs are unique in the first 9 chars
name, peerName := vethPair(create.EndpointID) name, peerName := vethPair(create.EndpointID)
if _, err := weavenet.CreateAndAttachVeth(name, peerName, weavenet.WeaveBridgeName, 0, false, true, nil); err != nil { if _, err := weavenet.CreateAndAttachVeth(driver.procPath, name, peerName, weavenet.WeaveBridgeName, 0, false, true, nil); err != nil {
return nil, driver.error("JoinEndpoint", "%s", err) return nil, driver.error("JoinEndpoint", "%s", err)
} }
+2 -7
View File
@@ -43,14 +43,9 @@ func (w *watcher) ContainerStarted(id string) {
w.driver.warn("ContainerStarted", "unable to register %s with weaveDNS: %s", id, err) w.driver.warn("ContainerStarted", "unable to register %s with weaveDNS: %s", id, err)
} }
} }
rootDir := "/" netNSPath := weavenet.NSPathByPidWithProc(w.driver.procPath, info.State.Pid)
if w.driver.isPluginV2 {
// We bind mount host's /proc to /host/proc for plugin-v2
rootDir = "/host"
}
netNSPath := weavenet.NSPathByPidWithRoot(rootDir, info.State.Pid)
if err := weavenet.WithNetNSByPath(netNSPath, func() error { if err := weavenet.WithNetNSByPath(netNSPath, func() error {
return weavenet.ConfigureARP(weavenet.VethName, rootDir) return weavenet.ConfigureARP(weavenet.VethName, w.driver.procPath)
}); err != nil { }); err != nil {
w.driver.warn("ContainerStarted", "unable to configure interfaces: %s", err) w.driver.warn("ContainerStarted", "unable to configure interfaces: %s", err)
} }
+5 -4
View File
@@ -32,6 +32,7 @@ type Config struct {
EnableV2Multicast bool EnableV2Multicast bool
DNS bool DNS bool
DefaultSubnet string DefaultSubnet string
ProcPath string // path to reach host /proc filesystem
} }
type Plugin struct { type Plugin struct {
@@ -62,7 +63,7 @@ func (plugin *Plugin) run(dockerClient *docker.Client, weave *weaveapi.Client, r
endChan := make(chan error, 1) endChan := make(chan error, 1)
if plugin.Socket != "" { if plugin.Socket != "" {
globalListener, err := listenAndServe(dockerClient, weave, plugin.Socket, endChan, "global", false, plugin.DNS, plugin.EnableV2, plugin.EnableV2Multicast) globalListener, err := listenAndServe(dockerClient, weave, plugin.Socket, endChan, "global", false, plugin.DNS, plugin.EnableV2, plugin.EnableV2Multicast, plugin.ProcPath)
if err != nil { if err != nil {
return err return err
} }
@@ -70,7 +71,7 @@ func (plugin *Plugin) run(dockerClient *docker.Client, weave *weaveapi.Client, r
defer globalListener.Close() defer globalListener.Close()
} }
if plugin.MeshSocket != "" { if plugin.MeshSocket != "" {
meshListener, err := listenAndServe(dockerClient, weave, plugin.MeshSocket, endChan, "local", true, plugin.DNS, plugin.EnableV2, plugin.EnableV2Multicast) meshListener, err := listenAndServe(dockerClient, weave, plugin.MeshSocket, endChan, "local", true, plugin.DNS, plugin.EnableV2, plugin.EnableV2Multicast, plugin.ProcPath)
if err != nil { if err != nil {
return err return err
} }
@@ -87,7 +88,7 @@ func (plugin *Plugin) run(dockerClient *docker.Client, weave *weaveapi.Client, r
return <-endChan return <-endChan
} }
func listenAndServe(dockerClient *docker.Client, weave *weaveapi.Client, address string, endChan chan<- error, scope string, withIpam, dns bool, isPluginV2, forceMulticast bool) (net.Listener, error) { func listenAndServe(dockerClient *docker.Client, weave *weaveapi.Client, address string, endChan chan<- error, scope string, withIpam, dns bool, isPluginV2, forceMulticast bool, procPath string) (net.Listener, error) {
var name string var name string
if isPluginV2 { if isPluginV2 {
name = pluginV2Name name = pluginV2Name
@@ -95,7 +96,7 @@ func listenAndServe(dockerClient *docker.Client, weave *weaveapi.Client, address
name = pluginNameFromAddress(address) name = pluginNameFromAddress(address)
} }
d, err := netplugin.New(dockerClient, weave, name, scope, dns, isPluginV2, forceMulticast) d, err := netplugin.New(dockerClient, weave, name, scope, dns, isPluginV2, forceMulticast, procPath)
if err != nil { if err != nil {
return nil, err return nil, err
} }
+15 -8
View File
@@ -34,7 +34,14 @@ var (
bridgePortName string bridgePortName string
) )
func handleError(err error) { common.CheckFatal(err) } func handleError(err error) {
if err != nil {
metrics.PolicyEnforcementErrors.Inc()
common.Log.Error(err)
}
}
func handleFatal(err error) { common.CheckFatal(err) }
func makeController(getter cache.Getter, resource string, func makeController(getter cache.Getter, resource string,
objType runtime.Object, handlers cache.ResourceEventHandlerFuncs) cache.Controller { objType runtime.Object, handlers cache.ResourceEventHandlerFuncs) cache.Controller {
@@ -240,19 +247,19 @@ func root(cmd *cobra.Command, args []string) {
} }
config, err := rest.InClusterConfig() config, err := rest.InClusterConfig()
handleError(err) handleFatal(err)
client, err := kubernetes.NewForConfig(config) client, err := kubernetes.NewForConfig(config)
handleError(err) handleFatal(err)
ipt, err := iptables.New() ipt, err := iptables.New()
handleError(err) handleFatal(err)
ips := ipset.New(common.LogLogger(), maxList) ips := ipset.New(common.LogLogger(), maxList)
handleError(resetIPTables(ipt)) handleFatal(resetIPTables(ipt))
handleError(resetIPSets(ips)) handleFatal(resetIPSets(ips))
handleError(createBaseRules(ipt, ips)) handleFatal(createBaseRules(ipt, ips))
npc := npc.New(nodeName, ipt, ips, client) npc := npc.New(nodeName, ipt, ips, client)
@@ -339,5 +346,5 @@ func main() {
rootCmd.PersistentFlags().IntVar(&maxList, "max-list-size", 1024, "maximum size of ipset list (for namespaces)") rootCmd.PersistentFlags().IntVar(&maxList, "max-list-size", 1024, "maximum size of ipset list (for namespaces)")
rootCmd.PersistentFlags().StringVar(&bridgePortName, "bridge-port-name", "vethwe-bridge", "name of the brige port on which packets are received and sent") rootCmd.PersistentFlags().StringVar(&bridgePortName, "bridge-port-name", "vethwe-bridge", "name of the brige port on which packets are received and sent")
handleError(rootCmd.Execute()) handleFatal(rootCmd.Execute())
} }
+6
View File
@@ -307,6 +307,11 @@ func main() {
bridgeConfig.Mac = name.String() bridgeConfig.Mac = name.String()
bridgeConfig.Port = config.Port bridgeConfig.Port = config.Port
if httpAddr != "" {
if _, port, err := net.SplitHostPort(httpAddr); err == nil {
bridgeConfig.ControlPort = port
}
}
ips := ipset.New(common.LogLogger(), 0) ips := ipset.New(common.LogLogger(), 0)
bridgeType, err := weavenet.EnsureBridge(procPath, &bridgeConfig, Log, ips) bridgeType, err := weavenet.EnsureBridge(procPath, &bridgeConfig, Log, ips)
checkFatal(err) checkFatal(err)
@@ -453,6 +458,7 @@ func main() {
pluginConfig.DNS = !noDNS pluginConfig.DNS = !noDNS
pluginConfig.DefaultSubnet = defaultSubnet.String() pluginConfig.DefaultSubnet = defaultSubnet.String()
pluginConfig.ProcPath = procPath
plugin := plugin.NewPlugin(pluginConfig) plugin := plugin.NewPlugin(pluginConfig)
// The weave script always waits for a status call to succeed, // The weave script always waits for a status call to succeed,
+19 -1
View File
@@ -7,6 +7,8 @@ search_type: Documentation
The following topics are discussed: The following topics are discussed:
* [Installation](#install) * [Installation](#install)
* [Installing on GKE](#gke)
* [Installing on EKS](#eks)
* [Upgrading the Daemon Sets](#daemon-sets) * [Upgrading the Daemon Sets](#daemon-sets)
* [CPU and Memory Requirements](#resources) * [CPU and Memory Requirements](#resources)
* [Pod Eviction](#eviction) * [Pod Eviction](#eviction)
@@ -71,10 +73,26 @@ Shut down Kubernetes, and _on all nodes_ perform the following:
Then relaunch Kubernetes and install the addon as described Then relaunch Kubernetes and install the addon as described
above. above.
**Note:** Installing on GKE ### <a name="gke"></a> Installing on GKE
Please note that you must grant the user the ability to create roles in Kubernetes before launching Weave Net. Please note that you must grant the user the ability to create roles in Kubernetes before launching Weave Net.
This is a prerequisite to use use role-based access control on GKE. Please see the GKE [instructions](https://cloud.google.com/kubernetes-engine/docs/how-to/role-based-access-control). This is a prerequisite to use use role-based access control on GKE. Please see the GKE [instructions](https://cloud.google.com/kubernetes-engine/docs/how-to/role-based-access-control).
### <a name="gke"></a> Installing on EKS
EKS by default installs `amazon-vpc-cni-k8s` CNI. Please follow below steps to use Weave-net as CNI
- create EKS cluster in any of [prescribed](https://docs.aws.amazon.com/eks/latest/userguide/create-cluster.html) way
- delete `amazon-vpc-cni-k8s` deamonset by running `kubectl delete ds aws-node -n kube-system` command
- delete `/etc/cni/net.d/10-aws.conflist` on each of the node
- edit instance security group to allow TCP 6783 and UDP 6783/6784 ports
- flush iptables nat, mangle, filter tables to clear any iptables configurations done by `amazon-vpc-cni-k8s`
- restart kube-proxy pods to reconfigure iptables
- apply weave-net daemoset by following above installation steps
- delete existing pods so they get recreated in Weave pod CIDR's address-space.
Please note that while pods can connect to the Kubernetes API server for your cluser, API server will not be able to connect to the pods as API server nodes are not connected to Weave Net (they run on network managed by EKS).
### <a name="daemon-sets"></a> Upgrading the Daemon Sets ### <a name="daemon-sets"></a> Upgrading the Daemon Sets
The DaemonSet definition specifies [Rolling The DaemonSet definition specifies [Rolling
+10 -1
View File
@@ -66,7 +66,7 @@ function print_vars() {
} }
function verify_dependencies() { function verify_dependencies() {
local deps=(python terraform ansible-playbook gcloud) local deps=(python terraform gcloud)
for dep in "${deps[@]}"; do for dep in "${deps[@]}"; do
if [ ! "$(which "$dep")" ]; then if [ ! "$(which "$dep")" ]; then
echo >&2 "$dep is not installed or not in PATH." echo >&2 "$dep is not installed or not in PATH."
@@ -141,9 +141,18 @@ function wait_for_image() {
exit 1 exit 1
} }
function install_ansible() {
sudo apt-get update || true
sudo apt-get install -qq -y python-pip python-dev libffi-dev libssl-dev \
&& pip install --user -U setuptools cffi \
&& pip install --user ansible
}
# shellcheck disable=SC2155 # shellcheck disable=SC2155
function create_image() { function create_image() {
if [[ "$CREATE_IMAGE" == 1 ]]; then if [[ "$CREATE_IMAGE" == 1 ]]; then
install_ansible
greenly echo "> Creating GCP image $IMAGE_NAME..." greenly echo "> Creating GCP image $IMAGE_NAME..."
local begin_img=$(date +%s) local begin_img=$(date +%s)
local num_hosts=1 local num_hosts=1
+1
View File
@@ -483,6 +483,7 @@ destroy_bridge() {
[ -n "$DOCKER_BRIDGE_IP" ] || DOCKER_BRIDGE_IP=$(util_op bridge-ip $DOCKER_BRIDGE) [ -n "$DOCKER_BRIDGE_IP" ] || DOCKER_BRIDGE_IP=$(util_op bridge-ip $DOCKER_BRIDGE)
run_iptables -t filter -D INPUT -d 127.0.0.1/32 -p tcp --dport 6784 -m addrtype ! --src-type LOCAL -m conntrack ! --ctstate RELATED,ESTABLISHED -m comment --comment "Block non-local access to Weave Net control port" -j DROP >/dev/null 2>&1 || true
run_iptables -t filter -D INPUT -i $DOCKER_BRIDGE -p udp --dport 53 -j ACCEPT >/dev/null 2>&1 || true run_iptables -t filter -D INPUT -i $DOCKER_BRIDGE -p udp --dport 53 -j ACCEPT >/dev/null 2>&1 || true
run_iptables -t filter -D INPUT -i $DOCKER_BRIDGE -p tcp --dport 53 -j ACCEPT >/dev/null 2>&1 || true run_iptables -t filter -D INPUT -i $DOCKER_BRIDGE -p tcp --dport 53 -j ACCEPT >/dev/null 2>&1 || true