Docker และ Kubernetes คืออะไร ทำไมคนถึงพูดกันเยอะจังนะ Part 1

Guide Tinnapat
KBTG Life
Published in
3 min readDec 17, 2020

สวัสดีครับทุกคน หลังจากเขียนเรื่อง Infrastructure Tech Stack ไปก็ห่างหายไปนานเลย วันนี้ขอคัมแบ็คด้วยการมาอธิบายถึงเรื่อง Docker และ Kubernetes ที่ค้างไว้ ว่าสองสิ่งคืออะไร และทำไมเราถึงควรหันมามองและพัฒนางานด้วย Container กันนะ

ขอเท้าความกันก่อนว่า…เวลาเราจะ Deploy แอปพลิเคชันสักตัวหนึ่ง ไม่ว่าจะยุคอดีตจนถึงปัจจุบันก็มักจะ Deploy ในรูปของ Virtual Machine หรือ VM ที่เราจะทำการสร้างและหั่นแบ่ง Environment (Env.) จำลองจากเซิร์ฟเวอร์ของเราจริงๆ โดยจะมี Base เป็นส่วน OS ไม่ว่าจะเป็น Linux หรือ Windows, มี Library และ Binary เป็นส่วนกลาง ซึ่งจำเป็นสำหรับการรันแอป และบนสุดก็จะแอปของเราดังภาพด้านล่าง ซึ่งข้อดีของการ Deploy บน VM คือการที่เราแยก Environment ของแต่ละแอปออกจากกันได้อย่างชัดเจน ไม่มีการแย่ง Resource กันเพราะได้ขอตั้งแต่การตั้งเครื่องอยู่แล้ว

แต่ข้อเสียของ VM ก็มาจากข้อข้างบนครับ เมื่อทำการแยก Env. จากกัน เวลาที่เราจะ Clone หรือ Scale แอป เราต้องยกมาทั้งแผง ตั้งแต่ OS ไปจนถึงแอป ทำให้เกิดความล่าช้าทั้งในการ Clone ที่ OS มีขนาดใหญ่ การบูตและรอจนแอปพร้อมใช้ รวมถึงโอกาสการหลุดและความต่างของ Library Version ที่หากเราทดลองใน Test Env. ด้วยเวอร์ชันที่ไม่เท่ากับ Production อาจส่งผลให้ไม่สามารถใช้งานได้

Deployment Era
Deployment Era.

ด้วยปัญหาข้างต้น จึงเกิดคอนเซปต์ที่เรียกว่า Container ซึ่งจะเข้ามาแก้ปัญหาข้างต้นทั้งหมด Container คือวิธีการ Deploy ประเภทหนึ่งที่จะให้เรา Pack ของที่สำคัญและมีความจำเป็นต่อการรันแอปสักตัวหนึ่ง เช่น Application Code, Bin และ Library ที่ต้องใช้ ทำออกมาในรูปแบบของ Image และสามารถนำไปใช้ทั้งบนแล็บท็อปของเราหรือจะเป็นบน Production Server ก็ได้ ขอแค่มี Runtime ในตลาดตอนนี้เต็มไปด้วยเครื่องมือหลากหลายมาก แต่ที่ทุกคนรู้จักกันดีก็คือ Docker นั่นเอง

Docker

คือ Containerization Tool ประเภทหนึ่งที่ช่วยให้การ Deploy และรันแอปพลิเคชันเป็นเรื่องง่ายในทุกแพลตฟอร์ม ข้อดีของ Docker นั้นมีหลายอย่างด้วยกัน เช่น

  1. Lightweight & Isolation อันนี้ชัดมาก เพราะจากคอนเซ็ปต์ของ Container ที่ใน Image จะไม่มี OS อีกแล้ว ทำให้ขนาดพื้นที่ใช้สามารถนำออกไปได้เยอะ รวมถึงแยก Env. ออกจากชิ้นส่วนอื่น ทำให้ไม่มีการแย่ง Resource กันระหว่างแอปพลิเคชัน
  2. Portability พกไปใช้ที่ไหนก็ได้ ขอแค่มี Container Runtime ที่สามารถรันได้เป็นพอ
  3. Robustness ด้วยความที่ Lightweight ความจำเป็นในการใช้ Infrastructure Resource ก็จะลดลงไปได้เยอะ สามารถช่วยให้ประหยัดราคาที่ต้องจ่าย และเวลาในการบูตแอปพลิเคชันก็จะไวขึ้นได้อีก

การใช้งาน Docker ไม่ยากเลย เช่น ถ้าเราอยากลอง Deploy Image สักตัว เราสามารถทำผ่าน Docker Command Line หรือ ถ้าเราเป็นสาย Advanced แล้วอยาก Build & Deploy Image ของตัวเอง ก็สามารถทำผ่านสิ่งที่เรียกว่า DockerFile ที่จะให้เราเขียน Configuration รวมสเต็ปที่เราจะไว้ใช้ในการ Build ต่อ 1 Image ตามที่ผมแนะนำไปด้านบน สุดท้ายเมื่อได้ Image ที่พร้อมใช้ เราก็สามารถนำมาทดลองใช้ หรือจะเก็บไว้ใช้ในอนาคตผ่าน Image Repository เช่น DockerHub เป็นต้นครับ

