Adding New Nodes

Preparation for New Node:

# On new node - Install Docker Engine 28.4.0
curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh

# Configure user permissions
sudo usermod -aG docker $USER

# Verify Docker installation
docker version

Join New Worker Node:

# On manager node - Get join tokens
docker swarm join-token worker
# Output: SWMTKN-1-[SECRET]-[SECRET]

# On new worker node
docker swarm join --token SWMTKN-1-[SECRET]-[SECRET] 10.0.4.11:2377

# Verify node addition
docker node ls

Join New Manager Node(if needed):

# On existing manager - Get manager token
docker swarm join-token manager

# On new manager node
docker swarm join --token SWMTKN-1-[SECRET]-[SECRET] 10.0.4.11:2377

# Verify manager status
docker node ls

Configure Node Labels and Constraints:

# Add node labels for service placement
docker node update --label-add storage=ssd p0
docker node update --label-add environment=production p1
docker node update --label-add environment=development p2

# Update service constraints to use labels
# In stack files:
placement:
  constraints: 
    - node.labels.storage == ssd
    - node.labels.environment == production

Service Migration

Migrate Service to Different Node:

# Update service constraint
docker service update --constraint-add "node.hostname==new-node" service-name
docker service update --constraint-rm "node.hostname==old-node" service-name

# For services with storage dependencies
# 1. Stop service
docker service scale service-name=0

# 2. Move data (if needed)
rsync -av /mnt/swarm-data/service/ new-node:/mnt/swarm-data/service/

# 3. Update stack configuration
# 4. Redeploy service
docker service scale service-name=1

Drain Node for Maintenance:

# Gracefully move services away from node
docker node update --availability drain node-name

# Verify services have moved
docker service ps service-name

# Return node to active status
docker node update --availability active node-name

Load Balancing Optimization

Distribute High-Traffic Services:

# Example: Scale Taylor's Tracker across all worker nodes
tracker-prod_tracker-app:
  deploy:
    replicas: 3
    placement:
      constraints: [node.role == worker]
      preferences:
        - spread: node.hostname

Optimize Database Connections:

# Connection pooling for high-traffic applications
environment:
  DB_POOL_SIZE: "20"
  DB_MAX_OVERFLOW: "10"
  DB_POOL_TIMEOUT: "30"

Implement Service Mesh(Advanced):

# Consider Consul Connect or Linkerd for:
# - Service-to-service encryption
# - Advanced load balancing
# - Circuit breaking
# - Observability