{"action":"created","comment":{"url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/comments/60468415","id":60468415,"diff_hunk":"@@ -0,0 +1,437 @@\n+#!/bin/bash\n+\n+# Copyright 2016 The Kubernetes Authors All rights reserved.\n+#\n+# Licensed under the Apache License, Version 2.0 (the \"License\");\n+# you may not use this file except in compliance with the License.\n+# You may obtain a copy of the License at\n+#\n+#     http://www.apache.org/licenses/LICENSE-2.0\n+#\n+# Unless required by applicable law or agreed to in writing, software\n+# distributed under the License is distributed on an \"AS IS\" BASIS,\n+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n+# See the License for the specific language governing permissions and\n+# limitations under the License.\n+\n+# Utility functions for Kubernetes in docker setup\n+# Authors @luxas @wizard_cxy @resouer @loopingz \n+\n+# Variables\n+K8S_VERSION=${K8S_VERSION:-\"1.2.0-alpha.8\"}\n+ETCD_VERSION=${ETCD_VERSION:-\"2.2.1\"}\n+FLANNEL_VERSION=${FLANNEL_VERSION:-\"0.5.5\"}\n+FLANNEL_IFACE=${FLANNEL_IFACE:-\"eth0\"}\n+FLANNEL_IPMASQ=${FLANNEL_IPMASQ:-\"true\"}\n+FLANNEL_BACKEND=${FLANNEL_BACKEND:-\"vxlan\"}\n+FLANNEL_NETWORK=${FLANNEL_NETWORK:-\"10.1.0.0/16\"}\n+DNS_DOMAIN=${DNS_DOMAIN:-\"cluster.local\"}\n+DNS_SERVER_IP=${DNS_SERVER_IP:-\"10.0.0.10\"}\n+RESTART_POLICY=${RESTART_POLICY:-\"on-failure\"}\n+ARCH=${ARCH:-\"amd64\"}\n+\n+# Constants\n+TIMEOUT_FOR_SERVICES=20\n+BOOTSTRAP_DOCKER_SOCK=\"unix:///var/run/docker-bootstrap.sock\"\n+KUBELET_MOUNTS=\"\\\n+  -v /sys:/sys:ro \\\n+  -v /var/run:/var/run:rw \\\n+  -v /:/rootfs:ro \\\n+  -v /var/lib/docker/:/var/lib/docker:rw \\\n+  -v /var/lib/kubelet/:/var/lib/kubelet:rw\"\n+\n+# Paths\n+FLANNEL_SUBNET_TMPDIR=$(mktemp -d)\n+KUBE_ROOT=$(dirname \"${BASH_SOURCE}\")/../../..\n+\n+# Source useful scripts\n+source \"${KUBE_ROOT}/hack/lib/util.sh\"\n+source \"${KUBE_ROOT}/cluster/lib/logging.sh\"\n+\n+# Trap errors\n+kube::log::install_errexit\n+\n+# Ensure everything is OK, docker is running and we're root\n+kube::multinode::check_params() {\n+\n+  # Make sure docker daemon is running\n+  if [[ $(docker ps 2>&1 1>/dev/null; echo $?) != 0 ]]; then\n+    kube::log::error \"Docker is not running on this machine!\"\n+    exit 1\n+  fi\n+\n+  # Require root\n+  if [[ \"$(id -u)\" != \"0\" ]]; then\n+    kube::log::error >&2 \"Please run as root\"\n+    exit 1\n+  fi\n+\n+  # Output the value of the variables\n+  kube::log::status \"K8S_VERSION is set to: ${K8S_VERSION}\"\n+  kube::log::status \"ETCD_VERSION is set to: ${ETCD_VERSION}\"\n+  kube::log::status \"FLANNEL_VERSION is set to: ${FLANNEL_VERSION}\"\n+  kube::log::status \"FLANNEL_IFACE is set to: ${FLANNEL_IFACE}\"\n+  kube::log::status \"FLANNEL_IPMASQ is set to: ${FLANNEL_IPMASQ}\"\n+  kube::log::status \"FLANNEL_NETWORK is set to: ${FLANNEL_NETWORK}\"\n+  kube::log::status \"FLANNEL_BACKEND is set to: ${FLANNEL_BACKEND}\"\n+  kube::log::status \"DNS_DOMAIN is set to: ${DNS_DOMAIN}\"\n+  kube::log::status \"DNS_SERVER_IP is set to: ${DNS_SERVER_IP}\"\n+  kube::log::status \"RESTART_POLICY is set to: ${RESTART_POLICY}\"\n+  kube::log::status \"MASTER_IP is set to: ${MASTER_IP}\"\n+  kube::log::status \"ARCH is set to: ${ARCH}\"\n+  kube::log::status \"--------------------------------------------\"\n+}\n+\n+# Detect the OS distro, we support ubuntu, debian, mint, centos, fedora and systemd dist\n+kube::multinode::detect_lsb() {\n+\n+  # TODO(luxas): add support for arm, arm64 and ppc64le\n+  case \"$(kube::util::host_platform)\" in\n+    linux/amd64)\n+      ;;\n+    *)\n+      kube::log::error \"Error: We currently only support the linux/amd64 platform.\"\n+      exit 1\n+      ;;\n+  esac\n+\n+  if kube::helpers::command_exists lsb_release; then\n+    lsb_dist=\"$(lsb_release -si)\"\n+  elif [[ -r /etc/lsb-release ]]; then\n+    lsb_dist=\"$(. /etc/lsb-release && echo \"$DISTRIB_ID\")\"\n+  elif [[ -r /etc/debian_version ]]; then\n+    lsb_dist='debian'\n+  elif [[ -r /etc/fedora-release ]]; then\n+    lsb_dist='fedora'\n+  elif [[ -r /etc/os-release ]]; then\n+    lsb_dist=\"$(. /etc/os-release && echo \"$ID\")\"\n+  elif kube::helpers::command_exists systemctl; then\n+    lsb_dist='systemd'\n+  fi\n+\n+  lsb_dist=\"$(echo ${lsb_dist} | tr '[:upper:]' '[:lower:]')\"\n+\n+  case \"${lsb_dist}\" in\n+      amzn|centos|debian|ubuntu|systemd)\n+          ;;\n+      *)\n+          kube::log::error \"Error: We currently only support ubuntu|debian|amzn|centos|systemd.\"\n+          exit 1\n+          ;;\n+  esac\n+\n+  kube::log::status \"Detected OS: ${lsb_dist}\"\n+}\n+\n+# Start a docker bootstrap for running etcd and flannel\n+kube::multinode::bootstrap_daemon() {\n+\n+  kube::log::status \"Launching docker bootstrap...\"\n+\n+  docker daemon \\\n+    -H ${BOOTSTRAP_DOCKER_SOCK} \\\n+    -p /var/run/docker-bootstrap.pid \\\n+    --iptables=false \\\n+    --ip-masq=false \\\n+    --bridge=none \\\n+    --graph=/var/lib/docker-bootstrap \\\n+      2> /var/log/docker-bootstrap.log \\\n+      1> /dev/null &\n+\n+  # Wait for docker bootstrap to start by \"docker ps\"-ing every second\n+  local BOOTSTRAP_SECONDS=0\n+  while [[ $(docker -H ${BOOTSTRAP_DOCKER_SOCK} ps 2>&1 1>/dev/null; echo $?) != 0 ]]; do\n+    ((BOOTSTRAP_SECONDS++))\n+    if [[ ${BOOTSTRAP_SECONDS} == ${TIMEOUT_FOR_SERVICES} ]]; then\n+      kube::log::error \"docker bootstrap failed to start. Exiting...\"\n+      exit\n+    fi\n+    sleep 1\n+  done\n+}\n+\n+# Start etcd on the master node\n+kube::multinode::start_etcd() {\n+\n+  kube::log::status \"Launching etcd...\"\n+  \n+  docker -H ${BOOTSTRAP_DOCKER_SOCK} run -d \\\n+    --restart=${RESTART_POLICY} \\\n+    --net=host \\\n+    gcr.io/google_containers/etcd-${ARCH}:${ETCD_VERSION} \\\n+    /usr/local/bin/etcd \\\n+      --listen-client-urls=http://127.0.0.1:4001,http://${MASTER_IP}:4001 \\\n+      --advertise-client-urls=http://${MASTER_IP}:4001 \\\n+      --data-dir=/var/etcd/data\n+\n+  # Wait for etcd to come up\n+  kube::util::wait_for_url \"http://localhost:4001/v2/machines\" \"etcd\" 0.25 80\n+\n+  # Set flannel net config\n+  docker -H ${BOOTSTRAP_DOCKER_SOCK} run \\\n+      --net=host \\\n+      gcr.io/google_containers/etcd-${ARCH}:${ETCD_VERSION} \\\n+      etcdctl \\\n+      set /coreos.com/network/config \\\n+          \"{ \\\"Network\\\": \\\"${FLANNEL_NETWORK}\\\", \\\"Backend\\\": {\\\"Type\\\": \\\"${FLANNEL_BACKEND}\\\"}}\"\n+\n+  sleep 2\n+}\n+\n+# Start flannel in docker bootstrap, both for master and worker\n+kube::multinode::start_flannel() {\n+\n+  kube::log::status \"Launching flannel...\"\n+\n+  docker -H ${BOOTSTRAP_DOCKER_SOCK} run \\\n+    --restart=${RESTART_POLICY} \\\n+    -d \\\n+    --net=host \\\n+    --privileged \\\n+    -v /dev/net:/dev/net \\\n+    -v ${FLANNEL_SUBNET_TMPDIR}:/run/flannel \\\n+    quay.io/coreos/flannel:${FLANNEL_VERSION} \\\n+    /opt/bin/flanneld \\\n+      --etcd-endpoints=http://${MASTER_IP}:4001 \\\n+      --ip-masq=\"${FLANNEL_IPMASQ}\" \\\n+      --iface=\"${FLANNEL_IFACE}\"\n+\n+  # Wait for the flannel subnet.env file to be created instead of a timeout. This is faster and more reliable\n+  local FLANNEL_SECONDS=0\n+  while [[ ! -f ${FLANNEL_SUBNET_TMPDIR}/subnet.env ]]; do\n+    ((FLANNEL_SECONDS++))\n+    if [[ ${FLANNEL_SECONDS} == 20 ]]; then\n+      kube::log::error \"flannel failed to start. Exiting...\"\n+      exit\n+    fi\n+    sleep 1\n+  done\n+\n+  source ${FLANNEL_SUBNET_TMPDIR}/subnet.env\n+\n+  kube::log::status \"FLANNEL_SUBNET is set to: ${FLANNEL_SUBNET}\"\n+  kube::log::status \"FLANNEL_MTU is set to: ${FLANNEL_MTU}\"\n+}\n+\n+# Configure docker net settings, then restart it\n+kube::multinode::restart_docker(){\n+\n+  case \"${lsb_dist}\" in\n+    amzn)\n+      DOCKER_CONF=\"/etc/sysconfig/docker\"\n+\n+      kube::helpers::file_replace_line ${DOCKER_CONF} \\ # Replace content in this file\n+        \"--bip\" \\ # Find a line with this content...\n+        \"OPTIONS=\\\"\\$OPTIONS --mtu=${FLANNEL_MTU} --bip=${FLANNEL_SUBNET}\\\"\" # ...and replace the found line with this line\n+\n+      ifconfig docker0 down\n+      yum -y -q install bridge-utils \n+      brctl delbr docker0 \n+      service docker restart\n+      ;;\n+    centos)\n+      DOCKER_CONF=\"/etc/sysconfig/docker\"\n+\n+      kube::helpers::file_replace_line ${DOCKER_CONF} \\ # Replace content in this file\n+        \"--bip\" \\ # Find a line with this content...\n+        \"OPTIONS=\\\"\\$OPTIONS --mtu=${FLANNEL_MTU} --bip=${FLANNEL_SUBNET}\\\"\" # ...and replace the found line with this line\n+      \n+      if ! kube::helpers::command_exists ifconfig; then\n+          yum -y -q install net-tools\n+      fi\n+\n+      yum -y -q install bridge-utils\n+      ifconfig docker0 down\n+      brctl delbr docker0 \n+      systemctl restart docker\n+      ;;\n+    ubuntu|debian)\n+      # Newer ubuntu and debian releases uses systemd. Handle that\n+      if kube::helpers::command_exists systemctl; then\n+        kube::multinode::restart_docker_systemd\n+      else\n+        DOCKER_CONF=\"/etc/default/docker\"\n+        \n+        kube::helpers::file_replace_line ${DOCKER_CONF} \\ # Replace content in this file\n+          \"--bip\" \\ # Find a line with this content...\n+          \"OPTIONS=\\\"\\$OPTIONS --mtu=${FLANNEL_MTU} --bip=${FLANNEL_SUBNET}\\\"\" # ...and replace the found line with this line\n+\n+        apt-get install -y bridge-utils \n+        brctl delbr docker0 \n+        service docker stop\n+        while [ $(ps aux | grep /usr/bin/docker | grep -v grep | wc -l) -gt 0 ]; do\n+            kube::log::status \"Waiting for docker to terminate\"\n+            sleep 1\n+        done\n+        service docker start\n+      fi\n+      ;;\n+    systemd)\n+      kube::multinode::restart_docker_systemd\n+      ;;\n+    *)\n+        kube::log::error \"Unsupported operations system ${lsb_dist}\"\n+        exit 1\n+        ;;\n+  esac\n+\n+  kube::log::status \"Restarted docker with the new flannel settings\"\n+}\n+\n+# Replace --mtu and --bip in systemd's docker.service file and restart\n+kube::multinode::restart_docker_systemd(){\n+\n+  DOCKER_CONF=\"/lib/systemd/system/docker.service\"\n+\n+  # This expression checks if the \"--mtu\" and \"--bip\" options are there\n+  # If they aren't, they are inserted at the end of the docker command\n+  if [[ -z $(grep -- \"--mtu=\" $DOCKER_CONF) ]]; then\n+    sed -e \"s@$(grep \"/usr/bin/docker\" $DOCKER_CONF)@$(grep \"/usr/bin/docker\" $DOCKER_CONF) --mtu=${FLANNEL_MTU}@g\" -i $DOCKER_CONF\n+  fi\n+  if [[ -z $(grep -- \"--bip=\" $DOCKER_CONF) ]]; then\n+    sed -e \"s@$(grep \"/usr/bin/docker\" $DOCKER_CONF)@$(grep \"/usr/bin/docker\" $DOCKER_CONF) --bip=${FLANNEL_SUBNET}@g\" -i $DOCKER_CONF\n+  fi\n+\n+  # Finds \"--mtu=????\" and replaces with \"--mtu=${FLANNEL_MTU}\"\n+  # Also finds \"--bip=??.??.??.??\" and replaces with \"--bip=${FLANNEL_SUBNET}\"\n+  sed -e \"s@$(grep -o -- \"--mtu=[[:graph:]]*\" $DOCKER_CONF)@--mtu=${FLANNEL_MTU}@g;s@$(grep -o -- \"--bip=[[:graph:]]*\" $DOCKER_CONF)@--bip=${FLANNEL_SUBNET}@g\" -i $DOCKER_CONF\n+\n+  systemctl daemon-reload\n+  systemctl restart docker\n+}\n+\n+# Start kubelet first and then the master components as pods\n+kube::multinode::start_k8s_master() {\n+  \n+  kube::log::status \"Launching Kubernetes master components...\"\n+\n+  docker run -d \\\n+    --net=host \\\n+    --pid=host \\\n+    --privileged \\\n+    --restart=${RESTART_POLICY} \\\n+    ${KUBELET_MOUNTS} \\\n+    gcr.io/google_containers/hyperkube-${ARCH}:v${K8S_VERSION} \\\n+    /hyperkube kubelet \\\n+      --allow-privileged=true \\\n+      --api-servers=http://localhost:8080 \\\n+      --config=/etc/kubernetes/manifests-multi \\\n+      --cluster-dns=${DNS_SERVER_IP} \\\n+      --cluster-domain=${DNS_DOMAIN} \\\n+      --containerized \\\n+      --v=2\n+}\n+\n+# Start kubelet in a container, for a worker node\n+kube::multinode::start_k8s_worker() {\n+  \n+  kube::log::status \"Launching Kubernetes worker components...\"\n+\n+  # TODO: Use secure port for communication\n+  docker run -d \\\n+    --net=host \\\n+    --pid=host \\\n+    --privileged \\\n+    --restart=${RESTART_POLICY} \\\n+    ${KUBELET_MOUNTS} \\\n+    gcr.io/google_containers/hyperkube-${ARCH}:v${K8S_VERSION} \\\n+    /hyperkube kubelet \\\n+      --allow-privileged=true \\\n+      --api-servers=http://${MASTER_IP}:8080 \\\n+      --cluster-dns=${DNS_SERVER_IP} \\","path":"docs/getting-started-guides/docker-multinode/common.sh","position":341,"original_position":341,"commit_id":"ac6a8ec7e904ce5ed22b91019248b7b12f9d9569","original_commit_id":"ac6a8ec7e904ce5ed22b91019248b7b12f9d9569","user":{"login":"jimmyjones2","id":2991805,"avatar_url":"https://avatars.githubusercontent.com/u/2991805?v=3","gravatar_id":"","url":"https://api.github.com/users/jimmyjones2","html_url":"https://github.com/jimmyjones2","followers_url":"https://api.github.com/users/jimmyjones2/followers","following_url":"https://api.github.com/users/jimmyjones2/following{/other_user}","gists_url":"https://api.github.com/users/jimmyjones2/gists{/gist_id}","starred_url":"https://api.github.com/users/jimmyjones2/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jimmyjones2/subscriptions","organizations_url":"https://api.github.com/users/jimmyjones2/orgs","repos_url":"https://api.github.com/users/jimmyjones2/repos","events_url":"https://api.github.com/users/jimmyjones2/events{/privacy}","received_events_url":"https://api.github.com/users/jimmyjones2/received_events","type":"User","site_admin":false},"body":"The [guide](http://kubernetes.io/docs/getting-started-guides/docker-multinode/worker/) also has `--address=0.0.0.0 --enable-server` Which is right?","created_at":"2016-04-20T19:03:06Z","updated_at":"2016-04-20T19:03:06Z","html_url":"https://github.com/kubernetes/kubernetes/pull/21646#discussion_r60468415","pull_request_url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/21646","_links":{"self":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/comments/60468415"},"html":{"href":"https://github.com/kubernetes/kubernetes/pull/21646#discussion_r60468415"},"pull_request":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/21646"}}},"pull_request":{"url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/21646","id":60103140,"html_url":"https://github.com/kubernetes/kubernetes/pull/21646","diff_url":"https://github.com/kubernetes/kubernetes/pull/21646.diff","patch_url":"https://github.com/kubernetes/kubernetes/pull/21646.patch","issue_url":"https://api.github.com/repos/kubernetes/kubernetes/issues/21646","number":21646,"state":"open","locked":false,"title":"WIP: Refactor docker-multinode and add a turndown script","user":{"login":"luxas","id":5442475,"avatar_url":"https://avatars.githubusercontent.com/u/5442475?v=3","gravatar_id":"","url":"https://api.github.com/users/luxas","html_url":"https://github.com/luxas","followers_url":"https://api.github.com/users/luxas/followers","following_url":"https://api.github.com/users/luxas/following{/other_user}","gists_url":"https://api.github.com/users/luxas/gists{/gist_id}","starred_url":"https://api.github.com/users/luxas/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/luxas/subscriptions","organizations_url":"https://api.github.com/users/luxas/orgs","repos_url":"https://api.github.com/users/luxas/repos","events_url":"https://api.github.com/users/luxas/events{/privacy}","received_events_url":"https://api.github.com/users/luxas/received_events","type":"User","site_admin":false},"body":"**Work in progress**\r\n\r\nFeel free to comment on it. Tested on Ubuntu 15.04\r\nRefactor the `docker-multinode` into a `common.sh` script. Format the output nicely. Uses a `while` loop instead of a `sleep` timeout while waiting for `docker-bootstrap`, `flannel` and `etcd`, which makes it much faster and reliable. Kills running services before starting again and adds a `turndown` script. Replaces `--bip` and `--mtu` docker args instead of appending which makes it possible to run the same script multiple times without editing files by hand. Many variables are now easily editable by `export`ing.\r\n```console\r\n$ sudo ./master.sh\r\n+++ [0221 22:41:03] K8S_VERSION is set to: 1.2.0-alpha.8\r\n+++ [0221 22:41:03] ETCD_VERSION is set to: 2.2.1\r\n+++ [0221 22:41:03] FLANNEL_VERSION is set to: 0.5.5\r\n+++ [0221 22:41:03] FLANNEL_IFACE is set to: eth0\r\n+++ [0221 22:41:03] FLANNEL_IPMASQ is set to: true\r\n+++ [0221 22:41:03] FLANNEL_NETWORK is set to: 10.1.0.0/16\r\n+++ [0221 22:41:03] FLANNEL_BACKEND is set to: vxlan\r\n+++ [0221 22:41:03] DNS_DOMAIN is set to: cluster.local\r\n+++ [0221 22:41:03] DNS_SERVER_IP is set to: 10.0.0.10\r\n+++ [0221 22:41:03] RESTART_POLICY is set to: on-failure\r\n+++ [0221 22:41:03] MASTER_IP is set to: 192.168.1.130\r\n+++ [0221 22:41:03] ARCH is set to: amd64\r\n+++ [0221 22:41:03] --------------------------------------------\r\n+++ [0221 22:41:03] Detected OS: ubuntu\r\n+++ [0221 22:41:03] Killing docker bootstrap...\r\na02ada8c0dcb\r\ndb252891ed57\r\n+++ [0221 22:41:04] Killing hyperkube containers...\r\n0edf63a11b84\r\n54a5a889762b\r\nfed2f5261272\r\ne5e064c9fe28\r\n97adbc8a0b50\r\nd74d2daa3810\r\n+++ [0221 22:41:34] Killing pause containers...\r\nf2d59059d2d3\r\n5429b04089e8\r\nDo you want to clean /var/lib/kubelet? [Y/n] y\r\n+++ [0221 22:43:22] Launching docker bootstrap...\r\n+++ [0221 22:43:23] Launching etcd...\r\nb5228fb3ccc5a90e7b10d43173003859a44ea2e21155433d024f2e204ff84964\r\n+++ [0221 22:43:24] On try 1, etcd: \r\n{ \"Network\": \"10.1.0.0/16\", \"Backend\": {\"Type\": \"vxlan\"}}\r\n+++ [0221 22:43:26] Launching flannel...\r\need14d245a86182ed1c87150a36cab11a9e1731e8415ac5cf7d46d3581c4ea1f\r\n+++ [0221 22:43:28] FLANNEL_SUBNET is set to: 10.1.90.1/24\r\n+++ [0221 22:43:28] FLANNEL_MTU is set to: 1450\r\n+++ [0221 22:43:29] Restarted docker with the new flannel settings\r\n+++ [0221 22:43:29] Launching Kubernetes master components...\r\nfa7c7594e5d41f216852f55aa96a8b296bd2be123a87ff37fb7ccc8663f60f54\r\n+++ [0221 22:43:30] Done. It will take some minutes before apiserver is up though\r\n\r\n```\r\n\r\nAlso replaced `etcd` and `hyperkube` with `etcd-amd64` and `hyperkube-amd64`. Updated some testing docs.\r\nDo you think this should target `v1.2` or `v1.3`?\r\n@fgrzadkowski @dalanlan @brendandburns @resouer @thockin @loopingz","created_at":"2016-02-21T20:44:18Z","updated_at":"2016-04-20T19:03:06Z","closed_at":null,"merged_at":null,"merge_commit_sha":"8cb2128e32683014bba17f7ab15557543814995e","assignee":{"login":"thockin","id":5595220,"avatar_url":"https://avatars.githubusercontent.com/u/5595220?v=3","gravatar_id":"","url":"https://api.github.com/users/thockin","html_url":"https://github.com/thockin","followers_url":"https://api.github.com/users/thockin/followers","following_url":"https://api.github.com/users/thockin/following{/other_user}","gists_url":"https://api.github.com/users/thockin/gists{/gist_id}","starred_url":"https://api.github.com/users/thockin/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/thockin/subscriptions","organizations_url":"https://api.github.com/users/thockin/orgs","repos_url":"https://api.github.com/users/thockin/repos","events_url":"https://api.github.com/users/thockin/events{/privacy}","received_events_url":"https://api.github.com/users/thockin/received_events","type":"User","site_admin":false},"milestone":null,"commits_url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/21646/commits","review_comments_url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/21646/comments","review_comment_url":"https://api.github.com/repos/kubernetes/kubernetes/pulls/comments{/number}","comments_url":"https://api.github.com/repos/kubernetes/kubernetes/issues/21646/comments","statuses_url":"https://api.github.com/repos/kubernetes/kubernetes/statuses/ac6a8ec7e904ce5ed22b91019248b7b12f9d9569","head":{"label":"luxas:refactor_docker_multinode","ref":"refactor_docker_multinode","sha":"ac6a8ec7e904ce5ed22b91019248b7b12f9d9569","user":{"login":"luxas","id":5442475,"avatar_url":"https://avatars.githubusercontent.com/u/5442475?v=3","gravatar_id":"","url":"https://api.github.com/users/luxas","html_url":"https://github.com/luxas","followers_url":"https://api.github.com/users/luxas/followers","following_url":"https://api.github.com/users/luxas/following{/other_user}","gists_url":"https://api.github.com/users/luxas/gists{/gist_id}","starred_url":"https://api.github.com/users/luxas/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/luxas/subscriptions","organizations_url":"https://api.github.com/users/luxas/orgs","repos_url":"https://api.github.com/users/luxas/repos","events_url":"https://api.github.com/users/luxas/events{/privacy}","received_events_url":"https://api.github.com/users/luxas/received_events","type":"User","site_admin":false},"repo":{"id":37801743,"name":"kubernetes","full_name":"luxas/kubernetes","owner":{"login":"luxas","id":5442475,"avatar_url":"https://avatars.githubusercontent.com/u/5442475?v=3","gravatar_id":"","url":"https://api.github.com/users/luxas","html_url":"https://github.com/luxas","followers_url":"https://api.github.com/users/luxas/followers","following_url":"https://api.github.com/users/luxas/following{/other_user}","gists_url":"https://api.github.com/users/luxas/gists{/gist_id}","starred_url":"https://api.github.com/users/luxas/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/luxas/subscriptions","organizations_url":"https://api.github.com/users/luxas/orgs","repos_url":"https://api.github.com/users/luxas/repos","events_url":"https://api.github.com/users/luxas/events{/privacy}","received_events_url":"https://api.github.com/users/luxas/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/luxas/kubernetes","description":"Container Cluster Manager from Google","fork":true,"url":"https://api.github.com/repos/luxas/kubernetes","forks_url":"https://api.github.com/repos/luxas/kubernetes/forks","keys_url":"https://api.github.com/repos/luxas/kubernetes/keys{/key_id}","collaborators_url":"https://api.github.com/repos/luxas/kubernetes/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/luxas/kubernetes/teams","hooks_url":"https://api.github.com/repos/luxas/kubernetes/hooks","issue_events_url":"https://api.github.com/repos/luxas/kubernetes/issues/events{/number}","events_url":"https://api.github.com/repos/luxas/kubernetes/events","assignees_url":"https://api.github.com/repos/luxas/kubernetes/assignees{/user}","branches_url":"https://api.github.com/repos/luxas/kubernetes/branches{/branch}","tags_url":"https://api.github.com/repos/luxas/kubernetes/tags","blobs_url":"https://api.github.com/repos/luxas/kubernetes/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/luxas/kubernetes/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/luxas/kubernetes/git/refs{/sha}","trees_url":"https://api.github.com/repos/luxas/kubernetes/git/trees{/sha}","statuses_url":"https://api.github.com/repos/luxas/kubernetes/statuses/{sha}","languages_url":"https://api.github.com/repos/luxas/kubernetes/languages","stargazers_url":"https://api.github.com/repos/luxas/kubernetes/stargazers","contributors_url":"https://api.github.com/repos/luxas/kubernetes/contributors","subscribers_url":"https://api.github.com/repos/luxas/kubernetes/subscribers","subscription_url":"https://api.github.com/repos/luxas/kubernetes/subscription","commits_url":"https://api.github.com/repos/luxas/kubernetes/commits{/sha}","git_commits_url":"https://api.github.com/repos/luxas/kubernetes/git/commits{/sha}","comments_url":"https://api.github.com/repos/luxas/kubernetes/comments{/number}","issue_comment_url":"https://api.github.com/repos/luxas/kubernetes/issues/comments{/number}","contents_url":"https://api.github.com/repos/luxas/kubernetes/contents/{+path}","compare_url":"https://api.github.com/repos/luxas/kubernetes/compare/{base}...{head}","merges_url":"https://api.github.com/repos/luxas/kubernetes/merges","archive_url":"https://api.github.com/repos/luxas/kubernetes/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/luxas/kubernetes/downloads","issues_url":"https://api.github.com/repos/luxas/kubernetes/issues{/number}","pulls_url":"https://api.github.com/repos/luxas/kubernetes/pulls{/number}","milestones_url":"https://api.github.com/repos/luxas/kubernetes/milestones{/number}","notifications_url":"https://api.github.com/repos/luxas/kubernetes/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/luxas/kubernetes/labels{/name}","releases_url":"https://api.github.com/repos/luxas/kubernetes/releases{/id}","deployments_url":"https://api.github.com/repos/luxas/kubernetes/deployments","created_at":"2015-06-21T08:14:15Z","updated_at":"2016-01-11T14:11:00Z","pushed_at":"2016-04-20T18:24:54Z","git_url":"git://github.com/luxas/kubernetes.git","ssh_url":"git@github.com:luxas/kubernetes.git","clone_url":"https://github.com/luxas/kubernetes.git","svn_url":"https://github.com/luxas/kubernetes","homepage":"http://kubernetes.io","size":188361,"stargazers_count":0,"watchers_count":0,"language":"Go","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"kubernetes:master","ref":"master","sha":"1ce188e557769353063dc2233c89f4fa02133ecc","user":{"login":"kubernetes","id":13629408,"avatar_url":"https://avatars.githubusercontent.com/u/13629408?v=3","gravatar_id":"","url":"https://api.github.com/users/kubernetes","html_url":"https://github.com/kubernetes","followers_url":"https://api.github.com/users/kubernetes/followers","following_url":"https://api.github.com/users/kubernetes/following{/other_user}","gists_url":"https://api.github.com/users/kubernetes/gists{/gist_id}","starred_url":"https://api.github.com/users/kubernetes/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kubernetes/subscriptions","organizations_url":"https://api.github.com/users/kubernetes/orgs","repos_url":"https://api.github.com/users/kubernetes/repos","events_url":"https://api.github.com/users/kubernetes/events{/privacy}","received_events_url":"https://api.github.com/users/kubernetes/received_events","type":"Organization","site_admin":false},"repo":{"id":20580498,"name":"kubernetes","full_name":"kubernetes/kubernetes","owner":{"login":"kubernetes","id":13629408,"avatar_url":"https://avatars.githubusercontent.com/u/13629408?v=3","gravatar_id":"","url":"https://api.github.com/users/kubernetes","html_url":"https://github.com/kubernetes","followers_url":"https://api.github.com/users/kubernetes/followers","following_url":"https://api.github.com/users/kubernetes/following{/other_user}","gists_url":"https://api.github.com/users/kubernetes/gists{/gist_id}","starred_url":"https://api.github.com/users/kubernetes/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kubernetes/subscriptions","organizations_url":"https://api.github.com/users/kubernetes/orgs","repos_url":"https://api.github.com/users/kubernetes/repos","events_url":"https://api.github.com/users/kubernetes/events{/privacy}","received_events_url":"https://api.github.com/users/kubernetes/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/kubernetes/kubernetes","description":"Container Cluster Manager from Google","fork":false,"url":"https://api.github.com/repos/kubernetes/kubernetes","forks_url":"https://api.github.com/repos/kubernetes/kubernetes/forks","keys_url":"https://api.github.com/repos/kubernetes/kubernetes/keys{/key_id}","collaborators_url":"https://api.github.com/repos/kubernetes/kubernetes/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/kubernetes/kubernetes/teams","hooks_url":"https://api.github.com/repos/kubernetes/kubernetes/hooks","issue_events_url":"https://api.github.com/repos/kubernetes/kubernetes/issues/events{/number}","events_url":"https://api.github.com/repos/kubernetes/kubernetes/events","assignees_url":"https://api.github.com/repos/kubernetes/kubernetes/assignees{/user}","branches_url":"https://api.github.com/repos/kubernetes/kubernetes/branches{/branch}","tags_url":"https://api.github.com/repos/kubernetes/kubernetes/tags","blobs_url":"https://api.github.com/repos/kubernetes/kubernetes/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/kubernetes/kubernetes/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/kubernetes/kubernetes/git/refs{/sha}","trees_url":"https://api.github.com/repos/kubernetes/kubernetes/git/trees{/sha}","statuses_url":"https://api.github.com/repos/kubernetes/kubernetes/statuses/{sha}","languages_url":"https://api.github.com/repos/kubernetes/kubernetes/languages","stargazers_url":"https://api.github.com/repos/kubernetes/kubernetes/stargazers","contributors_url":"https://api.github.com/repos/kubernetes/kubernetes/contributors","subscribers_url":"https://api.github.com/repos/kubernetes/kubernetes/subscribers","subscription_url":"https://api.github.com/repos/kubernetes/kubernetes/subscription","commits_url":"https://api.github.com/repos/kubernetes/kubernetes/commits{/sha}","git_commits_url":"https://api.github.com/repos/kubernetes/kubernetes/git/commits{/sha}","comments_url":"https://api.github.com/repos/kubernetes/kubernetes/comments{/number}","issue_comment_url":"https://api.github.com/repos/kubernetes/kubernetes/issues/comments{/number}","contents_url":"https://api.github.com/repos/kubernetes/kubernetes/contents/{+path}","compare_url":"https://api.github.com/repos/kubernetes/kubernetes/compare/{base}...{head}","merges_url":"https://api.github.com/repos/kubernetes/kubernetes/merges","archive_url":"https://api.github.com/repos/kubernetes/kubernetes/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/kubernetes/kubernetes/downloads","issues_url":"https://api.github.com/repos/kubernetes/kubernetes/issues{/number}","pulls_url":"https://api.github.com/repos/kubernetes/kubernetes/pulls{/number}","milestones_url":"https://api.github.com/repos/kubernetes/kubernetes/milestones{/number}","notifications_url":"https://api.github.com/repos/kubernetes/kubernetes/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/kubernetes/kubernetes/labels{/name}","releases_url":"https://api.github.com/repos/kubernetes/kubernetes/releases{/id}","deployments_url":"https://api.github.com/repos/kubernetes/kubernetes/deployments","created_at":"2014-06-06T22:56:04Z","updated_at":"2016-04-20T17:50:16Z","pushed_at":"2016-04-20T18:54:14Z","git_url":"git://github.com/kubernetes/kubernetes.git","ssh_url":"git@github.com:kubernetes/kubernetes.git","clone_url":"https://github.com/kubernetes/kubernetes.git","svn_url":"https://github.com/kubernetes/kubernetes","homepage":"http://kubernetes.io","size":383511,"stargazers_count":13965,"watchers_count":13965,"language":"Go","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":4142,"mirror_url":null,"open_issues_count":3414,"forks":4142,"open_issues":3414,"watchers":13965,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/21646"},"html":{"href":"https://github.com/kubernetes/kubernetes/pull/21646"},"issue":{"href":"https://api.github.com/repos/kubernetes/kubernetes/issues/21646"},"comments":{"href":"https://api.github.com/repos/kubernetes/kubernetes/issues/21646/comments"},"review_comments":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/21646/comments"},"review_comment":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/kubernetes/kubernetes/pulls/21646/commits"},"statuses":{"href":"https://api.github.com/repos/kubernetes/kubernetes/statuses/ac6a8ec7e904ce5ed22b91019248b7b12f9d9569"}}}}