Last active
June 14, 2020 02:47
-
-
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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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