จากซ้าย -> ขวา: Docker Client (ไว้ให้เราเรียกผ่าน CLI), Docker Host และ Container Image Registry — Ref

แต่ในความเป็นจริง งานที่มีความสำคัญ เช่น แอปพลิเคชันที่ต้องนำไปให้ลูกค้าใช้จริงบน Production การจะ Deploy แอปด้วย Docker นั้นไม่เพียงพอ เพราะเรายังต้องมากังวลว่าถ้า Container ที่เราใช้เกิดตายขึ้นมา เราจะมีวิธีแก้อย่างรวดเร็วได้อย่างไร หรือถ้าเกิดเหตุการณ์ที่เป็นช่วงพีคมากๆ เช่น ช่วงสิ้นเดือนที่เงินเดือนออก เราจะมีวิธี Scale Infrastructure ให้ทันกับ Request ตามที่ขอไหม จึงนำมาสู่สิ่งที่เรียกว่า Container Orchestration อย่าง “Kubernetes”

Kubernetes

Kubernetes (K8S) คือ Open-Source Container Cluster Orchestration ที่ทำหน้าที่ในการช่วย Automate Deploy, Manage และ Scale แอปพลิเคชันโดยที่เราไม่ต้องกังวลว่าระบบจะรองรับงานที่ต้องรับ Request จำนวนมากตาม Business Event ต่างๆ ได้ไหม

ส่วนประกอบของ Kubernetes ถ้าให้ผมอธิบายอย่างคร่าวๆ จะมีตามนี้

Kubernetes Architecture ที่มี 2 ส่วนใหญ่ๆคือ Control Plane & Data Plane
  1. Control Plane ฝั่งซ้ายในกรอบสีฟ้า คือส่วนในการจัดการทั้ง Cluster ไม่ว่าจะเป็นการติดต่อกันระหว่าง User กับ Cluster หรือภายใน Cluster กันเอง คอยดู Event การสั่ง Deploy และชี้ว่าให้ไปลง Workload ที่เครื่องไหน หรือการเก็บข้อมูลทุก Component เช่น Config, Data, หรือ Metadata
  2. Data Plane เรียกง่ายๆ ว่า Zone ที่เรานำ Container แอปของเราไปวางและใช้บน Infrastructure ของเรา

โดยหน่วยที่เล็กที่สุดใน Kubernetes จะเรียกว่า “Pod” ซึ่งเป็นการรวมกลุ่มของ Container ว่าแอป 1 ตัวจะต้องใช้อะไรบ้าง เช่น Container Image, Configuration, Storage, etc. เพื่อให้การจัดการ Container เป็นไปตามที่เรากำหนดและพร้อมใช้ในทุกสถานการณ์ ดังนั้นเวลาเรา Deploy แอปใน Kubernetes สิ่งที่เล็กที่สุดที่เราจะ Deploy ได้คือ Pod นั่นเองครับ

มาดูข้อดีเพิ่มเติมของ Kubernetes ที่เด่นๆ นอกจากการจัดการ Container กันบ้างครับ

  1. Automate Rollout & Rollback คือเมื่อเราทำการ Deploy Container ลงไปใน Cluster แล้ว เราสามารถหลีกเลี่ยงการเกิด Downtime ในระบบผ่านสิ่งที่เรียกว่า Rolling Deployment คือการค่อยๆ ทยอยเปลี่ยน Image Version โดยจะไม่กระทบทั้งหมด หรือหากเรา Deploy ไปแล้วมีปัญหาก็สามารถ Automate Rollback ได้ทันท่วงที
  2. Service Discovery & Load Balancing ภายใน K8S จะมี DNS เป็นของตัวเองเวลาที่เราต้องการเรียก Service กันไปมาใน Cluster เราจึงไม่ต้องจำ IP แต่สามารถโดยเรียกผ่านโดยชื่อของ Service นั้นๆ ได้เลย และ เมื่อเรา Deploy แอปหลายตัว Kubernetes ก็สามารถจัดการ Load Balance ไปมาระหว่างแอปให้ด้วย
  3. Self-Healing เมื่อแอปพลิเคชันที่เรา Deploy ลงไป หรือ Infrastructure ของเราเกิด Access ไม่ได้ Kubernetes ก็สามารถช่วยตรวจสอบและแก้ไขให้จนเป็นปกติได้ตาม Config ที่เราเซ็ตไว้นั่นเอง

ถึงตรงนี้แล้วขอพักไว้ตรงนี้ก่อนนะครับ เรียกได้ว่าเขียนมายาวนานพอตัว 555+ แต่จริงๆ แล้ว Docker & Kubernetes ยังมีอีกหลายหัวข้อและ Key Component ที่น่าสนใจ ไว้มีโอกาสจะนำภาค 2 มาให้อ่านกันต่อนะครับ ขอบคุณครับ

สำหรับชาวเทคคนไหนที่สนใจเรื่องราวดีๆ แบบนี้ หรืออยากเรียนรู้เกี่ยวกับ Product ใหม่ๆ ของ KBTG สามารถติดตามรายละเอียดกันได้ที่เว็บไซต์ www.kbtg.tech

--

--