├── .gitignore ├── LICENSE ├── README.md ├── fix_pause ├── image ├── Dockerfile ├── Makefile ├── master-multi.json └── master.json ├── master.sh ├── minion.sh └── release.sh /.gitignore: -------------------------------------------------------------------------------- 1 | aio.tar.gz 2 | *.tar 3 | image/hyperkube 4 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 The Cloud Computing Team of Zhejiang University 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # kube-in-docker 2 | **Run Kubernetes in Docker and anywhere** 3 | 4 | We now support ubuntu, debian, mint, centos, fedora distribution 5 | 6 | **NOTE**: 7 | 8 | Our scripts has been merged into Kubernetes repo as we expected, see this [offical guide](https://github.com/GoogleCloudPlatform/kubernetes/blob/master/docs/getting-started-guides/docker-multinode.md) for more details if you want to try. We'll maintain this work with Google guys there. 9 | 10 | However, the scirpts and docs in this repo will keep updating in order to meet our own projects' requirements, so don't expect it work in every enviroment. 11 | 12 | **TODO**: 13 | 14 | move bootstrap-docker into auto start 15 | 16 | 17 | **Requirement** 18 | 19 | At least one node have access to Internet, no PublicIP required. 20 | 21 | **Usage** 22 | 23 | On the node which have Internet access, set these ENV: 24 | 25 | ``` 26 | # variables which requires user filled in 27 | # registry related 28 | PRIVATE_IP="10.168.14.145" 29 | PRIVATE_PORT="5000" 30 | # extra volume for registry 31 | HOSTDIR="/mnt" 32 | USER="cxy" 33 | ``` 34 | 35 | run `master.sh`. This node will act as both master & minion. 36 | 37 | On every other worker node, set these ENV: 38 | 39 | ``` 40 | MASTER_IP="10.168.14.145" 41 | # just use minion's ip instead 42 | HOSTNAME="10.168.10.5" 43 | USER="cxy" 44 | ``` 45 | 46 | run `minion.sh`. They will act as minion. 47 | 48 | Done! 49 | 50 | **Notice** 51 | 52 | If there're some of your minions have no access to Internet, you cannot start container on it because Docker cannot download image. Tha't why we installed a private registry on master. Please use it. 53 | 54 | **For Chinese users** 55 | 56 | Google's `pause` image is blocked by GFW. We recommend you to pull from docker.io mannually and re-tag it like what `fix-pause` did. **You need to do this on every node!** 57 | 58 | If your node have no access to Internet, you need to pull it from docker.io, export it, scp it to nodes. Then import & re-tag it on every node. 59 | -------------------------------------------------------------------------------- /fix_pause: -------------------------------------------------------------------------------- 1 | docker pull docker.io/kubernetes/pause 2 | docker tag docker.io/kubernetes/pause gcr.io/google_containers/pause:0.8.0 3 | -------------------------------------------------------------------------------- /image/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM google/debian:wheezy 2 | 3 | RUN apt-get update 4 | RUN apt-get -yy -q install iptables ca-certificates 5 | COPY hyperkube /hyperkube 6 | RUN chmod a+rx /hyperkube 7 | 8 | COPY master-multi.json /etc/kubernetes/manifests-multi/master.json 9 | COPY master.json /etc/kubernetes/manifests/master.json 10 | -------------------------------------------------------------------------------- /image/Makefile: -------------------------------------------------------------------------------- 1 | all: 2 | curl -O https://storage.googleapis.com/kubernetes-release/release/${VERSION}/bin/linux/amd64/hyperkube 3 | sed -i "s/VERSION/${VERSION}/g" master-multi.json master.json 4 | docker build -t wizardcxy/hyperkube:${VERSION} . 5 | 6 | .PHONY: all 7 | -------------------------------------------------------------------------------- /image/master-multi.json: -------------------------------------------------------------------------------- 1 | { 2 | "apiVersion": "v1beta3", 3 | "kind": "Pod", 4 | "metadata": {"name":"k8s-master"}, 5 | "spec":{ 6 | "hostNetwork": true, 7 | "containers":[ 8 | { 9 | "name": "controller-manager", 10 | "image": "wizardcxy/hyperkube:v0.18.2", 11 | "command": [ 12 | "/hyperkube", 13 | "controller-manager", 14 | "--master=127.0.0.1:8080", 15 | "--machines=127.0.0.1", 16 | "--sync_nodes=true", 17 | "--v=2" 18 | ] 19 | }, 20 | { 21 | "name": "apiserver", 22 | "image": "wizardcxy/hyperkube:v0.18.2", 23 | "command": [ 24 | "/hyperkube", 25 | "apiserver", 26 | "--portal-net=10.0.0.1/24", 27 | "--address=0.0.0.0", 28 | "--etcd_servers=http://127.0.0.1:4001", 29 | "--cluster_name=kubernetes", 30 | "--v=2" 31 | ] 32 | }, 33 | { 34 | "name": "scheduler", 35 | "image": "wizardcxy/hyperkube:v0.18.2", 36 | "command": [ 37 | "/hyperkube", 38 | "scheduler", 39 | "--master=127.0.0.1:8080", 40 | "--v=2" 41 | ] 42 | } 43 | ] 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /image/master.json: -------------------------------------------------------------------------------- 1 | { 2 | "apiVersion": "v1beta3", 3 | "kind": "Pod", 4 | "metadata": {"name":"k8s-master"}, 5 | "spec":{ 6 | "hostNetwork": true, 7 | "containers":[ 8 | { 9 | "name": "controller-manager", 10 | "image": "wizardcxy/hyperkube:v0.18.2", 11 | "command": [ 12 | "/hyperkube", 13 | "controller-manager", 14 | "--master=127.0.0.1:8080", 15 | "--machines=127.0.0.1", 16 | "--sync_nodes=true", 17 | "--v=2" 18 | ] 19 | }, 20 | { 21 | "name": "apiserver", 22 | "image": "wizardcxy/hyperkube:v0.18.2", 23 | "command": [ 24 | "/hyperkube", 25 | "apiserver", 26 | "--portal-net=10.0.0.1/24", 27 | "--address=127.0.0.1", 28 | "--etcd_servers=http://127.0.0.1:4001", 29 | "--cluster_name=kubernetes", 30 | "--v=2" 31 | ] 32 | }, 33 | { 34 | "name": "scheduler", 35 | "image": "wizardcxy/hyperkube:v0.18.2", 36 | "command": [ 37 | "/hyperkube", 38 | "scheduler", 39 | "--master=127.0.0.1:8080", 40 | "--v=2" 41 | ] 42 | } 43 | ] 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /master.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -e 4 | 5 | # variables which requires user filled in 6 | # registry related 7 | PRIVATE_IP="10.168.14.145" 8 | PRIVATE_PORT="5000" 9 | # extra volume for registry 10 | HOSTDIR="/mnt" 11 | USER="cxy" 12 | K8S_VERSION=0.18.2 13 | 14 | url='https://get.docker.com/' 15 | 16 | # we support ubuntu, debian, mint, centos, fedora dist 17 | lsb_dist="" 18 | DOCKER_CONF="" 19 | 20 | if [ "$(id -u)" != "0" ]; then 21 | echo >&2 "Please run as root" 22 | exit 1 23 | fi 24 | 25 | command_exists() { 26 | command -v "$@" > /dev/null 2>&1 27 | } 28 | 29 | detect_lsb() { 30 | case "$(uname -m)" in 31 | *64) 32 | ;; 33 | *) 34 | cat >&2 <<-'EOF' 35 | Error: you are not using a 64bit platform. 36 | We currently only supports 64bit platforms. 37 | EOF 38 | exit 1 39 | ;; 40 | esac 41 | 42 | if command_exists lsb_release; then 43 | lsb_dist="$(lsb_release -si)" 44 | fi 45 | if [ -z "$lsb_dist" ] && [ -r /etc/lsb-release ]; then 46 | lsb_dist="$(. /etc/lsb-release && echo "$DISTRIB_ID")" 47 | fi 48 | if [ -z "$lsb_dist" ] && [ -r /etc/debian_version ]; then 49 | lsb_dist='debian' 50 | fi 51 | if [ -z "$lsb_dist" ] && [ -r /etc/fedora-release ]; then 52 | lsb_dist='fedora' 53 | fi 54 | if [ -z "$lsb_dist" ] && [ -r /etc/os-release ]; then 55 | lsb_dist="$(. /etc/os-release && echo "$ID")" 56 | fi 57 | 58 | lsb_dist="$(echo "$lsb_dist" | tr '[:upper:]' '[:lower:]')" 59 | } 60 | 61 | install_docker() { 62 | user="$(id -un 2>/dev/null || true)" 63 | 64 | sh_c='sh -c' 65 | if [ "$user" != 'root' ]; then 66 | if command_exists sudo; then 67 | sh_c='sudo -E sh -c' 68 | elif command_exists su; then 69 | sh_c='su -c' 70 | else 71 | cat >&2 <<-'EOF' 72 | Error: this installer needs the ability to run commands as root. 73 | We are unable to find either "sudo" or "su" available to make this happen. 74 | EOF 75 | exit 1 76 | fi 77 | fi 78 | 79 | curl='' 80 | if command_exists curl; then 81 | curl='curl -sSL' 82 | elif command_exists wget; then 83 | curl='wget -qO-' 84 | elif command_exists busybox && busybox --list-modules | grep -q wget; then 85 | curl='busybox wget -qO-' 86 | fi 87 | 88 | case "$lsb_dist" in 89 | fedora|centos) 90 | $sh_c 'sleep 3; yum -y -q install docker-io' 91 | 92 | if command_exists docker && [ -e /var/run/docker.sock ]; then 93 | ( 94 | set -x 95 | $sh_c 'docker version' 96 | ) || true 97 | fi 98 | DOCKER_CONF="/etc/sysconfig/docker" 99 | ;; 100 | ubuntu|debian|linuxmint) 101 | export DEBIAN_FRONTEND=noninteractive 102 | 103 | did_apt_get_update= 104 | apt_get_update() { 105 | if [ -z "$did_apt_get_update" ]; then 106 | ( set -x; $sh_c 'sleep 3; apt-get update' ) 107 | did_apt_get_update=1 108 | fi 109 | } 110 | 111 | # aufs is preferred over devicemapper; try to ensure the driver is available. 112 | if ! grep -q aufs /proc/filesystems && ! $sh_c 'modprobe aufs'; then 113 | if uname -r | grep -q -- '-generic' && dpkg -l 'linux-image-*-generic' | grep -q '^ii' 2>/dev/null; then 114 | kern_extras="linux-image-extra-$(uname -r) linux-image-extra-virtual" 115 | 116 | apt_get_update 117 | ( set -x; $sh_c 'sleep 3; apt-get install -y -q '"$kern_extras" ) || true 118 | 119 | if ! grep -q aufs /proc/filesystems && ! $sh_c 'modprobe aufs'; then 120 | echo >&2 'Warning: tried to install '"$kern_extras"' (for AUFS)' 121 | echo >&2 ' but we still have no AUFS. Docker may not work. Proceeding anyways!' 122 | ( set -x; sleep 10 ) 123 | fi 124 | else 125 | echo >&2 'Warning: current kernel is not supported by the linux-image-extra-virtual' 126 | echo >&2 ' package. We have no AUFS support. Consider installing the packages' 127 | echo >&2 ' linux-image-virtual kernel and linux-image-extra-virtual for AUFS support.' 128 | ( set -x; sleep 10 ) 129 | fi 130 | fi 131 | 132 | # install apparmor utils if they're missing and apparmor is enabled in the kernel 133 | # otherwise Docker will fail to start 134 | if [ "$(cat /sys/module/apparmor/parameters/enabled 2>/dev/null)" = 'Y' ]; then 135 | if command -v apparmor_parser &> /dev/null; then 136 | echo 'apparmor is enabled in the kernel and apparmor utils were already installed' 137 | else 138 | echo 'apparmor is enabled in the kernel, but apparmor_parser missing' 139 | apt_get_update 140 | ( set -x; $sh_c 'sleep 3; apt-get install -y -q apparmor' ) 141 | fi 142 | fi 143 | 144 | if [ ! -e /usr/lib/apt/methods/https ]; then 145 | apt_get_update 146 | ( set -x; $sh_c 'sleep 3; apt-get install -y -q apt-transport-https ca-certificates' ) 147 | fi 148 | if [ -z "$curl" ]; then 149 | apt_get_update 150 | ( set -x; $sh_c 'sleep 3; apt-get install -y -q curl ca-certificates' ) 151 | curl='curl -sSL' 152 | fi 153 | ( 154 | set -x 155 | if [ "https://get.docker.com/" = "$url" ]; then 156 | $sh_c "apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9" 157 | elif [ "https://test.docker.com/" = "$url" ]; then 158 | $sh_c "apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 740B314AE3941731B942C66ADF4FD13717AAD7D6" 159 | else 160 | $sh_c "$curl ${url}gpg | apt-key add -" 161 | fi 162 | $sh_c "echo deb ${url}ubuntu docker main > /etc/apt/sources.list.d/docker.list" 163 | $sh_c 'sleep 3; apt-get update; apt-get install -y -q lxc-docker' 164 | ) 165 | if command_exists docker && [ -e /var/run/docker.sock ]; then 166 | ( 167 | set -x 168 | $sh_c 'docker version' 169 | ) || true 170 | fi 171 | DOCKER_CONF="/etc/default/docker" 172 | ;; 173 | 174 | *) 175 | cat >&2 <<-'EOF' 176 | 177 | Your platform is not easily detectable, not supported by this 178 | installer script. 179 | 180 | Sorry ! 181 | 182 | EOF 183 | exit 1 184 | esac 185 | 186 | # setup the docker bootstrap daemon too 187 | sudo -b docker -d -H unix:///var/run/docker-bootstrap.sock -p /var/run/docker-bootstrap.pid --iptables=false --ip-masq=false --bridge=none --graph=/var/lib/docker-bootstrap 2> /var/log/docker-bootstrap.log 1> /dev/null 188 | 189 | sleep 5 190 | sudo docker -H unix:///var/run/docker-bootstrap.sock load -i flannel.tar 191 | sudo docker -H unix:///var/run/docker-bootstrap.sock load -i etcd.tar 192 | sudo docker load -i hyper.tar 193 | sudo docker load -i registry.tar 194 | sudo docker load -i pause.tar 195 | sudo docker load -i gorouter.tar 196 | } 197 | 198 | start_k8s(){ 199 | # Start etcd 200 | docker -H unix:///var/run/docker-bootstrap.sock run --net=host -d --restart=always wizardcxy/etcd:2.0.9 /usr/local/bin/etcd --addr=127.0.0.1:4001 --bind-addr=0.0.0.0:4001 --data-dir=/var/etcd/data 201 | 202 | sleep 5 203 | # Set flannel net config 204 | docker -H unix:///var/run/docker-bootstrap.sock run --net=host wizardcxy/etcd:2.0.9 etcdctl set /coreos.com/network/config '{ "Network": "10.1.0.0/16", "Backend": {"Type": "vxlan"} }' 205 | 206 | # iface may change to a private network interface, eth0 is for ali ecs 207 | flannelCID=$(docker -H unix:///var/run/docker-bootstrap.sock run -d --net=host --privileged --restart=always -v /dev/net:/dev/net quay.io/coreos/flannel:0.3.0 /opt/bin/flanneld -iface="eth0") 208 | 209 | sleep 8 210 | 211 | # Configure docker net settings and registry setting and restartit 212 | docker -H unix:///var/run/docker-bootstrap.sock cp ${flannelCID}:/run/flannel/subnet.env . 213 | source subnet.env 214 | 215 | # use insecure docker registry 216 | echo "DOCKER_OPTS=\"\$DOCKER_OPTS --mtu=${FLANNEL_MTU} --bip=${FLANNEL_SUBNET} --insecure-registry=${USER}reg:${PRIVATE_PORT}\"" | sudo tee -a ${DOCKER_CONF} 217 | 218 | ifconfig docker0 down 219 | 220 | case "$lsb_dist" in 221 | fedora|centos) 222 | yum install bridge-utils && brctl delbr docker0 && systemctl restart docker 223 | ;; 224 | ubuntu|debian|linuxmint) 225 | apt-get install bridge-utils && brctl delbr docker0 && service docker restart 226 | ;; 227 | esac 228 | 229 | # sleep a little bit 230 | sleep 5 231 | 232 | install_registry 233 | 234 | install_gorouter 235 | 236 | # Start Master components 237 | docker run --net=host -d -v /var/run/docker.sock:/var/run/docker.sock --restart=always wizardcxy/hyperkube:v${K8S_VERSION} /hyperkube kubelet --api_servers=http://localhost:8080 --v=2 --address=0.0.0.0 --enable_server --hostname_override=127.0.0.1 --config=/etc/kubernetes/manifests-multi 238 | docker run -d --net=host --privileged --restart=always wizardcxy/hyperkube:v${K8S_VERSION} /hyperkube proxy --master=http://127.0.0.1:8080 --v=2 239 | } 240 | 241 | install_registry(){ 242 | # install private registry then 243 | docker run --restart=on-failure:10 -itd -p 5000:5000 -v ${HOSTDIR}:/tmp/registry-dev wizardcxy/registry:2.0 244 | 245 | echo "${PRIVATE_IP} ${USER}reg" | sudo tee -a /etc/hosts 246 | } 247 | 248 | install_gorouter(){ 249 | docker run --restart=on-failure:10 -itd -p 80:8081 -p 8082 liuyilun/gorouter 250 | } 251 | 252 | detect_lsb 253 | 254 | echo "Installing docker" 255 | install_docker 256 | echo "Done !" 257 | 258 | echo "Installing master" 259 | start_k8s 260 | echo "Done" 261 | -------------------------------------------------------------------------------- /minion.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -e 4 | 5 | url='https://get.docker.com/' 6 | # we support ubuntu, debian, mint, centos, fedora dist 7 | lsb_dist="" 8 | DOCKER_CONF="" 9 | MASTER_IP="10.168.14.145" 10 | # You can use minion's ip instead 11 | HOSTNAME="10.168.10.5" 12 | USER="cxy" 13 | K8S_VERSION=0.18.2 14 | 15 | if [ "$(id -u)" != "0" ]; then 16 | echo >&2 "Please run as root" 17 | exit 1 18 | fi 19 | 20 | if [ -z "${MASTER_IP}" ]; then 21 | echo "must set MASTER_IP and HOSTNAME variable" 22 | exit 23 | fi 24 | 25 | command_exists() { 26 | command -v "$@" > /dev/null 2>&1 27 | } 28 | 29 | detect_lsb() { 30 | case "$(uname -m)" in 31 | *64) 32 | ;; 33 | *) 34 | cat >&2 <<-'EOF' 35 | Error: you are not using a 64bit platform. 36 | We currently only supports 64bit platforms. 37 | EOF 38 | exit 1 39 | ;; 40 | esac 41 | 42 | if command_exists lsb_release; then 43 | lsb_dist="$(lsb_release -si)" 44 | fi 45 | if [ -z "$lsb_dist" ] && [ -r /etc/lsb-release ]; then 46 | lsb_dist="$(. /etc/lsb-release && echo "$DISTRIB_ID")" 47 | fi 48 | if [ -z "$lsb_dist" ] && [ -r /etc/debian_version ]; then 49 | lsb_dist='debian' 50 | fi 51 | if [ -z "$lsb_dist" ] && [ -r /etc/fedora-release ]; then 52 | lsb_dist='fedora' 53 | fi 54 | if [ -z "$lsb_dist" ] && [ -r /etc/os-release ]; then 55 | lsb_dist="$(. /etc/os-release && echo "$ID")" 56 | fi 57 | 58 | lsb_dist="$(echo "$lsb_dist" | tr '[:upper:]' '[:lower:]')" 59 | } 60 | 61 | install_docker() { 62 | user="$(id -un 2>/dev/null || true)" 63 | 64 | sh_c='sh -c' 65 | if [ "$user" != 'root' ]; then 66 | if command_exists sudo; then 67 | sh_c='sudo -E sh -c' 68 | elif command_exists su; then 69 | sh_c='su -c' 70 | else 71 | cat >&2 <<-'EOF' 72 | Error: this installer needs the ability to run commands as root. 73 | We are unable to find either "sudo" or "su" available to make this happen. 74 | EOF 75 | exit 1 76 | fi 77 | fi 78 | 79 | curl='' 80 | if command_exists curl; then 81 | curl='curl -sSL' 82 | elif command_exists wget; then 83 | curl='wget -qO-' 84 | elif command_exists busybox && busybox --list-modules | grep -q wget; then 85 | curl='busybox wget -qO-' 86 | fi 87 | 88 | case "$lsb_dist" in 89 | fedora|centos) 90 | $sh_c 'sleep 3; yum -y -q install docker-io' 91 | 92 | if command_exists docker && [ -e /var/run/docker.sock ]; then 93 | ( 94 | set -x 95 | $sh_c 'docker version' 96 | ) || true 97 | fi 98 | DOCKER_CONF="/etc/sysconfig/docker" 99 | ;; 100 | ubuntu|debian|linuxmint) 101 | export DEBIAN_FRONTEND=noninteractive 102 | 103 | did_apt_get_update= 104 | apt_get_update() { 105 | if [ -z "$did_apt_get_update" ]; then 106 | ( set -x; $sh_c 'sleep 3; apt-get update' ) 107 | did_apt_get_update=1 108 | fi 109 | } 110 | 111 | # aufs is preferred over devicemapper; try to ensure the driver is available. 112 | if ! grep -q aufs /proc/filesystems && ! $sh_c 'modprobe aufs'; then 113 | if uname -r | grep -q -- '-generic' && dpkg -l 'linux-image-*-generic' | grep -q '^ii' 2>/dev/null; then 114 | kern_extras="linux-image-extra-$(uname -r) linux-image-extra-virtual" 115 | 116 | apt_get_update 117 | ( set -x; $sh_c 'sleep 3; apt-get install -y -q '"$kern_extras" ) || true 118 | 119 | if ! grep -q aufs /proc/filesystems && ! $sh_c 'modprobe aufs'; then 120 | echo >&2 'Warning: tried to install '"$kern_extras"' (for AUFS)' 121 | echo >&2 ' but we still have no AUFS. Docker may not work. Proceeding anyways!' 122 | ( set -x; sleep 10 ) 123 | fi 124 | else 125 | echo >&2 'Warning: current kernel is not supported by the linux-image-extra-virtual' 126 | echo >&2 ' package. We have no AUFS support. Consider installing the packages' 127 | echo >&2 ' linux-image-virtual kernel and linux-image-extra-virtual for AUFS support.' 128 | ( set -x; sleep 10 ) 129 | fi 130 | fi 131 | 132 | # install apparmor utils if they're missing and apparmor is enabled in the kernel 133 | # otherwise Docker will fail to start 134 | if [ "$(cat /sys/module/apparmor/parameters/enabled 2>/dev/null)" = 'Y' ]; then 135 | if command -v apparmor_parser &> /dev/null; then 136 | echo 'apparmor is enabled in the kernel and apparmor utils were already installed' 137 | else 138 | echo 'apparmor is enabled in the kernel, but apparmor_parser missing' 139 | apt_get_update 140 | ( set -x; $sh_c 'sleep 3; apt-get install -y -q apparmor' ) 141 | fi 142 | fi 143 | 144 | if [ ! -e /usr/lib/apt/methods/https ]; then 145 | apt_get_update 146 | ( set -x; $sh_c 'sleep 3; apt-get install -y -q apt-transport-https ca-certificates' ) 147 | fi 148 | if [ -z "$curl" ]; then 149 | apt_get_update 150 | ( set -x; $sh_c 'sleep 3; apt-get install -y -q curl ca-certificates' ) 151 | curl='curl -sSL' 152 | fi 153 | ( 154 | set -x 155 | if [ "https://get.docker.com/" = "$url" ]; then 156 | $sh_c "apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9" 157 | elif [ "https://test.docker.com/" = "$url" ]; then 158 | $sh_c "apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 740B314AE3941731B942C66ADF4FD13717AAD7D6" 159 | else 160 | $sh_c "$curl ${url}gpg | apt-key add -" 161 | fi 162 | $sh_c "echo deb ${url}ubuntu docker main > /etc/apt/sources.list.d/docker.list" 163 | $sh_c 'sleep 3; apt-get update; apt-get install -y -q lxc-docker' 164 | ) 165 | if command_exists docker && [ -e /var/run/docker.sock ]; then 166 | ( 167 | set -x 168 | $sh_c 'docker version' 169 | ) || true 170 | fi 171 | DOCKER_CONF="/etc/default/docker" 172 | ;; 173 | 174 | *) 175 | cat >&2 <<-'EOF' 176 | 177 | Your platform is not easily detectable, not supported by this 178 | installer script. 179 | 180 | Sorry ! 181 | 182 | EOF 183 | exit 1 184 | esac 185 | 186 | # setup the docker bootstrap daemon too 187 | sudo -b docker -d -H unix:///var/run/docker-bootstrap.sock -p /var/run/docker-bootstrap.pid --iptables=false --ip-masq=false --bridge=none --graph=/var/lib/docker-bootstrap 2> /var/log/docker-bootstrap.log 1> /dev/null 188 | 189 | sleep 5 190 | 191 | sudo docker load -i hyper.tar 192 | sudo docker load -i pause.tar 193 | sudo docker -H unix:///var/run/docker-bootstrap.sock load -i etcd.tar 194 | sudo docker -H unix:///var/run/docker-bootstrap.sock load -i flannel.tar 195 | } 196 | 197 | install_k8s_minion() { 198 | # Start flannel 199 | flannelCID=$(sudo docker -H unix:///var/run/docker-bootstrap.sock run -d --net=host --privileged --restart=always -v /dev/net:/dev/net wizardcxy/flannel:0.3.0 /opt/bin/flanneld --etcd-endpoints=http://${MASTER_IP}:4001 -iface="eth0") 200 | 201 | sleep 8 202 | sudo docker -H unix:///var/run/docker-bootstrap.sock cp ${flannelCID}:/run/flannel/subnet.env . 203 | source subnet.env 204 | 205 | # configure docker net settings and registry, then restart it 206 | echo "DOCKER_OPTS=\"\$DOCKER_OPTS --mtu=${FLANNEL_MTU} --bip=${FLANNEL_SUBNET} --insecure-registry ${USER}reg:5000\"" | sudo tee -a ${DOCKER_CONF} 207 | 208 | ifconfig docker0 down 209 | 210 | case "$lsb_dist" in 211 | fedora|centos) 212 | yum install bridge-utils && brctl delbr docker0 && systemctl restart docker 213 | ;; 214 | ubuntu|debian|linuxmint) 215 | apt-get install bridge-utils && brctl delbr docker0 && service docker restart 216 | ;; 217 | esac 218 | 219 | # sleep a little bit 220 | sleep 5 221 | 222 | echo "${MASTER_IP} ${USER}reg" | sudo tee -a /etc/hosts 223 | 224 | # Start minion 225 | sudo docker run --net=host -d -v /var/run/docker.sock:/var/run/docker.sock --restart=always wizardcxy/hyperkube:v${K8S_VERSION} /hyperkube kubelet --api_servers=http://${MASTER_IP}:8080 --v=2 --address=0.0.0.0 --enable_server --hostname_override=${HOSTNAME} 226 | sudo docker run -d --net=host --privileged --restart=always wizardcxy/hyperkube:v${K8S_VERSION} /hyperkube proxy --master=http://${MASTER_IP}:8080 --v=2 227 | 228 | } 229 | 230 | detect_lsb 231 | 232 | echo "Installing docker ..." 233 | install_docker 234 | echo "Done !" 235 | echo "Installing minion" 236 | install_k8s_minion 237 | echo "Done !" 238 | -------------------------------------------------------------------------------- /release.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # Relase.sh will make a new realse of k8s including hyperkube image and deployment scripts 3 | # all in aio.tar.gz 4 | 5 | set -ex 6 | 7 | export VERSION=v0.18.2 8 | 9 | cd image && make 10 | cd .. 11 | sudo docker save wizardcxy/hyperkube:${VERSION} > hyper.tar 12 | sudo docker pull docker.io/kubernetes/pause 13 | sudo docker save docker.io/kubernetes/pause > pause.tar 14 | tar czvf aio.tar.gz master.sh minion.sh pause.tar hyper.tar gorouter.tar registry.tar etcd.tar flannel.tar --------------------------------------------------------------------------------