From da34be94bfb537edb11a8c220e20c848df06ae19 Mon Sep 17 00:00:00 2001 From: Joe Beda Date: Tue, 19 Aug 2014 22:16:53 -0700 Subject: [PATCH] Pretty up the demo a little. Use images and some better formatting. Also add scripts to help prevent typos. This based on an improved version done by Julia Ferraioli. She came up with the cool images. --- update-demo/0-run-web-proxy.sh | 22 ++++ .../1-create-replication-controller.sh | 24 ++++ update-demo/2-scale.sh | 21 ++++ update-demo/3-rolling-update.sh | 26 +++++ update-demo/4-down.sh | 20 ++++ update-demo/README.md | 75 +++++++------ update-demo/image/Dockerfile | 7 -- update-demo/image/data.json | 3 - update-demo/image/default | 23 ---- update-demo/images/base/Dockerfile | 22 ++++ update-demo/images/base/default | 37 +++++++ update-demo/images/build-images.sh | 32 ++++++ update-demo/images/kitten/Dockerfile | 15 +++ update-demo/images/kitten/html/data.json | 3 + update-demo/images/kitten/html/kitten.jpg | Bin 0 -> 14769 bytes update-demo/images/nautilus/Dockerfile | 15 +++ update-demo/images/nautilus/html/data.json | 3 + update-demo/images/nautilus/html/nautilus.jpg | Bin 0 -> 21231 bytes update-demo/local/index.html | 22 ++-- update-demo/local/script.js | 103 +++++++++--------- update-demo/local/style.css | 22 ++-- 21 files changed, 365 insertions(+), 130 deletions(-) create mode 100755 update-demo/0-run-web-proxy.sh create mode 100755 update-demo/1-create-replication-controller.sh create mode 100755 update-demo/2-scale.sh create mode 100755 update-demo/3-rolling-update.sh create mode 100755 update-demo/4-down.sh delete mode 100644 update-demo/image/Dockerfile delete mode 100644 update-demo/image/data.json delete mode 100644 update-demo/image/default create mode 100644 update-demo/images/base/Dockerfile create mode 100644 update-demo/images/base/default create mode 100755 update-demo/images/build-images.sh create mode 100644 update-demo/images/kitten/Dockerfile create mode 100644 update-demo/images/kitten/html/data.json create mode 100644 update-demo/images/kitten/html/kitten.jpg create mode 100644 update-demo/images/nautilus/Dockerfile create mode 100644 update-demo/images/nautilus/html/data.json create mode 100644 update-demo/images/nautilus/html/nautilus.jpg diff --git a/update-demo/0-run-web-proxy.sh b/update-demo/0-run-web-proxy.sh new file mode 100755 index 00000000..2a26ae76 --- /dev/null +++ b/update-demo/0-run-web-proxy.sh @@ -0,0 +1,22 @@ +#!/bin/bash + +# Copyright 2014 Google Inc. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +echo "Running local proxy to Kubernetes API Server. Run this in a " +echo "separate terminal or run it in the background." +echo +echo " http://localhost:8001/static/" +echo +../../cluster/kubecfg.sh -proxy -www local/ diff --git a/update-demo/1-create-replication-controller.sh b/update-demo/1-create-replication-controller.sh new file mode 100755 index 00000000..54ee0115 --- /dev/null +++ b/update-demo/1-create-replication-controller.sh @@ -0,0 +1,24 @@ +#!/bin/bash + +# Copyright 2014 Google Inc. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +if [ -z "$DOCKER_HUB_USER" ] ; then + echo "Please set DOCKER_HUB_USER to your Docker hub account" + exit 1 +fi + +set -x + +../../cluster/kubecfg.sh -p 8080:80 run $DOCKER_HUB_USER/update-demo:nautilus 2 update-demo diff --git a/update-demo/2-scale.sh b/update-demo/2-scale.sh new file mode 100755 index 00000000..8958871f --- /dev/null +++ b/update-demo/2-scale.sh @@ -0,0 +1,21 @@ +#!/bin/bash + +# Copyright 2014 Google Inc. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +NEW_SIZE=${1:-4} + +set -x + +../../cluster/kubecfg.sh resize update-demo $NEW_SIZE diff --git a/update-demo/3-rolling-update.sh b/update-demo/3-rolling-update.sh new file mode 100755 index 00000000..f7222e72 --- /dev/null +++ b/update-demo/3-rolling-update.sh @@ -0,0 +1,26 @@ +#!/bin/bash + +# Copyright 2014 Google Inc. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +if [ -z "$DOCKER_HUB_USER" ] ; then + echo "Please set DOCKER_HUB_USER to your Docker hub account" + exit 1 +fi + +NEW_IMAGE=${1:-kitten} + +set -x + +../../cluster/kubecfg.sh -image $DOCKER_HUB_USER/update-demo:$NEW_IMAGE -u 10s rollingupdate update-demo diff --git a/update-demo/4-down.sh b/update-demo/4-down.sh new file mode 100755 index 00000000..cd565891 --- /dev/null +++ b/update-demo/4-down.sh @@ -0,0 +1,20 @@ +#!/bin/bash + +# Copyright 2014 Google Inc. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set -x + +../../cluster/kubecfg.sh stop update-demo +../../cluster/kubecfg.sh rm update-demo diff --git a/update-demo/README.md b/update-demo/README.md index 4a878394..8baf41e6 100644 --- a/update-demo/README.md +++ b/update-demo/README.md @@ -27,7 +27,7 @@ This example assumes that you have forked the repository and [turned up a Kubern This example also assumes that you have [Docker](http://docker.io) installed on your local machine. -It also assumes that ```$DOCKER_USER``` is set to your docker user id. +It also assumes that `$DOCKER_HUB_USER` is set to your Docker user id. We use this to upload the docker images that are used in the demo. You may need to open the firewall for port 8080 using the [console][cloud-console] or the `gcutil` tool. The following command will allow traffic from any source to instances tagged `kubernetes-minion`: @@ -37,57 +37,66 @@ $ gcutil addfirewall --allowed=tcp:8080 --target_tags=kubernetes-minion kubernet ### Step One: Build the image - $ cd kubernetes/examples/update-demo/image - $ docker build -t $DOCKER_USER/data . - $ docker push $DOCKER_USER/data +```shell +$ cd kubernetes/examples/update-demo +$ ./build-images.sh +``` -### Step Two: Run the controller -Now we will turn up two replicas of that image. They all serve on port 8080, mapped to internal port 80 +### Step Two: Turn up the UX for the demo - $ cd kubernetes - $ cluster/kubecfg.sh -p 8080:80 run $DOCKER_USER/data 2 dataController +```shell +$ ./0-run-web-proxy.sh & +``` -### Step Three: Turn up the UX for the demo -In a different terminal: +This can sometimes spew to the output so you could also run it in a different terminal. - $ cd kubernetes - $ cluster/kubecfg.sh -proxy -www examples/update-demo/local/ +Now visit the the [demo website](http://localhost:8001/static). You won't see anything much quite yet. -Now visit the the [demo website](http://localhost:8001/static/index.html). You should see two light blue squares with pod IDs and ip addresses. +### Step Three: Run the controller +Now we will turn up two replicas of an image. They all serve on port 8080, mapped to internal port 80 + +```shell +$ ./1-create-replication-controller.sh +``` + +After these pull the image (which may take a minute or so) you'll see a couple of squares in the UI detailing the pods that are running along with the image that they are serving up. A cute little nautilus. ### Step Four: Try resizing the controller + Now we will increase the number of replicas from two to four: - $ cd kubernetes - $ cluster/kubecfg.sh resize dataController 4 +```shell +$ ./2-scale.sh +``` If you go back to the [demo website](http://localhost:8001/static/index.html) you should eventually see four boxes, one for each pod. ### Step Five: Update the docker image -We will now update the docker image to serve a different color. +We will now update the docker image to serve a different image by doing a rolling update to a new Docker image. - $ cd kubernetes/examples/update-demo/image - $ ${EDITOR} data.json - -Edit the ```color``` value so that it is a new color. For example: -```js -{ - "color": "#F00" -} +```shell +$ ./3-rolling-update ``` -Will set the color to red. +The rollingUpdate command in kubecfg will do 2 things: -Once you are happy with the color, build a new image: +1. Update the template in the replication controller to the new image (`$DOCKER_HUB_USER/update-demo:kitten`) +2. Kill each of the pods one by one. It'll let the replication controller create new pods to replace those that were killed. - $ docker build -t $DOCKER_USER/data . - $ docker push $DOCKER_USER/data +Watch the UX, it will update one pod every 10 seconds until all of the pods have the new image. -### Step Six: Roll the update out to your servers -We will now update the servers that are running out in your cluster. +### Step Five: Bring down the pods - $ cd kubernetes - $ cluster/kubecfg.sh -u=30s rollingupdate dataController +```shell +$ ./4-down.sh +``` -Watch the UX, it will update one pod every 30 seconds until all of the pods have the new color. +This will first 'stop' the replication controller by turning the target number of replicas to 0. It'll then delete that controller. [cloud-console]: https://console.developer.google.com + +### Image Copyright + +Note that he images included here are public domain. + +* [kitten](http://commons.wikimedia.org/wiki/File:Kitten-stare.jpg) +* [nautilus](http://commons.wikimedia.org/wiki/File:Nautilus_pompilius.jpg) diff --git a/update-demo/image/Dockerfile b/update-demo/image/Dockerfile deleted file mode 100644 index d0c8f5a4..00000000 --- a/update-demo/image/Dockerfile +++ /dev/null @@ -1,7 +0,0 @@ -FROM dockerfile/nginx - -ADD data.json /usr/share/nginx/html/data.json -ADD default /etc/nginx/sites-available/default -RUN chmod a+r /usr/share/nginx/html/data.json - -CMD ["nginx"] diff --git a/update-demo/image/data.json b/update-demo/image/data.json deleted file mode 100644 index 9e1609a7..00000000 --- a/update-demo/image/data.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "color": "#0FF" -} diff --git a/update-demo/image/default b/update-demo/image/default deleted file mode 100644 index 74f8049c..00000000 --- a/update-demo/image/default +++ /dev/null @@ -1,23 +0,0 @@ -server { - listen 80 default_server; - listen [::]:80 default_server ipv6only=on; - - root /usr/share/nginx/html; - index index.html index.htm; - - # Make site accessible from http://localhost/ - server_name localhost; - - location / { - try_files $uri $uri/ =404; - expires 0; - add_header Cache-Control private; - - if ($request_method = 'GET') { - add_header 'Access-Control-Allow-Origin' '*'; - add_header 'Access-Control-Allow-Credentials' 'true'; - add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; - add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type'; - } - } -} diff --git a/update-demo/images/base/Dockerfile b/update-demo/images/base/Dockerfile new file mode 100644 index 00000000..428a708a --- /dev/null +++ b/update-demo/images/base/Dockerfile @@ -0,0 +1,22 @@ +# Copyright 2014 Google Inc. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +FROM dockerfile/nginx + +ADD default /etc/nginx/sites-available/default + +ONBUILD ADD html /usr/share/nginx/html +ONBUILD RUN chmod -R a+r /usr/share/nginx/html + +CMD ["nginx"] diff --git a/update-demo/images/base/default b/update-demo/images/base/default new file mode 100644 index 00000000..03b952fa --- /dev/null +++ b/update-demo/images/base/default @@ -0,0 +1,37 @@ +# Copyright 2014 Google Inc. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +server { + listen 80 default_server; + listen [::]:80 default_server ipv6only=on; + + root /usr/share/nginx/html; + index index.html index.htm; + + # Make site accessible from http://localhost/ + server_name localhost; + + location / { + try_files $uri $uri/ =404; + expires 0; + add_header Cache-Control private; + + if ($request_method = 'GET') { + add_header 'Access-Control-Allow-Origin' '*'; + add_header 'Access-Control-Allow-Credentials' 'true'; + add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; + add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type'; + } + } +} diff --git a/update-demo/images/build-images.sh b/update-demo/images/build-images.sh new file mode 100755 index 00000000..25edd084 --- /dev/null +++ b/update-demo/images/build-images.sh @@ -0,0 +1,32 @@ +#!/bin/bash + +# Copyright 2014 Google Inc. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This script will build and push the images necessary for the demo. + +if (( $# != 1 )); then + echo "Usage: $0 " + exit 1 +fi + +DOCKER_USER=$1 + +set -x + +docker build -t update-demo-base base +docker build -t $DOCKER_USER/update-demo:kitten kitten +docker build -t $DOCKER_USER/update-demo:nautilus nautilus + +docker push $DOCKER_USER/update-demo diff --git a/update-demo/images/kitten/Dockerfile b/update-demo/images/kitten/Dockerfile new file mode 100644 index 00000000..f6de6de1 --- /dev/null +++ b/update-demo/images/kitten/Dockerfile @@ -0,0 +1,15 @@ +# Copyright 2014 Google Inc. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +FROM update-demo-base diff --git a/update-demo/images/kitten/html/data.json b/update-demo/images/kitten/html/data.json new file mode 100644 index 00000000..0be61a42 --- /dev/null +++ b/update-demo/images/kitten/html/data.json @@ -0,0 +1,3 @@ +{ + "image": "kitten.jpg" +} diff --git a/update-demo/images/kitten/html/kitten.jpg b/update-demo/images/kitten/html/kitten.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a382bf16aceb05d0c084a32815dcea80aaf02d4b GIT binary patch literal 14769 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 D(=o1& literal 0 HcmV?d00001 diff --git a/update-demo/images/nautilus/Dockerfile b/update-demo/images/nautilus/Dockerfile new file mode 100644 index 00000000..f6de6de1 --- /dev/null +++ b/update-demo/images/nautilus/Dockerfile @@ -0,0 +1,15 @@ +# Copyright 2014 Google Inc. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +FROM update-demo-base diff --git a/update-demo/images/nautilus/html/data.json b/update-demo/images/nautilus/html/data.json new file mode 100644 index 00000000..2debee09 --- /dev/null +++ b/update-demo/images/nautilus/html/data.json @@ -0,0 +1,3 @@ +{ + "image": "nautilus.jpg" +} diff --git a/update-demo/images/nautilus/html/nautilus.jpg b/update-demo/images/nautilus/html/nautilus.jpg new file mode 100644 index 0000000000000000000000000000000000000000..544d2bd471abf859e029d412f24ac64c2c7aecb6 GIT binary patch literal 21231 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 literal 0 HcmV?d00001 diff --git a/update-demo/local/index.html b/update-demo/local/index.html index 1a8156c2..0b66f848 100644 --- a/update-demo/local/index.html +++ b/update-demo/local/index.html @@ -13,17 +13,23 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --> + - - - + + + -
- {{server.id}} -
- {{server.ip}} -
+
+ + ID: {{server.id}}
+ Host: {{server.host}}
+ Image: {{server.dockerImage}}
+ Labels: +
    +
  • {{key}}={{value}}
  • +
