Struggling with Swarm load balancing on AWS

Hi,

Just getting going with swarm on AWS. I’m able to create my cluster with docker-machine, init swarm and spin up a service, but I’m struggling to get the load balancing working. I’m only able to curl the app on the hosts that it’s been deployed on, other hosts do not forward on requests, no round-robin going on. I’m using the following scripts to test my cluster. Any clues would be great, getting a bit stuck here.

#!/bin/bash

aws_region=eu-west-1
instances=6

n=1
while [ $n -le $instances ]
do
machine_name=$aws_region-$n
docker-machine create
–driver amazonec2
–amazonec2-region $aws_region
–amazonec2-security-group ‘swarm-cluster’
$machine_name &
n=$(( n + 1 ))
done

#!/bin/bash

Init managers

hostname=“eu-west-1-1"
echo $hostname
manager_ip=”$(docker-machine inspect $hostname | jq -r ‘.Driver.PrivateIPAddress’):2377"
docker $(docker-machine config $hostname) swarm init --advertise-addr $manager_ip --listen-addr $manager_ip

manager_token="$(docker $(docker-machine config $hostname) swarm join-token manager -q)“
worker_token=”$(docker $(docker-machine config $hostname) swarm join-token worker -q)"

hostname=“eu-west-1-2"
echo $hostname
ip=”$(docker-machine inspect $hostname | jq -r ‘.Driver.PrivateIPAddress’):2377"
docker $(docker-machine config $hostname) swarm join
–token $manager_token
$manager_ip
–advertise-addr $ip --listen-addr $ip

hostname=“eu-west-1-3"
echo $hostname
ip=”$(docker-machine inspect $hostname | jq -r ‘.Driver.PrivateIPAddress’):2377"
docker $(docker-machine config $hostname) swarm join
–token $manager_token
$manager_ip
–advertise-addr $ip --listen-addr $ip

Init workers

hostname=“eu-west-1-4"
echo $hostname
ip=”$(docker-machine inspect $hostname | jq -r ‘.Driver.PrivateIPAddress’):2377"
docker $(docker-machine config $hostname) swarm join
–token $worker_token
$manager_ip
–advertise-addr $ip --listen-addr $ip

hostname=“eu-west-1-5"
echo $hostname
ip=”$(docker-machine inspect $hostname | jq -r ‘.Driver.PrivateIPAddress’):2377"
docker $(docker-machine config $hostname) swarm join
–token $worker_token
$manager_ip
–advertise-addr $ip --listen-addr $ip

hostname=“eu-west-1-6"
echo $hostname
ip=”$(docker-machine inspect $hostname | jq -r ‘.Driver.PrivateIPAddress’):2377"
docker $(docker-machine config $hostname) swarm join
–token $worker_token
$manager_ip
–advertise-addr $ip --listen-addr $ip

eval $(docker-machine env eu-west-1-1)

docker service create --name web --replicas 3 --mount type=bind,src=/etc/hostname,dst=/usr/share/nginx/html/index.html,readonly --publish 80:80 nginx

You can see all the services running

docker service ls

You can see all web containers running

docker service ps web

I have a terraform script that can set up a multinode swarm. I do notice it round robining though I usually expose only two IPs (because my DNS provider does not support provisioning via Terraform) and those IPs are elastic IPs. I just set my DNS to do the round robin between the two nodes

https://registry.terraform.io/modules/trajano/swarm-aws/docker/2.1.0