├── .gitignore ├── README.md ├── sloop-common.sh ├── sloop-master.sh ├── sloop-turndown.sh └── sloop-worker.sh /.gitignore: -------------------------------------------------------------------------------- 1 | kube-deploy 2 | workdir 3 | Vagrantfile 4 | .vagrant 5 | sloop.conf 6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Sloop 2 | ![sloop](https://upload.wikimedia.org/wikipedia/commons/thumb/f/f5/Slup.png/250px-Slup.png "Sloop") 3 | 4 | Sloop lets you run a Kubernetes cluster using a hybrid solution between native and Docker. Sloop uses kube-deploy and [docker-multinode](https://github.com/kubernetes/kube-deploy/tree/master/docker-multinode) except for the `kubelet` component that is run directly in your os. All you need to get started using Sloop is `bash`, `git`, `curl` and `docker`. 5 | 6 | The reason for running your `kubelet`:s native is the full support of [Persistent Volumes](http://kubernetes.io/docs/user-guide/persistent-volumes/). 7 | 8 | Sloop uses the best of two world. Docker for bootstrapping your cluster and native `kubelet` for full Kubernetes functionality. 9 | 10 | Sloop is currently using the latest stable Kubernetes version (`v1.3.4`). 11 | 12 | ## Starting your master 13 | 14 | On your master node: 15 | ``` 16 | $ git clone https://github.com/kodbasen/sloop.git 17 | $ cd sloop 18 | $ ./sloop-master.sh 19 | $ # To watch your master start: 20 | $ watch kubectl --all-namespaces=true get pods -o wide 21 | $ # To watch your workers becoming available: 22 | $ watch kubectl get nodes 23 | ``` 24 | 25 | ## Starting your workers 26 | 27 | On your worker nodes: 28 | ``` 29 | $ git clone https://github.com/kodbasen/sloop.git 30 | $ cd sloop 31 | $ export MASTER_IP= 32 | $ ./sloop-worker.sh 33 | ``` 34 | 35 | ## Using `sloop.conf` 36 | 37 | Sloop will use the latest stable version whenever you start a master or worker. You can use a `sloop.conf` file (or setting environment variables) overriding this behavior. You can set the following variables: 38 | 39 | ``` 40 | K8S_VERSION=v1.3.5 41 | ETCD_VERSION=2.2.5 42 | FLANNEL_VERSION=0.5.5 43 | FLANNEL_IPMASQ=true 44 | FLANNEL_NETWORK=10.1.0.0/16 45 | FLANNEL_BACKEND=udp 46 | RESTART_POLICY=unless-stopped 47 | MASTER_IP=localhost 48 | NET_INTERFACE=enp0s3 49 | IP_ADDRESS=xxx.xxx.xxx.xxx 50 | USE_CNI=false 51 | ``` 52 | 53 | ## Upgrading Kubernetes 54 | 55 | To upgrade your cluster you only have to re-run the start script and Sloop will upgrade to the latest version (or the specified version). When restarting the master be sure to keep the data in `/var/lib/kubelet` or your cluster state will be erased. 56 | -------------------------------------------------------------------------------- /sloop-common.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | sloop::init(){ 4 | WORKDIR=/var/lib/kubelet 5 | BINDIR=/usr/local/bin 6 | KUBE_DEPLOY_DIR=$BASEDIR/kube-deploy 7 | KUBE_DEPLOY_COMMIT=969086b076e8f6feb6e9d8c351e620d46bb0b65e 8 | #KUBE_DEPLOY_COMMIT=master 9 | KUBELET_SRV_FILE=/run/systemd/system/kubelet.service 10 | if [ -f "$BASEDIR/sloop.conf" ]; then 11 | echo "Sloop - Reading settings from sloop.conf." 12 | source $BASEDIR/sloop.conf 13 | fi 14 | } 15 | 16 | sloop::kube_deploy(){ 17 | if [ ! -d "$KUBE_DEPLOY_DIR" ]; then 18 | sloop::clone_kube_deploy 19 | else 20 | echo "Sloop - Checking kube-deploy version" 21 | echo "$(git -C ${KUBE_DEPLOY_DIR} rev-parse HEAD)" 22 | if [ $KUBE_DEPLOY_COMMIT != "$(git -C ${KUBE_DEPLOY_DIR} rev-parse HEAD)" ]; then 23 | cd $KUBE_DEPLOY_DIR; git pull; git checkout $KUBE_DEPLOY_COMMIT 24 | fi 25 | fi 26 | source $KUBE_DEPLOY_DIR/docker-multinode/common.sh 27 | kube::log::status "Sloop - Sourced kube-deploy scripts" 28 | } 29 | 30 | sloop::clone_kube_deploy(){ 31 | echo "Sloop - Cloning kube-deploy!" 32 | git clone https://github.com/kubernetes/kube-deploy.git $KUBE_DEPLOY_DIR 33 | cd $KUBE_DEPLOY_DIR; git checkout $KUBE_DEPLOY_COMMIT 34 | } 35 | 36 | sloop::main(){ 37 | sloop::kube_deploy 38 | kube::multinode::main 39 | kube::multinode::log_variables 40 | kube::log::status "Sloop - Ready" 41 | sloop::check_version 42 | } 43 | 44 | sloop::check_running(){ 45 | if [[ ! -z $(ps aux | grep "${BOOTSTRAP_DOCKER_SOCK}" | grep -v "grep") ]]; then 46 | kube::log::status "Sloop - Kubernetes is running, please turndown first!" 47 | exit 48 | fi 49 | } 50 | 51 | sloop::check_version(){ 52 | if [ ! -f "$WORKDIR/k8s-version" ]; then 53 | kube::log::status "Sloop - Unknown kubernetes version, removing binaries!" 54 | rm -f $BINDIR/kubectl $BINDIR/hyperkube 55 | kube::log::status "Sloop - Writing kubernetes version" 56 | mkdir -p $WORKDIR 57 | echo "$K8S_VERSION" > "$WORKDIR/k8s-version" 58 | fi 59 | 60 | INSTALLED_K8S_VERSION=$(<${WORKDIR}/k8s-version) 61 | 62 | if [ $INSTALLED_K8S_VERSION != $K8S_VERSION ]; then 63 | kube::log::status "Sloop - Upgrading Kubernetes to version $K8S_VERSION" 64 | echo "$K8S_VERSION" > "$WORKDIR/k8s-version" 65 | rm -f $BINDIR/kubectl $BINDIR/hyperkube 66 | fi 67 | 68 | kube::log::status "Sloop - Kubernetes $K8S_VERSION" 69 | } 70 | 71 | sloop::install_binaries(){ 72 | mkdir -p $BINDIR 73 | RELEASE_URL="https://storage.googleapis.com/kubernetes-release/release/$K8S_VERSION/bin/linux/$ARCH" 74 | sloop::install_hyperkube 75 | sloop::install_kubectl 76 | } 77 | 78 | sloop::install_hyperkube(){ 79 | if [ ! -f "$BINDIR/hyperkube" ]; then 80 | kube::log::status "Sloop - Downloading hyperkube for native kubelet" 81 | wget $RELEASE_URL/hyperkube -O $BINDIR/hyperkube 82 | chmod a+x $BINDIR/hyperkube 83 | fi 84 | } 85 | 86 | sloop::install_kubectl(){ 87 | if [ ! -f "$BINDIR/kubectl" ]; then 88 | kube::log::status "Sloop - Downloading kubectl" 89 | wget $RELEASE_URL/kubectl -O $BINDIR/kubectl 90 | chmod a+x $BINDIR/kubectl 91 | fi 92 | } 93 | 94 | sloop::install_master(){ 95 | kube::log::status "Sloop - Installing master" 96 | API_IP="localhost" 97 | sloop::install_kubelet_service 98 | sloop::copy_manifests 99 | } 100 | 101 | sloop::install_worker(){ 102 | kube::log::status "Sloop - Installing worker master ip=$MASTER_IP" 103 | API_IP=$MASTER_IP 104 | sloop::install_kubelet_service 105 | } 106 | 107 | sloop::install_kubelet_service(){ 108 | if [ ! -f "$KUBELET_SRV_FILE" ]; then 109 | kube::log::status "Sloop - Installing kubelet service" 110 | cat > $KUBELET_SRV_FILE <<- EOF 111 | [Unit] 112 | Description=Kubernetes Kubelet Server 113 | Documentation=https://github.com/GoogleCloudPlatform/kubernetes 114 | After=docker.service 115 | Requires=docker.service 116 | 117 | [Service] 118 | WorkingDirectory=${WORKDIR} 119 | ExecStart=/bin/sh -c "exec ${BINDIR}/hyperkube kubelet \\ 120 | --allow-privileged \\ 121 | --api-servers=http://${API_IP}:8080 \\ 122 | --cluster-dns=10.0.0.10 \\ 123 | --cluster-domain=cluster.local \\ 124 | --v=2 \\ 125 | --hostname-override=\$(ip -o -4 addr list ${NET_INTERFACE} | awk '{print \$4}' | cut -d/ -f1) \\ 126 | --config=${WORKDIR}/manifests" 127 | Restart=on-failure 128 | RestartSec=5 129 | 130 | [Install] 131 | WantedBy=multi-user.target 132 | EOF 133 | fi 134 | kube::log::status "Sloop - Enabling kubelet service" 135 | systemctl enable kubelet 136 | } 137 | 138 | sloop::copy_manifests() { 139 | kube::log::status "Sloop - Copying manifests from hyperkube image" 140 | CONTAINER_NAME=hyperkube.$RANDOM 141 | 142 | mkdir -p $WORKDIR 143 | if [ -d "$WORKDIR/manifests" ]; then 144 | kube::log::status "Sloop - Removing old manifests" 145 | rm -rf $WORKDIR/manifests 146 | fi 147 | 148 | docker run --name $CONTAINER_NAME \ 149 | gcr.io/google_containers/hyperkube-${ARCH}:${K8S_VERSION} 150 | 151 | docker cp $CONTAINER_NAME:/etc/kubernetes/manifests-multi $WORKDIR/manifests 152 | docker rm $CONTAINER_NAME 153 | } 154 | 155 | sloop::start_kubelet(){ 156 | kube::log::status "Sloop - Starting kubelet service" 157 | mkdir -p ${WORKDIR}/manifests 158 | systemctl restart kubelet 159 | } 160 | 161 | sloop::turndown(){ 162 | if [ -f "$KUBELET_SRV_FILE" ]; then 163 | kube::log::status "Sloop - Stopping kubelet service" 164 | systemctl stop kubelet 165 | kube::log::status "Sloop - Disabling kubelet service" 166 | systemctl disable kubelet 167 | kube::log::status "Sloop - Removing kubelet service" 168 | rm -f $KUBELET_SRV_FILE 169 | kube::log::status "Sloop - Reloading systemd daemon" 170 | systemctl daemon-reload 171 | fi 172 | 173 | kube::log::status "Sloop - Calling kube-deploy turndown" 174 | kube::multinode::turndown 175 | 176 | if [ ! -d "$WORKDIR" ]; then 177 | kube::log::status "Sloop - Removing flannel subnet" 178 | rm -f ${FLANNEL_SUBNET_DIR}/subnet.env 179 | fi 180 | } 181 | -------------------------------------------------------------------------------- /sloop-master.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | BASEDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" 4 | 5 | MASTER_IP=localhost 6 | 7 | source $BASEDIR/sloop-common.sh 8 | 9 | sloop::init 10 | 11 | sloop::main 12 | 13 | sloop::check_running 14 | 15 | sloop::install_binaries 16 | 17 | sloop::install_master 18 | 19 | kube::bootstrap::bootstrap_daemon 20 | 21 | kube::multinode::start_etcd 22 | 23 | kube::multinode::start_flannel 24 | 25 | kube::bootstrap::restart_docker 26 | 27 | sloop::start_kubelet 28 | 29 | kube::log::status "Sloop - Done starting master node." 30 | -------------------------------------------------------------------------------- /sloop-turndown.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | BASEDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" 4 | 5 | source $BASEDIR/sloop-common.sh 6 | 7 | sloop::init 8 | 9 | sloop::main 10 | 11 | sloop::turndown 12 | -------------------------------------------------------------------------------- /sloop-worker.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | BASEDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" 4 | 5 | source $BASEDIR/sloop-common.sh 6 | 7 | sloop::init 8 | 9 | sloop::main 10 | 11 | sloop::check_running 12 | 13 | sloop::install_binaries 14 | 15 | sloop::install_worker 16 | 17 | kube::bootstrap::bootstrap_daemon 18 | 19 | kube::multinode::start_flannel 20 | 21 | kube::bootstrap::restart_docker 22 | 23 | sloop::start_kubelet 24 | 25 | kube::multinode::start_k8s_worker_proxy 26 | 27 | kube::log::status "Sloop - Done starting worker node." 28 | --------------------------------------------------------------------------------