Skip to content

Instantly share code, notes, and snippets.

@fxi
Last active June 14, 2020 02:47
Show Gist options
  • Save fxi/d92e53c17a98ac209336ef5ee4676451 to your computer and use it in GitHub Desktop.
Save fxi/d92e53c17a98ac209336ef5ee4676451 to your computer and use it in GitHub Desktop.
Create a "simple" docker swarm cluster : 1 data node, 1 master node, 2 workers
#!/bin/bash
set -e
#
# Create a cluster of workers on exoscale, sharing a common data folder using a NFS exports.
# (not battle tested)
#
# BASED ON THE ENTIRE WEB and those sources
# https://www.digitalocean.com/community/tutorials/how-to-set-up-an-nfs-mount-on-ubuntu-16-04
# http://www.blog.labouardy.com/docker-swarm-networking-and-dynamic-reverse-proxy/
NODE_PREFIX_="mx-node-"
NODE_DATA=$NODE_PREFIX_"data"
NODE_MASTER=$NODE_PREFIX_"1"
N_NODES_WORKERS=$(seq 2 3)
N_NODES_ALL="1 "$N_NODES_WORKERS
DIR_HOST=/home
DIR_WORKER=/nfs/home
DIR_WORKER_SHARED=$DIR_WORKER/shared
DOCKER_MACHINES=$(docker-machine ls -q)
SYS_USER="ubuntu"
SYS_USER_CHOWN=$SYS_USER":"$SYS_USER
EXO_TOKEN=$EXOSCALE_API_KEY
EXO_SECRET=$EXOSCALE_SECRET_KEY
EXO_REGION=ch-dk-2
#
# Create data machine
#
if echo $DOCKER_MACHINES | grep $NODE_DATA ;
then echo $NODE_DATA "already exists";
else
docker-machine create \
--driver exoscale \
--exoscale-api-key=$EXO_TOKEN \
--exoscale-api-secret-key=$EXO_SECRET \
--exoscale-availability-zone=$EXO_REGION \
--exoscale-image=ubuntu-16.04 \
--exoscale-disk-size=50 \
--exoscale-instance-profile=Tiny \
--exoscale-ssh-user=$SYS_USER \
$NODE_DATA;
fi
if [ ! -e $DIR_HOST ]
then
docker-machine ssh $NODE_DATA sudo mkdir -p $DIR_HOST
fi
docker-machine ssh $NODE_DATA sudo apt-get update
docker-machine ssh $NODE_DATA sudo apt-get install -y nfs-kernel-server
#
# Create workers
#
IP_NODE_DATA=$(docker-machine ip $NODE_DATA)
# backup old exports, start from scratch
docker-machine ssh $NODE_DATA sudo cp /etc/exports /etc/exports"_backup_"$(date '+%Y_%m_%d_%H_%M_%S')
docker-machine ssh $NODE_DATA "sudo sh -c 'echo \"\" > /etc/exports'"
for i in $N_NODES_ALL; do
NODE=$NODE_PREFIX_$i;
echo "Create node "$NODE
if echo $DOCKER_MACHINES | grep $NODE ;
then echo $NODE" already exists skip"
else
docker-machine create \
--driver exoscale \
--exoscale-api-key=$EXO_TOKEN \
--exoscale-api-secret-key=$EXO_SECRET \
--exoscale-availability-zone=$EXO_REGION \
--exoscale-disk-size=10 \
--exoscale-image=ubuntu-16.04 \
--exoscale-instance-profile=Tiny \
--exoscale-ssh-user=$SYS_USER \
$NODE
fi
IP_NODE=$(docker-machine ip $NODE)
docker-machine ssh $NODE sudo apt-get update
docker-machine ssh $NODE sudo apt-get install -y nfs-common
echo "Update firewall for "$NODE" Using ip "$IP_NODE" For host with ip "$IP_NODE_DATA
docker-machine ssh $NODE_DATA sudo ufw allow from $IP_NODE to any port nfs
echo "Add exports in host"
docker-machine ssh $NODE_DATA "sudo sh -c 'echo \""$DIR_HOST" "$IP_NODE"(no_root_squash,rw,sync,no_subtree_check)\" >> /etc/exports'"
echo "Restart nfs-kernel on host "
docker-machine ssh $NODE_DATA sudo systemctl restart nfs-kernel-server
if [ ! -e $DIR_WORKER_SHARED ]
then
docker-machine ssh $NODE sudo mkdir -p $DIR_WORKER
echo "Mount shared dir for "$NODE
docker-machine ssh $NODE "sudo sh -c 'mountpoint -q "$DIR_WORKER" || mount "$IP_NODE_DATA":"$DIR_HOST" "$DIR_WORKER"'"
echo "Create shared dir for "$NODE
docker-machine ssh $NODE sudo mkdir -p $DIR_WORKER_SHARED
docker-machine ssh $NODE sudo chown $SYS_USER_CHOWN $DIR_WORKER_SHARED
CMDFSTAB=$IP_NODE_DATA":"$DIR_HOST" "$DIR_WORKER" nfs auto,nofail,noatime,nolock,intr,tcp,actimeo=1800 0 0"
docker-machine ssh $NODE_DATA "sudo sh -c 'echo \""$CMDFSTAB"\" > /etc/fstab'"
fi
done
#https://github.com/ContainX/docker-volume-netshare
#
# Create swarm
#
eval $(docker-machine env $NODE_MASTER)
docker swarm init --advertise-addr $(docker-machine ip $NODE_MASTER)
TOKEN=$(docker swarm join-token -q worker)
IP_NODE_MASTER=$(docker-machine ip $NODE_MASTER)
for i in $N_NODE_WORKERS; do
eval $(docker-machine env $NODE_PREFIX_$i)
docker swarm join --token $TOKEN $IP_NODE_MASTER:2377
done
echo "Swarm cluster has been successfuly created !";
eval $(docker-machine env $NODE_MASTER)
docker node ls
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment