From 9b0d1bd054018550d1d2fcd3533eb9454521393c Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Sat, 26 May 2018 14:06:57 +0000 Subject: [PATCH 1/2] Set Kubernetes NodeNetworkUnavailable to false when starting --- prog/kube-peers/main.go | 19 ++++++++++++++----- prog/kube-peers/nodestatus.go | 29 +++++++++++++++++++++++++++++ prog/weave-kube/launch.sh | 3 +++ 3 files changed, 46 insertions(+), 5 deletions(-) create mode 100644 prog/kube-peers/nodestatus.go diff --git a/prog/kube-peers/main.go b/prog/kube-peers/main.go index 53708d03..5114e20e 100644 --- a/prog/kube-peers/main.go +++ b/prog/kube-peers/main.go @@ -176,14 +176,16 @@ func reclaimRemovedPeers(weave *weaveapi.Client, cml *configMapAnnotations, node func main() { var ( - justReclaim bool - justCheck bool - peerName string - nodeName string - logLevel string + justReclaim bool + justCheck bool + justSetNodeStatus bool + peerName string + nodeName string + logLevel string ) flag.BoolVar(&justReclaim, "reclaim", false, "reclaim IP space from dead peers") flag.BoolVar(&justCheck, "check-peer-new", false, "return success if peer name is not stored in annotation") + flag.BoolVar(&justSetNodeStatus, "set-node-status", false, "set NodeNetworkUnavailable to false") flag.StringVar(&peerName, "peer-name", "unknown", "name of this Weave Net peer") flag.StringVar(&nodeName, "node-name", "unknown", "name of this Kubernetes node") flag.StringVar(&logLevel, "log-level", "info", "logging level (debug, info, warning, error)") @@ -210,6 +212,13 @@ func main() { os.Exit(0) } } + if justSetNodeStatus { + err := setNodeNetworkUnavailableFalse(c, nodeName) + if err != nil { + common.Log.Fatalf("[kube-peers] could not set node status: %v", err) + } + return + } peers, err := getKubePeers(c) if err != nil { common.Log.Fatalf("[kube-peers] Could not get peers: %v", err) diff --git a/prog/kube-peers/nodestatus.go b/prog/kube-peers/nodestatus.go new file mode 100644 index 00000000..0df3a30f --- /dev/null +++ b/prog/kube-peers/nodestatus.go @@ -0,0 +1,29 @@ +package main + +import ( + "encoding/json" + "fmt" + + "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/client-go/kubernetes" +) + +// based on k8s.io/kubernetes/pkg/controller/nodeipam/ipam/adapter.go +func setNodeNetworkUnavailableFalse(c *kubernetes.Clientset, nodeName string) error { + condition := v1.NodeCondition{ + Type: v1.NodeNetworkUnavailable, + Status: v1.ConditionFalse, + Reason: "WeaveIsUp", + Message: "Weave pod has set this", + LastTransitionTime: metav1.Now(), + LastHeartbeatTime: metav1.Now(), + } + raw, err := json.Marshal(&[]v1.NodeCondition{condition}) + if err != nil { + return err + } + patch := []byte(fmt.Sprintf(`{"status":{"conditions":%s}}`, raw)) + _, err = c.CoreV1().Nodes().PatchStatus(nodeName, patch) + return err +} diff --git a/prog/weave-kube/launch.sh b/prog/weave-kube/launch.sh index 9ee11402..9e1632cd 100755 --- a/prog/weave-kube/launch.sh +++ b/prog/weave-kube/launch.sh @@ -143,6 +143,9 @@ post_start_actions() { # Expose the weave network so host processes can communicate with pods /home/weave/weave --local expose $WEAVE_EXPOSE_IP + + # Mark network as up + /home/weave/kube-peers -set-node-status -node-name="$HOSTNAME" } post_start_actions & From 2a04df1049ae1a908c8e00a195ef434e8c9eea2a Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Mon, 11 Jun 2018 11:22:07 +0000 Subject: [PATCH 2/2] Rename "kube-peers" to "kube-utils" It's now doing things like network status that are outside of the scope of "peers". --- .gitignore | 4 ++-- Makefile | 12 ++++++------ prog/{kube-peers => kube-utils}/annotations.go | 0 prog/{kube-peers => kube-utils}/main.go | 0 prog/{kube-peers => kube-utils}/nodestatus.go | 0 prog/weave-kube/Dockerfile.template | 2 +- prog/weave-kube/launch.sh | 8 ++++---- 7 files changed, 13 insertions(+), 13 deletions(-) rename prog/{kube-peers => kube-utils}/annotations.go (100%) rename prog/{kube-peers => kube-utils}/main.go (100%) rename prog/{kube-peers => kube-utils}/nodestatus.go (100%) diff --git a/.gitignore b/.gitignore index 9671228f..4529ce53 100644 --- a/.gitignore +++ b/.gitignore @@ -46,8 +46,8 @@ prog/weavewait/weavewait_noop prog/weavewait/weavewait_nomcast prog/weaveutil/weaveutil prog/*/Dockerfile.weaveworks -prog/kube-peers/kube-peers -prog/weave-kube/kube-peers +prog/kube-utils/kube-utils +prog/weave-kube/kube-utils prog/weave-npc/weave-npc prog/plugin/plugin testing/cover/cover diff --git a/Makefile b/Makefile index 403a4af2..c66f4fd0 100644 --- a/Makefile +++ b/Makefile @@ -109,7 +109,7 @@ NET_PLUGIN_LATEST=latest_release # Paths to all relevant binaries that should be compiled WEAVER_EXE=prog/weaver/weaver SIGPROXY_EXE=prog/sigproxy/sigproxy -KUBEPEERS_EXE=prog/kube-peers/kube-peers +KUBEUTILS_EXE=prog/kube-utils/kube-utils WEAVENPC_EXE=prog/weave-npc/weave-npc WEAVEWAIT_EXE=prog/weavewait/weavewait WEAVEWAIT_NOOP_EXE=prog/weavewait/weavewait_noop @@ -122,7 +122,7 @@ TEST_TLS_EXE=test/tls/tls NETWORKTESTER_EXE=test/images/network-tester/webserver # All binaries together in a list -EXES=$(WEAVER_EXE) $(SIGPROXY_EXE) $(KUBEPEERS_EXE) $(WEAVENPC_EXE) $(WEAVEWAIT_EXE) $(WEAVEWAIT_NOOP_EXE) $(WEAVEWAIT_NOMCAST_EXE) $(WEAVEUTIL_EXE) $(RUNNER_EXE) $(TEST_TLS_EXE) $(NETWORKTESTER_EXE) +EXES=$(WEAVER_EXE) $(SIGPROXY_EXE) $(KUBEUTILS_EXE) $(WEAVENPC_EXE) $(WEAVEWAIT_EXE) $(WEAVEWAIT_NOOP_EXE) $(WEAVEWAIT_NOMCAST_EXE) $(WEAVEUTIL_EXE) $(RUNNER_EXE) $(TEST_TLS_EXE) $(NETWORKTESTER_EXE) # These stamp files are used to mark the current state of the build; whether an image has been built or not BUILD_UPTODATE=.build.uptodate @@ -180,7 +180,7 @@ $(WEAVER_EXE): api/*.go plugin/*.go plugin/*/* $(WEAVER_EXE): proxy/*.go $(WEAVEUTIL_EXE): prog/weaveutil/*.go net/*.go plugin/net/*.go plugin/ipam/*.go db/*.go $(SIGPROXY_EXE): prog/sigproxy/*.go -$(KUBEPEERS_EXE): prog/kube-peers/*.go +$(KUBEUTILS_EXE): prog/kube-utils/*.go $(WEAVENPC_EXE): prog/weave-npc/*.go npc/*.go npc/*/*.go $(TEST_TLS_EXE): test/tls/*.go $(RUNNER_EXE): tools/runner/*.go @@ -217,7 +217,7 @@ else endif $(NETGO_CHECK) -$(WEAVEUTIL_EXE) $(KUBEPEERS_EXE) $(WEAVENPC_EXE) $(NETWORKTESTER_EXE): +$(WEAVEUTIL_EXE) $(KUBEUTILS_EXE) $(WEAVENPC_EXE) $(NETWORKTESTER_EXE): go build $(BUILD_FLAGS) -o $@ ./$(@D) $(NETGO_CHECK) @@ -299,8 +299,8 @@ $(PLUGIN_UPTODATE): prog/net-plugin/launch.sh prog/net-plugin/config.json $(WEAV $(SUDO) docker plugin create $(PLUGIN_IMAGE):$(NET_PLUGIN_LATEST) prog/net-plugin touch $@ -$(WEAVEKUBE_UPTODATE): prog/weave-kube/Dockerfile.$(DOCKERHUB_USER) prog/weave-kube/launch.sh $(KUBEPEERS_EXE) $(WEAVER_UPTODATE) - cp $(KUBEPEERS_EXE) prog/weave-kube/ +$(WEAVEKUBE_UPTODATE): prog/weave-kube/Dockerfile.$(DOCKERHUB_USER) prog/weave-kube/launch.sh $(KUBEUTILS_EXE) $(WEAVER_UPTODATE) + cp $(KUBEUTILS_EXE) prog/weave-kube/ $(SUDO) docker build --build-arg=revision=$(GIT_REVISION) -f prog/weave-kube/Dockerfile.$(DOCKERHUB_USER) -t $(WEAVEKUBE_IMAGE) prog/weave-kube touch $@ diff --git a/prog/kube-peers/annotations.go b/prog/kube-utils/annotations.go similarity index 100% rename from prog/kube-peers/annotations.go rename to prog/kube-utils/annotations.go diff --git a/prog/kube-peers/main.go b/prog/kube-utils/main.go similarity index 100% rename from prog/kube-peers/main.go rename to prog/kube-utils/main.go diff --git a/prog/kube-peers/nodestatus.go b/prog/kube-utils/nodestatus.go similarity index 100% rename from prog/kube-peers/nodestatus.go rename to prog/kube-utils/nodestatus.go diff --git a/prog/weave-kube/Dockerfile.template b/prog/weave-kube/Dockerfile.template index 6a674943..0684edcf 100644 --- a/prog/weave-kube/Dockerfile.template +++ b/prog/weave-kube/Dockerfile.template @@ -6,7 +6,7 @@ LABEL maintainer="Weaveworks " \ org.opencontainers.image.source="https://github.com/weaveworks/weave" \ org.opencontainers.image.vendor="Weaveworks" -ADD ./launch.sh ./kube-peers /home/weave/ +ADD ./launch.sh ./kube-utils /home/weave/ ENTRYPOINT ["/home/weave/launch.sh"] # This label will change for every build, and should therefore be the last layer of the image: diff --git a/prog/weave-kube/launch.sh b/prog/weave-kube/launch.sh index 9e1632cd..aeb43d30 100755 --- a/prog/weave-kube/launch.sh +++ b/prog/weave-kube/launch.sh @@ -80,7 +80,7 @@ router_bridge_opts() { } if [ -z "$KUBE_PEERS" ]; then - if ! KUBE_PEERS=$(/home/weave/kube-peers) || [ -z "$KUBE_PEERS" ]; then + if ! KUBE_PEERS=$(/home/weave/kube-utils) || [ -z "$KUBE_PEERS" ]; then echo Failed to get peers >&2 exit 1 fi @@ -105,7 +105,7 @@ fi if [ -f ${DB_PREFIX}data.db ]; then if /usr/bin/weaveutil get-db-flag "$DB_PREFIX" peer-reclaim >/dev/null ; then # If this peer name is not stored in the list then we were removed by another peer. - if /home/weave/kube-peers -check-peer-new -peer-name="$PEERNAME" -log-level=debug ; then + if /home/weave/kube-utils -check-peer-new -peer-name="$PEERNAME" -log-level=debug ; then # In order to avoid a CRDT clash, clean up echo "Peer not in list; removing persisted data" >&2 rm -f ${DB_PREFIX}data.db @@ -139,13 +139,13 @@ post_start_actions() { /home/weave/weave --local setup-cni # Attempt to run the reclaim process, but don't halt the script if it fails - /home/weave/kube-peers -reclaim -node-name="$HOSTNAME" -peer-name="$PEERNAME" -log-level=debug || true + /home/weave/kube-utils -reclaim -node-name="$HOSTNAME" -peer-name="$PEERNAME" -log-level=debug || true # Expose the weave network so host processes can communicate with pods /home/weave/weave --local expose $WEAVE_EXPOSE_IP # Mark network as up - /home/weave/kube-peers -set-node-status -node-name="$HOSTNAME" + /home/weave/kube-utils -set-node-status -node-name="$HOSTNAME" } post_start_actions &