+
diff --git a/update-demo/local/script.js b/update-demo/local/script.js index 0a833bd5..59606c96 100644 --- a/update-demo/local/script.js +++ b/update-demo/local/script.js @@ -16,72 +16,77 @@ limitations under the License. var base = "http://localhost:8001/api/v1beta1/"; -var updateColor = function($http, server) { - $http.get("http://" + server.ip + ":8080/data.json") +var updateImage = function($http, server) { + $http.get("http://" + server.ip + ":8080/data.json") .success(function(data) { - server.color = data.color; - console.log(data); - }) + server.image = data.image; + console.log(data); + }) .error(function(data) { - server.color = "#000"; - console.log(data); - }); + server.image = "" + console.log(data); + }); }; var updateServer = function($http, server) { - $http.get(base + "pods/" + server.id) - .success(function(data) { - console.log(data); - server.ip = data.currentState.hostIP; - updateColor($http, server); - }) - .error(function(data) { - console.log(data); - }); + $http.get(base + "pods/" + server.id) + .success(function(data) { + console.log(data); + server.ip = data.currentState.hostIP; + server.labels = data.labels; + server.host = data.currentState.host.split('.')[0] + server.dockerImage = data.currentState.info["update-demo-container"].Config.Image + updateImage($http, server); + }) + .error(function(data) { + console.log(data); + }); }; var updateData = function($scope, $http) { - var servers = $scope.servers - for (var i = 0; i < servers.length; ++i) { - var server = servers[i]; - updateServer($http, server); - } + var servers = $scope.servers + for (var i = 0; i < servers.length; ++i) { + var server = servers[i]; + updateServer($http, server); + } }; var ButtonsCtrl = function ($scope, $http, $interval) { - $scope.servers = []; - update($scope, $http); - $interval(angular.bind({}, update, $scope, $http), 2000); + $scope.servers = []; + update($scope, $http); + $interval(angular.bind({}, update, $scope, $http), 2000); }; var getServer = function($scope, id) { - var servers = $scope.servers; - for (var i = 0; i < servers.length; ++i) { - if (servers[i].id == id) { - return servers[i]; - } + var servers = $scope.servers; + for (var i = 0; i < servers.length; ++i) { + if (servers[i].id == id) { + return servers[i]; } - return null; + } + return null; }; var update = function($scope, $http) { - if (!$http) { - console.log("No HTTP!"); - return; - } - $http.get(base + "pods") - .success(function(data) { - console.log(data); - var newServers = []; - for (var i = 0; i < data.items.length; ++i) { - var server = getServer($scope, data.items[i].id); - if (server == null) { - server = { "id": data.items[i].id }; - } - newServers.push(server); - } - $scope.servers = newServers; - updateData($scope, $http) + if (!$http) { + console.log("No HTTP!"); + return; + } + $http.get(base + "pods") + .success(function(data) { + console.log(data); + var newServers = []; + for (var i = 0; i < data.items.length; ++i) { + var server = getServer($scope, data.items[i].id); + if (server == null) { + server = { "id": data.items[i].id }; + } + newServers.push(server); + } + $scope.servers = newServers; + updateData($scope, $http) + }) + .error(function(data) { + console.log("ERROR: " + data); }) - .error(function(data) { console.log("ERROR: " + data); }) }; diff --git a/update-demo/local/style.css b/update-demo/local/style.css index 0cd61a53..ea8941c0 100644 --- a/update-demo/local/style.css +++ b/update-demo/local/style.css @@ -14,19 +14,27 @@ See the License for the specific language governing permissions and limitations under the License. */ -.img { +img { height: 100px; width: 100px; - background-size: 100px 100px; - margin-left: 25px; + float: right; + background-size: 100px 100px; + background-color: black; + margin-left: 10px; + border: none; } -.server { +ul { + margin-top: 0; + margin-bottom: 0; +} + +.pod { font-family: Roboto, Open Sans, arial; - width: 150px; - height: 150px; border: 1px solid black; + border-radius: 5px; + padding: 10px; margin: 10px; display: inline-block; - padding: 3px; + background-color: #D1D1D1; }