diff --git a/prog/weaver/checkpoint.go b/prog/weaver/checkpoint.go index 2c26315d..7731f000 100644 --- a/prog/weaver/checkpoint.go +++ b/prog/weaver/checkpoint.go @@ -1,12 +1,17 @@ package main import ( + "fmt" + "os" "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, clusterSize uint) { newVersion.Store("") success.Store(true) @@ -53,6 +60,8 @@ func checkForUpdates(dockerVersion string, router *weave.NetworkRouter) { "kernel-version": kernelVersion, } + checkpointKubernetes(flags, clusterSize) + // Start background version checking params := checkpoint.CheckParams{ Product: "weave-net", @@ -77,3 +86,37 @@ func checkpointFlags(router *weave.NetworkRouter) []checkpoint.Flag { } return flags } + +// checkpoint Kubernetes specific details +func checkpointKubernetes(flags map[string]string, clusterSize uint) { + // 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"] = fmt.Sprint(clusterSize) +} diff --git a/prog/weaver/main.go b/prog/weaver/main.go index 22e0ca23..abd2ad6d 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, uint(len(peers))) observeContainers := func(o docker.ContainerObserver) { if dockerCli != nil {