diff --git a/cluster/gce/util.sh b/cluster/gce/util.sh index 295eb2c7a85..9210ecbcd85 100755 --- a/cluster/gce/util.sh +++ b/cluster/gce/util.sh @@ -429,6 +429,9 @@ EOF function kube-down { # Detect the project into $PROJECT detect-project + + # Monitoring might have been setup. It doesn't hurt to attempt shutdown even it wasn't setup. + teardown-monitoring echo "Bringing down cluster" gcutil deletefirewall \ @@ -569,3 +572,29 @@ function ssh-to-node { function restart-kube-proxy { ssh-to-node "$1" "sudo /etc/init.d/kube-proxy restart" } + +# Setup monitoring using heapster and InfluxDB +function setup-monitoring { + read -p "Setup monitoring of the cluster using heapster (https://github.com/GoogleCloudPlatform/heapster) [Y|N]? " -n 1 -r + echo + if [[ $REPLY =~ ^[Yy]$ ]] + then + teardown-monitoring + kubectl.sh create -f "${KUBE_ROOT}/examples/monitoring/influx-grafana-pod.json" && + kubectl.sh create -f "${KUBE_ROOT}/examples/monitoring/influx-grafana-service.json" && + kubectl.sh create -f "${KUBE_ROOT}/examples/monitoring/heapster-pod.json" + if [ $? -ne 0 ]; then + teardown-monitoring + else + dashboardIP="http://`kubectl.sh get -o json pod influx-grafana | grep hostIP | awk '{print $2}' | sed 's/[,|\"]//g'`" + echo "Grafana dashboard is available at $dashboardIP" + echo "username is 'admin' and password is 'admin'" + fi + fi +} + +function teardown-monitoring { + kubectl.sh delete pods heapster || true + kubectl.sh delete pods influx-grafana || true + kubectl.sh delete services influx-master || true +} \ No newline at end of file diff --git a/cluster/kube-up.sh b/cluster/kube-up.sh index 09466f478d3..c2434d4bf14 100755 --- a/cluster/kube-up.sh +++ b/cluster/kube-up.sh @@ -34,5 +34,6 @@ verify-prereqs kube-up "${KUBE_ROOT}/cluster/validate-cluster.sh" +setup-monitoring echo "Done" diff --git a/examples/monitoring/README.md b/examples/monitoring/README.md new file mode 100644 index 00000000000..37149786a88 --- /dev/null +++ b/examples/monitoring/README.md @@ -0,0 +1,52 @@ +Heapster +=========== + +Heapster enables monitoring of Kubernetes Clusters using [cAdvisor](https://github.com/google/cadvisor). It currently works only on GCE. + +#####Run Heapster in a Kubernetes cluster with an Influxdb backend and [Grafana](http://grafana.org/docs/features/influxdb) + +**Step 1: Setup Kube cluster** + +Fork the Kubernetes repository and [turn up a Kubernetes cluster](https://github.com/GoogleCloudPlatform/kubernetes-new#contents), if you haven't already. Make sure kubectl.sh is exported. + +**Step 2: Start a Pod with Influxdb, grafana and elasticsearch** + +```shell +$ kubectl.sh create -f deploy/influx-grafana-pod.json +``` + +**Step 3: Start Influxdb service** + +```shell +$ kubectl.sh create -f deploy/influx-grafana-service.json +``` + +**Step 4: Update firewall rules** + +Open up ports tcp:80,8083,8086,9200. +```shell +$ gcutil addfirewall --allowed=tcp:80,tcp:8083,tcp:8086,tcp:9200 --target_tags=kubernetes-minion heapster +``` + +**Step 5: Start Heapster Pod** + +```shell +$ kubectl.sh create -f deploy/heapster-pod.json +``` + +Verify that all the pods and services are up and running: + +```shell +$ kubectl.sh get pods +``` +```shell +$ kubectl.sh get services +``` + +To start monitoring the cluster using grafana, find out the the external IP of the minion where the 'influx-grafana' Pod is running from the output of `kubectl.sh get pods`, and visit `http://:80`. + +To access the Influxdb UI visit `http://:8083`. + +#####Hints +* Grafana's default username and password is 'admin'. You can change that by modifying the grafana container [here](influx-grafana/deploy/grafana-influxdb-pod.json) +* To enable memory and swap accounting on the minions follow the instructions [here](https://docs.docker.com/installation/ubuntulinux/#memory-and-swap-accounting) diff --git a/examples/monitoring/heapster-pod.json b/examples/monitoring/heapster-pod.json new file mode 100644 index 00000000000..7ecbc505b26 --- /dev/null +++ b/examples/monitoring/heapster-pod.json @@ -0,0 +1,18 @@ +{ + "id": "heapster", + "kind": "Pod", + "apiVersion": "v1beta1", + "desiredState": { + "manifest": { + "version": "v1beta1", + "id": "heapster", + "containers": [{ + "name": "heapster", + "image": "kubernetes/heapster", + }] + } + }, + "labels": { + "name": "heapster", + } +} diff --git a/examples/monitoring/influx-grafana-pod.json b/examples/monitoring/influx-grafana-pod.json new file mode 100644 index 00000000000..001ecdda1bc --- /dev/null +++ b/examples/monitoring/influx-grafana-pod.json @@ -0,0 +1,34 @@ +{ + "id": "influx-grafana", + "kind": "Pod", + "apiVersion": "v1beta1", + "desiredState": { + "manifest": { + "version": "v1beta1", + "id": "influx-grafana", + "containers": [{ + "name": "influxdb", + "image": "kubernetes/heapster_influxdb", + "ports": [ + {"containerPort": 8083, "hostPort": 8083}, + {"containerPort": 8086, "hostPort": 8086}, + {"containerPort": 8090, "hostPort": 8090}, + {"containerPort": 8099, "hostPort": 8099}] + }, { + "name": "grafana", + "image": "kubernetes/heapster_grafana", + "ports": [{"containerPort": 80, "hostPort": 80}], + "env": [{"name": HTTP_USER, "value": admin}, + {"name": HTTP_PASS, "value": admin}], + }, { + "name": "elasticsearch", + "image": "dockerfile/elasticsearch", + "ports": [{"containerPort": 9200, "hostPort": 9200}, + {"containerPort": 9300}], + }] + }, + }, + "labels": { + "name": "influxdb", + } +} diff --git a/examples/monitoring/influx-grafana-service.json b/examples/monitoring/influx-grafana-service.json new file mode 100644 index 00000000000..18e7bca4c8a --- /dev/null +++ b/examples/monitoring/influx-grafana-service.json @@ -0,0 +1,10 @@ +{ + "id": "influx-master", + "kind": "Service", + "apiVersion": "v1beta1", + "port": 8085, + "containerPort": 8086, + "provider": "kubernetes-default", + "component": "influxdb" + "selector": { "name": "influxdb" } +} \ No newline at end of file