Install Docker Swarm for Redis Service

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 ที่จำเป็นต้องใช้ ดังนี้
    1. TCP 2377 : สำหรับการจัดการ Cluster
    2. TCP and UDP 7946 : สำหรับการติดต่อกันระหว่าง Node
    3. 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

Your email address will not be published. Required fields are marked *