From 427d694e1b225a0c5ee65adcc9418b69caf68220 Mon Sep 17 00:00:00 2001 From: Murali Reddy Date: Wed, 17 Oct 2018 21:08:53 +0530 Subject: [PATCH] add checkpoint to include Kubernetes cluster information Fixes #3324 --- prog/weaver/checkpoint.go | 56 ++++++++++++++++++++++++++++++++++----- prog/weaver/main.go | 2 +- 2 files changed, 50 insertions(+), 8 deletions(-) diff --git a/prog/weaver/checkpoint.go b/prog/weaver/checkpoint.go index 2c26315d..7a82564a 100644 --- a/prog/weaver/checkpoint.go +++ b/prog/weaver/checkpoint.go @@ -1,12 +1,17 @@ package main import ( + "os" + "strconv" "sync/atomic" "syscall" "time" - "github.com/weaveworks/go-checkpoint" + checkpoint "github.com/weaveworks/go-checkpoint" weave "github.com/weaveworks/weave/router" + api "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/client-go/kubernetes" + "k8s.io/client-go/rest" ) var checker *checkpoint.Checker @@ -14,10 +19,12 @@ var newVersion atomic.Value var success atomic.Value const ( - updateCheckPeriod = 6 * time.Hour + updateCheckPeriod = 6 * time.Hour + configMapName = "weave-net" + configMapNamespace = "kube-system" ) -func checkForUpdates(dockerVersion string, router *weave.NetworkRouter) { +func checkForUpdates(dockerVersion string, router *weave.NetworkRouter, peers []string) { newVersion.Store("") success.Store(true) @@ -48,10 +55,11 @@ func checkForUpdates(dockerVersion string, router *weave.NetworkRouter) { } kernelVersion := string(releaseBytes[:i]) - flags := map[string]string{ - "docker-version": dockerVersion, - "kernel-version": kernelVersion, - } + flags := make(map[string]string) + flags["docker-version"] = dockerVersion + flags["kernel-version"] = kernelVersion + + checkpointKubernetes(flags, peers) // Start background version checking params := checkpoint.CheckParams{ @@ -77,3 +85,37 @@ func checkpointFlags(router *weave.NetworkRouter) []checkpoint.Flag { } return flags } + +// checkpoint Kubernetes specific details +func checkpointKubernetes(flags map[string]string, peers []string) { + // checks if weaver is running in Kubernetes + host := os.Getenv("KUBERNETES_SERVICE_HOST") + if len(host) == 0 { + return + } + config, err := rest.InClusterConfig() + if err != nil { + Log.Printf("Could not get Kubernetes in-cluster config: %v", err) + return + } + c, err := kubernetes.NewForConfig(config) + if err != nil { + Log.Printf("Could not make Kubernetes client: %v", err) + return + } + k8sVersion, err := c.Discovery().ServerVersion() + if err != nil { + Log.Printf("Could not get Kubernetes version: %v", err) + return + } + flags["kubernetes-version"] = k8sVersion.String() + + // use UID of `weave-net` configmap as unique ID of the Kubenerets cluster + cm, err := c.CoreV1().ConfigMaps(configMapNamespace).Get(configMapName, api.GetOptions{}) + if err != nil { + Log.Printf("Unable to fetch ConfigMap %s/%s to infer unique cluster ID", configMapNamespace, configMapName) + return + } + flags["kubernetes-cluster-uid"] = string(cm.ObjectMeta.UID) + flags["kubernetes-cluster-size"] = strconv.Itoa(len(peers)) +} diff --git a/prog/weaver/main.go b/prog/weaver/main.go index 22e0ca23..2af51472 100644 --- a/prog/weaver/main.go +++ b/prog/weaver/main.go @@ -385,7 +385,7 @@ func main() { dockerVersion = dockerCli.DockerVersion() } - checkForUpdates(dockerVersion, router) + checkForUpdates(dockerVersion, router, peers) observeContainers := func(o docker.ContainerObserver) { if dockerCli != nil {