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 &