├── LICENSE ├── README.md ├── kube-down.sh ├── kube-up.sh ├── kubernetes └── docker-compose.yml └── scripts ├── activate-dns.sh ├── activate-kube-ui.sh ├── create-kube-system-namespace.sh ├── docker-machine-port-forwarding.sh └── wait-for-kubernetes.sh /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "{}" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright {yyyy} {name of copyright owner} 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | This project will not be updated to support Kubernetes 1.2. It's easier to start Kubernetes from version 1.2.0 onwards. Only one `docker run` command is required. Therefore it doesn't really make sense to use Docker Compose any more. 3 | 4 | I will be deprecating this project in favour of [kid](https://github.com/vyshane/kid), which is a single Bash script that you can place in your `$PATH` and call from anywhere. 5 | 6 | # Launch [Kubernetes](http://kubernetes.io) using Docker via [Docker Compose](https://www.docker.com/docker-compose) 7 | 8 | The following will also be set up for you: 9 | 10 | * The Kubernetes [DNS addon](https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/dns) 11 | * [Kube UI](http://kubernetes.io/v1.0/docs/user-guide/ui.html) 12 | 13 | ## Starting Kubernetes on Linux 14 | 15 | On Linux we'll run Kubernetes using a local Docker Engine. You will also need Docker Compose as well as the kubectl tool. To launch the cluster: 16 | 17 | ```sh 18 | ./kube-up.sh 19 | ``` 20 | 21 | ## Starting Kubernetes on OS X 22 | 23 | On OS X we'll launch Kubernetes inside a [boot2docker](http://boot2docker.io) VM via [Docker Machine](https://docs.docker.com/machine/). You will need to have Docker Machine (v0.5.0 or newer), Docker Compose, and the kubectl tool installed locally. First start your boot2docker VM: 24 | 25 | ```sh 26 | docker-machine start 27 | eval "$(docker-machine env $(docker-machine active))" 28 | ``` 29 | 30 | Then, launch the Kubernetes cluster in boot2docker via Docker Machine: 31 | 32 | ```sh 33 | ./kube-up.sh 34 | ``` 35 | 36 | The script will set up port forwarding so that you can use kubectl locally without having to ssh into boot2docker. 37 | 38 | ## Checking if Kubernetes Is Running 39 | 40 | ```sh 41 | kubectl cluster-info 42 | Kubernetes master is running at http://localhost:8080 43 | KubeUI is running at http://localhost:8080/api/v1/proxy/namespaces/kube-system/services/kube-ui 44 | ``` 45 | 46 | ## Accessing Kube UI 47 | 48 | You can access Kube UI at http://localhost:8080/ui. 49 | 50 | ## To destroy the cluster 51 | 52 | ```sh 53 | ./kube-down.sh 54 | ``` 55 | 56 | This will also remove any services, replication controllers and pods that are running in the cluster. 57 | 58 | -------------------------------------------------------------------------------- /kube-down.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | this_dir=$(cd -P "$(dirname "$0")" && pwd) 4 | 5 | echo "Removing replication controllers, services, pods and secrets..." 6 | kubectl delete replicationcontrollers,services,pods,secrets --all 7 | if [ $? != 0 ]; then 8 | echo "Kubernetes already down?" 9 | fi 10 | 11 | source scripts/docker-machine-port-forwarding.sh 12 | remove_port_if_forwarded $KUBERNETES_API_PORT 13 | 14 | cd "$this_dir/kubernetes" 15 | 16 | if [ ! -z "$(docker-compose ps -q)" ]; then 17 | docker-compose stop 18 | docker-compose rm -f -v 19 | fi 20 | 21 | k8s_containers=`docker ps -a -f "name=k8s_" -q` 22 | 23 | if [ ! -z "$k8s_containers" ]; then 24 | echo "Stopping and removing all other containers that were started by Kubernetes..." 25 | docker stop $k8s_containers 26 | docker rm -f -v $k8s_containers 27 | fi 28 | -------------------------------------------------------------------------------- /kube-up.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -e 4 | 5 | require_command_exists() { 6 | command -v "$1" >/dev/null 2>&1 || { echo "$1 is required but is not installed. Aborting." >&2; exit 1; } 7 | } 8 | 9 | require_command_exists kubectl 10 | require_command_exists docker 11 | require_command_exists docker-compose 12 | 13 | this_dir=$(cd -P "$(dirname "$0")" && pwd) 14 | 15 | docker info > /dev/null 16 | if [ $? != 0 ]; then 17 | echo "A running Docker engine is required. Is your Docker host up?" 18 | exit 1 19 | fi 20 | 21 | cd "$this_dir/kubernetes" 22 | docker-compose up -d 23 | 24 | cd "$this_dir/scripts" 25 | 26 | source docker-machine-port-forwarding.sh 27 | forward_port_if_not_forwarded $KUBERNETES_API_PORT 28 | 29 | ./wait-for-kubernetes.sh 30 | ./create-kube-system-namespace.sh 31 | ./activate-dns.sh 32 | ./activate-kube-ui.sh 33 | -------------------------------------------------------------------------------- /kubernetes/docker-compose.yml: -------------------------------------------------------------------------------- 1 | etcd: 2 | image: gcr.io/google_containers/etcd:2.2.1 3 | net: host 4 | command: ['/usr/local/bin/etcd', '--addr=127.0.0.1:4001', '--bind-addr=0.0.0.0:4001', '--data-dir=/var/etcd/data'] 5 | 6 | master: 7 | image: gcr.io/google_containers/hyperkube:v1.1.8 8 | net: host 9 | pid: host 10 | privileged: true 11 | volumes: 12 | - /sys:/sys:ro 13 | - /dev:/dev 14 | - /var/lib/docker/:/var/lib/docker:ro 15 | - /var/lib/kubelet/:/var/lib/kubelet:rw 16 | - /var/run:/var/run:rw 17 | command: ['nsenter', '--target=1', '--mount', '--wd=.', '--', './hyperkube', 'kubelet', '--hostname-override=127.0.0.1', '--address=0.0.0.0', '--api-servers=http://localhost:8080', '--config=etc/kubernetes/manifests', '--cluster-dns=10.0.0.10', '--cluster-domain=cluster.local'] 18 | 19 | proxy: 20 | image: gcr.io/google_containers/hyperkube:v1.1.8 21 | net: host 22 | pid: host 23 | privileged: true 24 | command: ['/hyperkube', 'proxy', '--master=http://127.0.0.1:8080', '--v=2'] 25 | 26 | kube2sky: 27 | image: gcr.io/google_containers/kube2sky:1.12 28 | net: host 29 | command: ['--kube_master_url=http://127.0.0.1:8080', '--domain=cluster.local'] 30 | 31 | skydns: 32 | image: gcr.io/google_containers/skydns:2015-10-13-8c72f8c 33 | net: host 34 | command: ['--machines=http://localhost:4001', '--addr=0.0.0.0:53', '--domain=cluster.local', '-ns-rotate=false'] 35 | -------------------------------------------------------------------------------- /scripts/activate-dns.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | dns_host=$(echo $DOCKER_HOST | awk -F'[/:]' '{print $4}') 4 | : ${dns_host:=$(ifconfig docker0 | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*')} 5 | 6 | kubectl --namespace=kube-system create -f - << EOF 7 | apiVersion: v1 8 | kind: Endpoints 9 | metadata: 10 | name: kube-dns 11 | namespace: kube-system 12 | subsets: 13 | - addresses: 14 | - ip: $dns_host 15 | ports: 16 | - port: 53 17 | protocol: UDP 18 | name: dns 19 | EOF 20 | 21 | kubectl --namespace=kube-system create -f - << EOF 22 | kind: Service 23 | apiVersion: v1 24 | metadata: 25 | name: kube-dns 26 | namespace: kube-system 27 | spec: 28 | clusterIP: 10.0.0.10 29 | ports: 30 | - name: dns 31 | port: 53 32 | protocol: UDP 33 | EOF 34 | -------------------------------------------------------------------------------- /scripts/activate-kube-ui.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | echo "Activating Kube UI..." 4 | 5 | kubectl --namespace=kube-system create -f - << EOF 6 | apiVersion: v1 7 | kind: ReplicationController 8 | metadata: 9 | name: kube-ui-v4 10 | namespace: kube-system 11 | labels: 12 | k8s-app: kube-ui 13 | version: v4 14 | kubernetes.io/cluster-service: "true" 15 | spec: 16 | replicas: 1 17 | selector: 18 | k8s-app: kube-ui 19 | version: v4 20 | template: 21 | metadata: 22 | labels: 23 | k8s-app: kube-ui 24 | version: v4 25 | kubernetes.io/cluster-service: "true" 26 | spec: 27 | containers: 28 | - name: kube-ui 29 | image: gcr.io/google_containers/kube-ui:v4 30 | resources: 31 | limits: 32 | cpu: 100m 33 | memory: 50Mi 34 | ports: 35 | - containerPort: 8080 36 | livenessProbe: 37 | httpGet: 38 | path: / 39 | port: 8080 40 | initialDelaySeconds: 30 41 | timeoutSeconds: 5 42 | EOF 43 | 44 | kubectl --namespace=kube-system create -f - << EOF 45 | apiVersion: v1 46 | kind: Service 47 | metadata: 48 | name: kube-ui 49 | namespace: kube-system 50 | labels: 51 | k8s-app: kube-ui 52 | kubernetes.io/cluster-service: "true" 53 | kubernetes.io/name: "KubeUI" 54 | spec: 55 | selector: 56 | k8s-app: kube-ui 57 | ports: 58 | - port: 80 59 | targetPort: 8080 60 | EOF 61 | -------------------------------------------------------------------------------- /scripts/create-kube-system-namespace.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | kubectl create -f - << EOF 4 | kind: Namespace 5 | apiVersion: v1 6 | metadata: 7 | name: kube-system 8 | labels: 9 | name: kube-system 10 | EOF -------------------------------------------------------------------------------- /scripts/docker-machine-port-forwarding.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # 3 | # Set up kubectl port forwarding to docker-machine VM if needed. 4 | 5 | KUBERNETES_API_PORT=8080 6 | 7 | function active_machine { 8 | if [ $(command -v docker-machine) ]; then 9 | docker-machine active 10 | fi 11 | } 12 | 13 | # Kube API is accessible on host at 8080, use ssh tunnel 14 | function forward_port_if_not_forwarded { 15 | local port=$1 16 | local machine=$(active_machine) 17 | 18 | if [ -n "$machine" ]; then 19 | if ! pgrep -f "ssh.*$port:localhost" > /dev/null; then 20 | docker-machine ssh "$machine" -f -N -L "$port:localhost:$port" 21 | else 22 | echo "Did not set up port forwarding to the Docker machine: An ssh tunnel on port $port already exists. The kubernetes cluster may not be reachable from local kubectl." 23 | fi 24 | fi 25 | } 26 | 27 | function remove_port_if_forwarded { 28 | local port=$1 29 | pkill -f "ssh.*docker.*$port:localhost:$port" 30 | } 31 | 32 | -------------------------------------------------------------------------------- /scripts/wait-for-kubernetes.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | echo "Waiting for Kubernetes cluster to become available..." 3 | 4 | until $(kubectl cluster-info &> /dev/null); do 5 | sleep 1 6 | done 7 | 8 | echo "Kubernetes cluster is up." 9 | --------------------------------------------------------------------------------