ลองใช้ Docker Swarm: จัดการหลายคอนเทนเนอร์แบบไม่ต้องปวดหัวเท่า K8s
สวัสดีครับทุกๆ คน!
วันนี้ผมอยากจะมาเล่าเรื่อง Docker Swarm ให้ฟังนะ คือหลายคนอาจจะคุ้นเคยกับ Docker Compose ใช่ปะ ที่เอาไว้รันหลายๆ คอนเทนเนอร์ในเครื่องเดียว
แต่ถ้าวันนึงแอปเรามันใหญ่ขึ้น อยากจะรันหลายๆ ตัวบนเซิร์ฟเวอร์หลายเครื่อง หรืออยากได้ HA (High Availability) หน่อยๆ ไม่ให้ล่มง่ายๆ ถ้าเครื่องไหนพัง ทีนี้ Compose มันก็ไม่ตอบโจทย์ละไง
คนส่วนใหญ่คงพุ่งไป Kubernetes กันเลยใช่มะ ซึ่งมันก็ดีนะ แต่บอกตรงๆ ว่ากว่าจะเซ็ตอัพ กว่าจะเข้าใจแต่ละคอนเซปต์ของมันเนี่ย หัวจะปวดเอาได้เลยนะ ผมเองก็เคยเจอช่วงแบบเห้ยนี่มันเยอะไปรึป่าวฟะ
Docker Swarm นี่แหละ คือทางออกที่อยู่ตรงกลาง แบบว่า มันเป็น Orchestration Tool ของ Docker เองเลยนะ ใช้ง่ายกว่า K8s เยอะมาก เหมาะกับโปรเจกต์ที่ไม่ต้องสเกลเบอร์ล้าน หรือทีมที่ไม่ได้มี Ops โดยเฉพาะอ่ะครับ
มาเริ่มกันเลย! (สมมติว่ามี Docker ลงอยู่แล้วนะ)
อันดับแรกเลย เราต้อง "สร้าง Swarm" ขึ้นมาก่อนครับ ปกติก็ทำบนเครื่อง Manager Node ของเรานั่นแหละ
docker swarm init --advertise-addr <YOUR_MANAGER_IP>
ตรง <YOUR_MANAGER_IP> เนี่ย ก็ใส่ IP ของเครื่องที่คุณอยากให้เป็น Manager Node ไปเลยนะ (เช่น IP ของเครื่องคุณเองถ้าลองบนเครื่องเดียว)
พอรันเสร็จ มันจะโชว์ command มาให้เราเอาไปรันบน Worker Node (เครื่องอื่นๆ ที่อยากให้มาจอยใน Swarm) แบบนี้
docker swarm join --token SWMTKN-1-xxxxxxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxx <YOUR_MANAGER_IP>:2377
ก็อปเอาไปรันบนเครื่องอื่นๆ ที่เหลือเลยนะ ง่ายดีป่ะล่ะ?
Deploy Service แรกของเรา
ทีนี้พอมี Swarm ละ เราจะ Deploy Service (แอปของเรา) เข้าไปใน Swarm ได้ไง? เราใช้ docker stack deploy ครับ ซึ่งมันจะใช้ไฟล์ docker-compose.yml (หรือจะตั้งชื่ออื่นก็ได้ เช่น stack.yml) มาเป็นตัวกำหนดคอนฟิกเหมือนเดิม
มาลองสร้างไฟล์ stack.yml ง่ายๆ ด้วย Nginx กัน
version: '3.8'
services:
web:
image: nginx:latest
ports:
- "80:80"
deploy:
replicas: 3 # อยากให้ Nginx รันกี่ตัวใน Swarm เราบอกตรงนี้เลย
update_config:
parallelism: 1
delay: 10s
restart_policy:
condition: on-failure
networks:
default:
driver: overlay
จะเห็นว่ามี deploy section เพิ่มมา ซึ่งตรงนี้แหละที่เราบอก Swarm ว่าอยากให้มันจัดการยังไง เช่น replicas: 3 คือบอกว่าอยากให้มี Nginx รันอยู่ 3 ตัวตลอดเวลา ถ้าตัวไหนตายไป Swarm จะสร้างใหม่ขึ้นมาให้ทันทีเลย โคตรคูล!
เสร็จแล้ว ก็รัน command นี้เลย
docker stack deploy -c stack.yml my_web_app
my_web_app คือชื่อ stack ของเรานะ ตั้งอะไรก็ได้
ทีนี้ลองเช็ค status ได้เลย
docker service ls
docker service ps my_web_app_web
คุณจะเห็นว่ามี Nginx รันอยู่ 3 ตัวกระจายๆ กันไปใน Node ที่เรามี โคตรเฟี้ยวป่ะ!
สเกลขึ้น-ลง ง่ายกว่าปอกกล้วย!
สมมติว่าเว็บเราเริ่มมีคนเข้าเยอะ อยากจะเพิ่ม Nginx เป็น 5 ตัว ทำไง? ง่ายโคตรๆ!
docker service scale my_web_app_web=5
แค่นี้เลย! Swarm จัดการให้หมด จะเพิ่มหรือลด ก็แค่เปลี่ยนเลขตรงนี้
Error ที่เคยเจอ (และอาจจะเจอเองได้)
เคยเจอตอนแรกๆ เลยคือเรื่อง Networking นี่แหละครับ บางทีเน็ตเวิร์ค Overlay มันไม่ยอมทำงาน หรือ Node มันมองไม่เห็นกันเอง อันนี้ต้องเช็ค Firewall ดีๆ นะว่าเปิดพอร์ตที่ Docker Swarm ต้องการหรือยัง (เช่น 2377, 7946 TCP/UDP, 4789 UDP)
อีกเรื่องคือ Port Conflict ถ้าเกิดว่าเรา deploy service ที่ใช้พอร์ต 80 เหมือนกัน แต่เราใช้ Host Port แบบ 80:80 บน Node เดียวกันเนี่ย มันจะชนกันได้นะครับ ต้องระวังตรงนี้ให้ดี
บางทีก็เจอ Permission Denied ตอน Mount Volume เนี่ยแหละ อันนี้ต้องไปเช็ค permission ของโฟลเดอร์บน Host ที่เราจะ mount เข้าไปในคอนเทนเนอร์ให้ดีๆ นะครับ
ความเห็นส่วนตัวจากคนเคยใช้
ผมว่า Docker Swarm นี่มันเหมาะกับ:
- โปรเจกต์เล็กถึงกลาง: ที่อยากได้ความสามารถ Orchestration แต่ไม่อยากเสียเวลาเรียนรู้เยอะๆ
- ทีมเล็กๆ หรือ Dev ที่ต้องทำเองหมด: เพราะมันเซ็ตอัพง่าย ดูแลง่ายกว่า K8s เยอะมาก
- ต้องการ High Availability แบบไม่ซับซ้อน: ให้แอปเราไม่ล่มง่ายๆ ถ้าเครื่องใดเครื่องหนึ่งพัง
แต่ถ้าโปรเจกต์คุณใหญ่มาก ต้องการฟีเจอร์แอดวานซ์แบบเต็มพิกัดอย่าง Auto Scaling ตามโหลด, Canary Deployments ที่ซับซ้อน, หรือมีทีม Ops ที่เชี่ยวชาญ K8s อยู่แล้วเนี่ย ก็คงต้องไป K8s นั่นแหละครับ
แต่สำหรับผมนะ สำหรับโปรเจกต์ส่วนตัว หรือระบบเล็กๆ ที่ต้องการความรวดเร็วและไม่อยากปวดหัวมาก Swarm นี่แหละตอบโจทย์สุดๆ ลองเล่นกันดูนะ สนุกดี!