diff --git a/.gitignore b/.gitignore index 59433345..4c58507e 100644 --- a/.gitignore +++ b/.gitignore @@ -45,6 +45,7 @@ prog/weavewait/weavewait_nomcast prog/weaveutil/weaveutil prog/*/Dockerfile.weaveworks prog/kube-peers/kube-peers +prog/weave-kube/kube-peers prog/plugin/plugin testing/cover/cover testing/runner/runner diff --git a/Makefile b/Makefile index d9b48e2c..e8d4488c 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -PUBLISH=publish_weave publish_weaveexec publish_plugin +PUBLISH=publish_weave publish_weaveexec publish_plugin publish_weave-kube .DEFAULT: all .PHONY: all exes testrunner update tests lint publish $(PUBLISH) clean clean-bin prerequisites build run-smoketests @@ -31,17 +31,19 @@ BUILD_UPTODATE=.build.uptodate WEAVER_UPTODATE=.weaver.uptodate WEAVEEXEC_UPTODATE=.weaveexec.uptodate PLUGIN_UPTODATE=.plugin.uptodate +WEAVEKUBE_UPTODATE=.weavekube.uptodate WEAVEDB_UPTODATE=.weavedb.uptodate -IMAGES_UPTODATE=$(WEAVER_UPTODATE) $(WEAVEEXEC_UPTODATE) $(PLUGIN_UPTODATE) $(WEAVEDB_UPTODATE) +IMAGES_UPTODATE=$(WEAVER_UPTODATE) $(WEAVEEXEC_UPTODATE) $(PLUGIN_UPTODATE) $(WEAVEKUBE_UPTODATE) $(WEAVEDB_UPTODATE) WEAVER_IMAGE=$(DOCKERHUB_USER)/weave WEAVEEXEC_IMAGE=$(DOCKERHUB_USER)/weaveexec PLUGIN_IMAGE=$(DOCKERHUB_USER)/plugin +WEAVEKUBE_IMAGE=$(DOCKERHUB_USER)/weave-kube BUILD_IMAGE=$(DOCKERHUB_USER)/weavebuild WEAVEDB_IMAGE=$(DOCKERHUB_USER)/weavedb -IMAGES=$(WEAVER_IMAGE) $(WEAVEEXEC_IMAGE) $(PLUGIN_IMAGE) $(WEAVEDB_IMAGE) +IMAGES=$(WEAVER_IMAGE) $(WEAVEEXEC_IMAGE) $(PLUGIN_IMAGE) $(WEAVEKUBE_IMAGE) $(WEAVEDB_IMAGE) WEAVE_EXPORT=weave.tar.gz @@ -153,6 +155,11 @@ $(PLUGIN_UPTODATE): prog/plugin/Dockerfile.$(DOCKERHUB_USER) $(PLUGIN_EXE) $(WEA $(SUDO) docker build -f prog/plugin/Dockerfile.$(DOCKERHUB_USER) -t $(PLUGIN_IMAGE) prog/plugin touch $@ +$(WEAVEKUBE_UPTODATE): prog/weave-kube/Dockerfile.$(DOCKERHUB_USER) $(KUBEPEERS_EXE) $(PLUGIN_UPTODATE) + cp $(KUBEPEERS_EXE) prog/weave-kube/ + $(SUDO) docker build -f prog/weave-kube/Dockerfile.$(DOCKERHUB_USER) -t $(WEAVEKUBE_IMAGE) prog/weave-kube + touch $@ + $(WEAVEDB_UPTODATE): prog/weavedb/Dockerfile $(SUDO) docker build -t $(WEAVEDB_IMAGE) prog/weavedb touch $@ diff --git a/prog/weave-kube/Dockerfile.template b/prog/weave-kube/Dockerfile.template new file mode 100644 index 00000000..bb4f8cb5 --- /dev/null +++ b/prog/weave-kube/Dockerfile.template @@ -0,0 +1,3 @@ +FROM DOCKERHUB_USER/plugin +ADD ./launch.sh ./kube-peers /home/weave/ +ENTRYPOINT ["/home/weave/launch.sh"] diff --git a/prog/weave-kube/launch.sh b/prog/weave-kube/launch.sh new file mode 100755 index 00000000..4c9454eb --- /dev/null +++ b/prog/weave-kube/launch.sh @@ -0,0 +1,118 @@ +#!/bin/sh + +set -e + +# Default if not supplied - same as weave net default +IPALLOC_RANGE=${IPALLOC_RANGE:-10.32.0.0/12} +HTTP_ADDR=${WEAVE_HTTP_ADDR:-127.0.0.1:6784} + +# kube-proxy requires that bridged traffic passes through netfilter +if [ ! -f /proc/sys/net/bridge/bridge-nf-call-iptables ] ; then + echo /proc/sys/net/bridge/bridge-nf-call-iptables not found >&2 + exit 1 +fi + +echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables + +# Create CNI config, if not already there +if [ ! -f /etc/cni/net.d/10-weave.conf ] ; then + mkdir -p /etc/cni/net.d + cat > /etc/cni/net.d/10-weave.conf </dev/null 2>&1 ; then + ip link add name vethwe-bridge type veth peer name vethwe-pcap + ip link set vethwe-bridge up + ip link set vethwe-pcap up + ip link set vethwe-bridge master weave + fi + BRIDGE_OPTIONS="--iface=vethwe-pcap" +fi + +if [ -z "$KUBE_PEERS" ]; then + if ! KUBE_PEERS=$(/home/weave/kube-peers) || [ -z "$KUBE_PEERS" ]; then + echo Failed to get peers >&2 + exit 1 + fi +fi + +peer_count() { + echo $# +} + +if [ -z "$IPALLOC_INIT" ]; then + IPALLOC_INIT="consensus=$(peer_count $KUBE_PEERS)" +fi + +/home/weave/weaver --port=6783 $BRIDGE_OPTIONS \ + --http-addr=127.0.0.1:6784 --docker-api='' --no-dns \ + --ipalloc-range=$IPALLOC_RANGE $NICKNAME_ARG \ + --ipalloc-init $IPALLOC_INIT \ + --name=$(cat /sys/class/net/weave/address) "$@" \ + $KUBE_PEERS & +WEAVE_PID=$! + +# Wait for weave process to become responsive +while true ; do + curl $HTTP_ADDR/status >/dev/null 2>&1 && break + if ! kill -0 $WEAVE_PID >/dev/null 2>&1 ; then + echo Weave process has died >&2 + exit 1 + fi + sleep 1 +done + +reclaim_ips() { + ID=$1 + shift + for CIDR in "$@" ; do + curl -s -S -X PUT "$HTTP_ADDR/ip/$ID/$CIDR" || true + done +} + +# Tell the newly-started weave about existing weave bridge IPs +/usr/bin/weaveutil container-addrs weave weave:expose | while read ID IFACE MAC IPS; do + reclaim_ips "weave:expose" $IPS +done +# Tell weave about existing weave process IPs +/usr/bin/weaveutil process-addrs weave | while read ID IFACE MAC IPS; do + reclaim_ips "_" $IPS +done + +# Expose the weave network so host processes can communicate with pods +/home/weave/weave --local expose $WEAVE_EXPOSE_IP + +wait $WEAVE_PID