Docker Swarm ใช้ในการจัดการ Cluster ของ Docker Engine ถูกสร้างขึ้นโดยใช้ Swarmkit ซึ่งจะประกอบไปด้วย Docker Host ที่ทำหน้าที่เป็น Manager, Worker หรือทำหน้าที่ทั้งสองอย่าง
Architecture
การทำงานของ Docker Swarm จะประกอบไปด้วย Manager และ Worker ซึ่งสามารถมีได้หลายตัว ซึ่งมีประโยชน์ในการทำ Fault-Tolerance โดย Docker แนะนำว่าให้มีจำนวน Manager Node เป็นเลขคี่ เพราะจะเกี่ยวข้องกับ Maximum Loss ในการทำ Recovery เวลาเกิด Failure ของ Manager Node โดยปราศจาก Downtime เช่น
- Manager 3 Node : Maximum Loss เป็น 1
- Manager 5 Node : Maximum Loss เป็น 2
- Manager N Node : Maximum Loss เป็น ( N – 1 ) / 2
เพราะฉะนั้นการเพิ่ม Manager Node จะไม่ช่วยในเรื่องของ Scale และ Performance แต่จะช่วยในเรื่องของ Fault-Tolerance
Requirement
- จัดเตรียม Linux VM 3 เครื่อง เพื่อใช้เป็น Manager 1 เครื่อง และ Worker 2 เครื่อง พร้อมติดตั้ง Docker Engine ให้เสร็จเรียบร้อย
- เปิด Port ที่จำเป็นต้องใช้ ดังนี้
- TCP 2377 : สำหรับการจัดการ Cluster
- TCP and UDP 7946 : สำหรับการติดต่อกันระหว่าง Node
- UDP 4789 : สำหรับ Overlay Network
Install
- ติดตั้ง Docker Machine
# base=https://github.com/docker/machine/releases/download/v0.14.0 &&
curl -L $base/docker-machine-$(uname -s)-$(uname -m) >/tmp/docker-machine &&
sudo install /tmp/docker-machine /usr/local/bin/docker-machine
- ตรวจสอบเวอร์ชั่น Docker Machine
# docker-machine --version
docker-machine version 0.14.0, build 89b8332
- เริ่มใช้งาน Swarm โดยจะตั้งค่า Current Node เป็น Manager แล้วทำการคัดลอก Worker Token สำหรับเครื่องที่จะมาทำหน้าที่เป็น Worker ภายใน Cluster
# docker swarm init
Swarm initialized: current node (sks9twcgv7um92ex6mgndijo5) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-2xg5rbamsh23z1ptfuyb3semspw6yfq88muyxq3ol2byc6e8nt-cc6j8hpytdib1k5dbhvqwpsok 192.168.1.1:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
- ทำการ Join Worker เข้ากับ Swarm ด้วย Worker Token ที่ได้มา
# docker swarm join --token SWMTKN-1-2xg5rbamsh23z1ptfuyb3semspw6yfq88muyxq3ol2byc6e8nt-cc6j8hpytdib1k5dbhvqwpsok 192.168.1.1:2377
This node joined a swarm as a worker.
- ตรวจสอบสถานะ Node
# docker node ls
hy2m7f8vec1ha91ow1tmjzskq lab-docker-01.lab.local Ready Active 18.06.1-ce
k94fb0kgsqc1iy97plfrdjbcj lab-docker-02.lab.local Ready Active 18.06.1-ce
sks9twcgv7um92ex6mgndijo5 * lab-docker.lab.local Ready Active Leader 18.06.1-ce
- ทำการ Deploy Service ทั้ง 3 Node
# docker service create --replicas 3 --name redis --update-delay 10s redis:3.0.6
1qx2gx6s7o1r3646ibf07lcxr
- ตรวจสอบ Service ทั้งหมดที่เราได้ Deploy
# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
1qx2gx6s7o1r redis replicated 3/3 redis:3.0.6
- ตรวจสอบสถานะของ Redis Service จะเห็นว่าทั้ง 3 Node รัน Redis Service อยู่
# docker service ps redis
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
vovj6fww1ej9 redis.1 redis:3.0.6 lab-docker-02.lab.local Running Running about a minute ago
6oqax2nw3y8i redis.2 redis:3.0.6 lab-docker-01.lab.local Running Running about a minute ago
mnzkoerqdm5k redis.3 redis:3.0.6 lab-docker.lab.local Running Running about a minute ago
- แก้ไข Availability ความพร้อมใช้งานของโหนด Worker 1 ซึ่งอยู่ใน Active Mode ตั้งค่าให้เป็น Drain Mode
# docker node update --availability drain lab-docker-01.lab.local
lab-docker-01.lab.local
- ตรวจสอบสถานะของโหนด Worker 1
# docker node inspect --pretty lab-docker-01.lab.local
ID: hy2m7f8vec1ha91ow1tmjzskq
Hostname: lab-docker-01.lab.local
Joined at: 2018-09-18 09:04:41.415038144 +0000 utc
Status:
State: Ready
Availability: Drain
...
- ตรวจสอบสถานะของ Redis Service จะเห็นว่า Redis Service ที่รันอยู่บน Worker 1 จะเห็นว่า State ถูก Shutdown แล้วไปสร้าง Service ใหม่ที่โหนด Manager
# docker service ps redis
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
vovj6fww1ej9 redis.1 redis:3.0.6 lab-docker-02.lab.local Running Running 15 minutes ago
44fsy0g41sx8 redis.2 redis:3.0.6 lab-docker.lab.local Running Running 29 seconds ago
6oqax2nw3y8i \_ redis.2 redis:3.0.6 lab-docker-01.lab.local Shutdown Shutdown 29 seconds ago
mnzkoerqdm5k redis.3 redis:3.0.6 lab-docker.lab.local Running Running 15 minutes ago
- แก้ไข Availability ความพร้อมใช้งานของโหนด Worker 1 ซึ่งอยู่ใน Drain Mode ให้กลับเป็น Active Mode
# docker node update --availability active lab-docker-01.lab.local
lab-docker-01.lab.local
- ตรวจสอบสถานะของ Redis Service อีกครั้งหนึ่ง จะเห็นว่า Redis Service ที่รันอยู่บน Worker 1 จะเห็นว่า State ยังเหมือนเดิม เหมือนตอนที่เป็น Drain Mode
# docker service ps redis
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
vovj6fww1ej9 redis.1 redis:3.0.6 lab-docker-02.lab.local Running Running 15 minutes ago
44fsy0g41sx8 redis.2 redis:3.0.6 lab-docker.lab.local Running Running 29 seconds ago
6oqax2nw3y8i \_ redis.2 redis:3.0.6 lab-docker-01.lab.local Shutdown Shutdown 29 seconds ago
mnzkoerqdm5k redis.3 redis:3.0.6 lab-docker.lab.local Running Running 15 minutes ago
- หากทำการ Stop Service redis.2 ที่อยู่บน Manager จะทำให้ไปสร้าง Service ใหม่ที่โหนด Worker 1 มันจะไม่สร้างใหม่บน Manager ที่เดิม ซึ่งก็ตรงตาม Concept Replica 3
# docker service ps redis
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
vovj6fww1ej9 redis.1 redis:3.0.6 lab-docker-02.lab.local Running Running 31 minutes ago
nzwqcjqg53xv redis.2 redis:3.0.6 lab-docker-01.lab.local Running Running 24 seconds ago
44fsy0g41sx8 \_ redis.2 redis:3.0.6 lab-docker.lab.local Shutdown Complete 29 seconds ago
6oqax2nw3y8i \_ redis.2 redis:3.0.6 lab-docker-01.lab.local Shutdown Shutdown 17 minutes ago
mnzkoerqdm5k redis.3 redis:3.0.6 lab-docker.lab.local Running Running 31 minutes ago
อ่านเพิ่มเติม : https://dockr.ly/2jh11Vd
Leave a Reply