Compose on Kubernetes ทางเลือกใหม่ในการจัดการ Docker

Apipol Sukgler
Red Crane
Published in
3 min readMay 3, 2019

ในปัจจุบันหลากหลายบริษัทเริ่มใช้ Cloud กันมากขึ้น ซึ่งหนึ่งใน Tools ที่ขาดไม่ได้เลยในการ Deploy Software ขึ้นบน Cloud นั่นก็คือ Docker

Docker เป็นตัวเอก ที่หลายๆ บริษัทเลือกใช้ ด้วย Concept Container

ไม่ว่าจะ Run ที่ไหน Environment ก็จะเหมือนกันทั้งหมด หมดปัญหาเวลาที่ Developer ชอบตีกับทีม Deploy แล้วพูดว่า

“Server ด้านบนพัง แต่เครื่องผมรันได้นะ”

ทำให้เราได้ Production-like Environment อีกทั้งใช้ Resource ไม่มากทำให้มี Overhead ต่ำ เหมาะกับการ Scale-Out

แต่หลายๆ บริษัทที่ไปปรับใช้ Docker มักจะเจอปัญหาในการจัดการกับ Container จำนวนมากไม่ไหว ใช้แบบ docker native ก็แล้ว ใช้แบบ docker-compose ก็แล้วแต่ก็ยังไม่ตอบโจทย์ ในการใช้งาน Container จำนวนมากจะต้องบริหารจัดการแบบ ในตลาดมี Tool ที่เกิดขึ้นมาเพื่อแก้ปัญหา ซึ่งสำหรับการจัดการ docker แบบ Cluster ที่เรารู้จักกันดีจะมี 2 เจ้าคือ

  • Swarm
    เป็น Native Docker ที่ทำมาเพื่อ scale cluster ขนาดใหญ่ โดยเวลาใช้งานจะใช้ docker-compose.yml ในการ define resource ต่างๆ ขึ้นมาใช้งาน ซึ่งทำให้ทั้ง developer และทีม deploy สามารถใช้ไฟล์เดียวกันในการ develop & deploy
  • Kubernetes
    เป็นโปรเจ็ค Opensource ที่ Google สร้างขึ้นใช้ภายในเอง จะต่างกับ swarm เราจะต้อง define resource ต่างๆ จะแบ่งเป็น pod, service, deployment ซึ่งแต่ละส่วนจะมีการเขียนที่แตกต่างกัน

ข้อดีของ Swarm คือเราสามารถใช้ docker-compose ที่ developer ใช้ไป deploy ได้เลย แต่ network ของ Swarm เป็น overlay ซึ่งสร้างความซับซ้อนให้กับคนที่ดูแล ซึ่งต่างจาก kubernetes ที่ network เป็นแบบ flat สามารถมองเห็นกันได้หมด แต่การ deploy ต้องใช้ไฟล์ yml หลายไฟล์ในการ deploy แต่ kubernetes ได้รับความนิยมมากบน google cloud

ทำให้บางคนเหล่าผู้ใช้ swarm ก็อยากย้ายไป kubernetes บ้าง แต่ก็ไม่อยากย้ายเนื่องจากต้องแก้จาก docker-compose.yml ให้เป็น pod, service, deployment ซึ่งจากที่เคยต้องบริหารจัดการแค่ file เดียว กลายเป็นว่าต้องจัดการเป็นหลายสิบไฟล์

เคยมี community กลุ่มหนึ่งสร้าง project kompose ขึ้นเพื่อแปลง docker-compose.yml เป็นแบบ kubernetes ให้ แต่

แต่ปัญหานี้ได้หมดไปแล้ว เมื่อเดือน ธค. 2018 ที่ผ่านมาในงาน docker conference 2018 europe ได้มีการเปิดตัว compose on kubernetes และเปิดเป็นโปรเจ็ค public เป็น opensource บน github ซึ่งในส่วนของ compose on kubernetes จะทำให้ เราสามารถรัน docker-compose บน kubernetes ได้

โดยเราสามารถทดลองเล่นผ่าน Docker Desktop หรือ Docker Enterprise ตั้งแต่ version 2.0.2.0 ขึ้นไปสำหรับ edge release

ลองใช้ Compose on Kubernetes ใน Docker Desktop กัน

ใน Desktop Version ต้องทำการ Enable local cluster ก่อน จึงจะใช้ compose on kubernetes ได้ (ใช้เวลาสักพักในการ setup)

หมายเหตุ: ควรใช้เครื่องที่มี RAM มากกว่า 8 GB ขึ้นไป มิฉะนั้นจะช้ามากๆ

จากนั้นลองพิมพ์คำสั่ง เช็คดูว่า มี compose api หรือยังด้วย

kubectl api-versions | grep compose

จะต้องมีดังนี้

compose.docker.com/v1beta1
compose.docker.com/v1beta2

ลองสร้าง docker-compose.yml

// docker-compose.yml
version: '3.3'

services:

db:
build: db
image: dockersamples/k8s-wordsmith-db

words:
build: words
image: dockersamples/k8s-wordsmith-api
deploy:
replicas: 5

web:
build: web
image: dockersamples/k8s-wordsmith-web
ports:
- "33000:80"

ลอง Run ผ่าน command docker stack

docker stack deploy --orchestrator=kubernetes -c docker-compose.yml hellokube

โดยเราสามารถ access ผ่าน kubectl ได้อีกด้วย

เท่านี้เราก็สามารถใช้ docker-compose เดียวทำงานตั้งแต่การ develop ไปจนถึง production environment ได้โดยที่ใช้ไฟล์ Config เดียวกันทั้งหมด

ในส่วนของการ Setup Compose on Kubernetes สามารถลองเล่นเพิ่มเติมได้ใน minikube (แต่ถ้าเป็น GKE ของ Google จะต้องรอ PR นี้ Release ลงใน Docker-cli ก่อนจึงจะใช้ได้ แต่ถ้าใครไม่อยากรอก็สามารถ compile Docker-cli มารันเองก็ได้ :) )

ในส่วนของเบื้องหลังว่าแล้ว compose on kubernetes ทำยังไงให้สามารถ run ผ่าน docker-compose.yml ได้ ไว้พูดคุยในบทความถัดไป

Reference:

--

--

Apipol Sukgler
Red Crane

Full-Stacked Developer. Let’s share to the world :)