[EP.2–2] K8S Container Concept
Kubernetes Application Developer — K8s Series
← Previous [EP.2-1] Kubernetes Container
Else go to → [EP.0] Kubernetes Content
เนื่องจากบทที่แล้วเริ่มยาวเกินไป เจ้าของบทความจึงแบ่ง EP 2 ออกเป็นสองส่วนเพื่อให้เนื้อหาไม่เยอะจนเกินไป เริ่มกันเลยดีกว่าจากบทที่แล้วเราได้รู้เกี่ยวกับ Docker Container ไปบ้างแล้วซึ่งหลายคนอาจสงสัยว่ามันจะต่างจาก VM อย่างไร และตัว Docker ยังมี module หรือ tools อะไรให้เราใช้เพิ่มเติม เราจะมากล่าวกันในบทนี้
สิ่งที่ได้เรียนรู้ในครั้งนี้
- VM vs Container
- Docker Image
- Container vs Image
- ข้อดีของ Container
Virtual Machine vs Docker Containers
จากภาพจะเห็นว่า Docker สามารถจัดการ Container ที่ประกอบไปด้วย Libraries (Libs) และ Dependencies(Deps) ของแต่ละตัว ซึ่งต่างจาก Virtual Machine(VM) ที่ถูกจัดการด้วย Hypervisor ที่ทำหน้าที่เหมือนกับ Docker Container ประเภท ESX จะมีการลง OS เป็นของตัวเอง และต่อด้วย Libs กับ Deps จากข้อแตกต่างนี้จะเห็นว่า Docker มีขนาดที่เล็กกว่า และ Boot up ได้เร็วกว่า VM ที่ต้องใช้เวลาในการ Boot OS ทั้งระบบ
อีกสิ่งหนึ่งที่สำคัญคือ Docker Container แต่ละตัวไม่ได้เป็นอิสระจากกัน(isolation) ซะทีเดียวเพราะยังมีการใช้ OS ร่วมกันอยู่ ต่างจาก VM ที่มี OS เป็นของตัวเองดังนั้นมันจึงสามารถรัน window หรือ linux ได้ในหนึ่ง VM
Docker Image
ปัจจุบัน Docker มี containerized version ของ application ต่างๆ หรือพูดง่ายๆ คือมีตัวต้นแบบที่ผู้พัฒนานั้นๆ ทำไว้อยู่แล้ว ซึ่งตัวต้นแบบหรือที่เรียกว่า Docker Image (Images) นั้นจะถูกเก็บไว้ใน Docker Hub หรือ Docker Store
ตัวอย่างเช่น ถ้าเราต้องการ Images ของ OS, Database, Service และ Tools สิ่งที่เราต้องทำก็คือติดตั้ง Docker ลงบน host ของเรา และรันคำสั่งติดตั้ง Image ดังรูปด้านล่างจะเห็นว่ามีการใช้ Image ของ ansible, mongodb, redis และ node.js อีก 3 ตัว ซึ่งจะเห็นว่า Docker ของเราจะมี Instance Images กี่ตัวก็ได้ตามที่เราต้องการเปรียบเสมือนปลาวาฬที่บรรทุก Container
แล้วถามว่าทำไมถึงต้องรัน node.js ถึง 3 ตัวละ? คำตอบคือนั่นเป็นเพราะว่าเราต้องการทำ Load Balancer เพื่อรองรับผู้ใช้งานที่เข้ามาจำนวนมาก หากมี Container ตัวไหนตายไป เราก็สามารถสร้างขึ้นมาใหม่ทันทีแล้วรันแทนของเดิม
Container vs Image
Image คือ package หรือ template คล้ายๆ กับ VM Template ที่ทำงานในรูปแบบการจำลองขึ้นมา ซึ่ง 1 Image สามารถสร้าง Docker container ขึ้นมากี่ตัวก็ได้ โดยแต่ละ Container จะเป็น Isolated ต่อกัน พูดง่ายๆคือเป็นอิสระต่อกัน ซึ่งแต่ละตัวจะมี Enviroment และ กลุ่มของ Process เป็นของตัวเอง
อีกทั้งเรายังสามารถสร้าง Image ของเราเองได้ พอสร้างเสร็จแล้วก็ไปใส่ไว้ใน Docker Hub Repository เพื่อให้คนอื่นนำไปใช้ได้
ข้อดีของ Container
สมัยก่อนเวลา dev อยากจะ deploy app จะทำการส่ง app.war กับ manual guide ไปให้ operations ในการติดตั้ง app บน server ซึ่งเมื่อ Operations Team (Ops Team) ไม่ได้ dev เองอาจทำให้เกิดเหตุการณ์เวลามี issue เกิดขึ้นจะไม่สามารถแก้ปัญหาได้อย่างสมเหตุสมผล
ดังนั้น Docker จึงเป็นตัวรวมการ setting ต่างๆ เข้าไว้ด้วยกันในรูปแบบของ Docker Image ซึ่งวิธีการรันก็เหมือนกันหมดจึงทำให้การ deploy บน production ไม่ยากอีกต่อไป
สรุป
K8s สามารถใช้ Container Technology ในการจัดการพวก Instance ต่างๆ ที่เราสร้างขึ้นมา(ในตัวอย่างเราจะใช้ Docker เป็นหลัก) ซึ่งถ้าเราสร้าง App หรือ Service ของเราขึ้นมาเองเราสามารถทำเป็น Image เพื่อไว้รันเป็น Container หลายๆ ตัวได้ ดังนั้นเราจึงสามารถลดเวลาในส่วนของ Operation ลงได้ และสามารถแก้ไขปัญหาได้ง่ายกว่าสมัยก่อนอีกด้วย (Instance Down ก็แค่ kill ทิ้งแล้วรันตัวใหม่แทนซะ จบ)
บทความนี้เป็นบทความที่เกิดจากการทำความเข้าใจของเจ้าของกระทู้เอง ถ้าผิดพลาดประการใด ขออภัย ณ ที่นี้ด้วย และท่านผู้หลงเข้ามาอ่านสามารถ comment เพื่อ discuss กับเจ้าของกระทู้ได้เลยครับ “ไม่ต้องเกรงใจ”
หากใครชอบบทความอย่าลืม clap / share เพื่อเป็นกำลังใจให้เจ้าของกระทู้เขียนบทความต่อไป ขอบคุณครับ