สวัสดีครับ ชาว IT กลับมาพบกันอีกครั้งนะครับ สำหรับ Blog ในครั้งนี้ผมจะมาแนะนำว่า Kubernetes คืออะไร ทำไม Developer ถึงนิยมใช้งานเจ้าตัวนี้กันครับ
Kubernetes คืออะไร?
Kubernetes เป็น Platform แบบ Open-source ที่ใช้สำหรับดูแลจัดการ Container workload และ Container service โดยรองรับทั้งการสั่งการแบบ Declarative และแบบ Automation ซึ่งทำให้เป็นที่นิยมในการใช้งานอย่างรวดเร็วครับ
ชื่อของ Kubernetes มีรากฐานมากจากภาษากรีก หมายถึง นายท้ายเรือ (คนที่บังคับทิศทางการเดินเรือด้วยพวงมาลัย) สังเกตได้จาก Logo ของ Kubernetes จะเป็นรูปพวงมาลัยเรือ โดยผู้ที่เริ่มพัฒนา Kubernetes ก็คือ Google จากการทำเป็น Open-source project ในปี 2014
ก่อนที่จะมาใช้เทคโนโลยีของ Container กัน เราผ่านอะไรกันมาแล้วบ้าง?
ขอแบ่งออกเป็น 3 ยุคสมัย ได้แก่ Traditional Deployment, Virtualized Deployment และ Container Deployment
Traditional Deployment
องค์กรส่วนใหญ่จะติดตั้ง Application ไว้บน Physical Server ซึ่งไม่สามารถคาดเดา Resource ของ App ที่จะใช้งานบน Physical Server ได้ ทำให้เกิดปัญหาเรื่องการกระจาย Resource ไม่ทั่วถึง เช่น ถ้าเรามี App หลาย ๆ ตัว Run บน Physical Server เดียวกัน จะมี App บางตัวที่กิน Resource ไปจนเกือบหมด ไม่เหลือให้ตัวอื่นๆ ได้ทำงานแบบเต็มประสิทธิภาพ ในยุคนั้นวิธีแก้ไขคือ การติดตั้ง App ไว้คนละ Physical Server กัน แต่การทำแบบข้างต้นจะมีค่าใช้จ่ายที่ค่อนข้างสูงไปสำหรับองค์กรเนื่องจากบางที App นั้นก็ไม่ได้ใช้ Resource เยอะ ทำให้ Physical Server นั้น มี Resource ว่างเสียไปเปล่าๆ และยังต้องเสียค่า Maintenance Physical Server หลาย ๆ ตัวเพิ่มอีกด้วย
Virtualized Deployment
ขยับมาอีกยุคนึง ที่มีการพัฒนาระบบ Virtualize ขึ้นมา ทำให้สามารถสร้าง Virtual Machine (VM) แล้วนำไป Run บน Physical Server เครื่องเดียวได้โดย VM จะเปรียบเสมือน Physical Server ที่ประกอบไปด้วย CPU, Memory, Hard disk , Operating system และ Network เป็นของตัวเองทำให้ระบบ Virtualize สามารถติดตั้ง App แยกออกจากกันด้วย VM และสามารถตั้งค่าความปลอดภัยไม่ให้ App เข้าถึงข้อมูลของ App อื่น ๆ ได้ และมีความสามารถในการกระจาย Resource ของ Physical ได้อย่างเหมาะสม ทำให้การเพิ่ม/ลด Resource สามารถทำได้ง่ายกว่า และยังช่วยลดค่าใช้จ่ายในการที่จะต้องซื้อ Physical Server เพื่อติดตั้ง App แยกเครื่องกันเหมือนแบบ Traditional อีกด้วยครับ
Container Deployment
ระบบแบบ Container จะคล้าย ๆ กับแบบ VM แต่จะยืดหยุ่นกว่าตรงที่จะใช้ Operating System เป็นแบบแชร์ร่วมกัน ทำให้ Containers จะมีขนาดเล็กกว่า VM เนื่องจากไม่ต้องติดตั้ง OSContainers มี Filesystem เป็นของตัวเอง มี CPU, Memory, Space และอื่น ๆ คล้าย ๆ VM จากโครงสร้างเบื้องต้นที่กล่าวไปทำให้ Containers มีทางเลือกที่หลากหลายในการย้ายไปติดตั้งบน Infrastructure อื่น ๆ ได้ง่ายกว่า VM เพราะสามารถ นำไปติดตั้งบน Operating System อะไรก็ได้ที่รองรับ แน่นอนว่าการย้ายขึ้น Cloud ก็สามารถทำได้เช่นกันครับ
ประโยชน์ของ Containers
- สร้าง App บน Containers ได้ไวกว่า VM ถ้าหากเปรียบเทียบกันระหว่าง Container Image และ VM Image
- ลดความล่าช้าในการ Develop, Integrate และ Deploy ด้วยการใช้ Container Image ในการ Build และ Deploy รวมไปถึงการ Rollbacks ที่ทำได้ง่าย
- แยกการทำงานกันระหว่างฝั่ง Develop และ Operation ทำให้ Developer สามารถสร้าง App ได้เลยโดยไม่ต้องรอการเตรียม Infrastructure จากทาง Operation team
- ดูข้อมูลได้ลึกถึงระดับ Application Health
- สามารถใช้ Laptop ตัวเดียวในการ Run Dev, Test และ Production ได้
- Run บน OS หลัก ๆ ได้ เช่น Ubuntu Red Hat Enterprise, CoreOs ไม่ว่าจะเป็น On-Premise หรือบน Cloud
- ปรับแต่ง App ได้จากหน้า Console เดียวไม่ต้อง Access เข้าไปใน OS เหมือนของ VM
- สร้าง Service ย่อยๆ หลายๆ ตัวแยกกันแล้วนำมาประกอบกันให้ทำงานร่วมกันได้ (Micro-service)
- สามารถประเมินประสิทธิภาพของ App ได้ เนื่องจาก Resource มีการแบ่งแยกออกจากกันด้วย Container
Kubernetes มีบทบาทในการทำงานร่วมกับ Containersอย่างไร?
Containers เป็นเทคโนโลยีที่เหมาะกับการ Run App โดยทั่วไปแล้วการออกแบบ Infrastructure ใน Zone Production ไม่ควรจะมีการ Down เกิดขึ้น ยกตัวอย่างเช่น ถ้า Containers ตัวนึงเสียไป อีกตัวจะต้อง Start ขึ้นมาทำงานแทน แต่การที่จะจัดการ Containers ที่ใช้ Run App ดังกล่าวได้ ตามหลักแล้วจะต้องทำแบบ Manual ด้วย Operation Team แต่ถ้าใช้ Kubernetes ซึ่งเป็นระบบที่สามารถเข้ามาช่วยจัดการปัญหานี้ให้ได้โดยอัตโนมัติและช่วยในเรื่องของการทำให้ระบบของคุณมีความยืดหยุ่นในการทำงานมากยิ่งขึ้น โดย Kubernetes จะเข้าไปจัดการเรื่องการ Scaling และการ Failover ของ Application, จัดการเรื่อง Pattern ในการ Deploy และอีกมากมาย
อะไรคือความสามารถของ Kubernetes?
Service Discovery และ Load Balancing – ทำให้ Containers ใช้ DNS name หรือ Map IP Address ได้ และถ้า Traffic ที่วิ่งเข้า Container สูง Kubernetes จะเป็นตัวจัดการเกลี่ย Load และกระจาย Network traffic ให้การทำงานของ App เสถียร
Storage Orchestration – Kubernetes จะอนุญาตให้คุณ Mount Storage แบบไหนมาใช้ก็ได้ ไม่ว่าจะเป็น Local Storage, Storage บน Cloud หรือแบบอื่น ๆ
Rollouts และ Rollbacks ได้แบบอัตโนมัติ – สามารถสั่งให้ Kubernetes สร้าง Containers หรือ ลบ Container ได้แบบอัตโนมัติ
Automatic Bin Packing – กำหนด Spec ของ CPU และ Memory ที่ต้องการสำหรับ Container Kubernetes จะเลือก Node ที่เหมาะสมที่ Deploy ให้โดยอ้างอิงจาก Resource ที่มี
Self-healing – Kubernetes restart containers ที่พัง, เปลี่ยน Containers เป็นเครื่องใหม่, ลบ Container ที่ไม่ตอบสนองต่อ Health check และจะไม่ประกาศใช้งาน Containers ที่มีปัญหาจนกว่าจะถูกแก้ไขจนกลับมาใช้งานได้
Secret และ Configuration Management – Kubernetes สามารถใช้เก็บข้อมูลที่สำคัญหรือที่เป็นความลับได้ เช่น Password, Token และอื่น ๆ โดยสามารถ Deploy และ update ลงไปใน Containers ได้เลย ไม่ต้อง Rebuild ใหม่
สิ่งที่ทำให้ Kubernetes แตกต่างจากโครงสร้างแบบอื่น
จากที่กล่าวมาข้างต้น Kubernetes จะไม่มีลักษณะการทำงานที่เหมือนกับแบบ Traditional เนื่องจากเป็นการทำงานในระดับ Container Level มากกว่า Hardware Level ซึ่งมีความสามารถของ Platform as a Service ทั่ว ๆ ไป เช่น การ Deploy, การทำ Scaling, การทำ Load Balance และให้ User เอาระบบ Log, Monitor หรือ Alert ต่าง ๆ มา Integrate ได้ เป็นต้น
- ไม่ได้ Limit ชนิดของ Application ทำให้รองรับ Workload ได้หลากหลายรูปแบบ เช่น Stateless, Stateful และ Data-processing ง่าย ๆ คือ ถ้า App run บน Container ได้ ก็ Run บน Kubernetes ได้
- ไม่ต้อง Deploy source code และไม่ต้องสร้าง App สามารถใช้แบบ CI/CD ได้เลย
- ไม่ได้เอาไว้ทำพวก Middleware เช่น Spark, MySQL และ Ceph
นอกเหนือจากทั้งหมด Kubernetes ไม่ได้เป็นเพียงแค่ระบบ Orchestration สำหรับ Containers เท่านั้น ตามปกตินิยามในเชิงเทคนิคของ Orchestration คือการกำหนด Workflow ว่าต้องทำอะไร เช่น Step 1 ทำขั้นตอน A แล้วค่อยไป B และ C ต่อนะ แต่ในทางกลับกัน Kubernetes สามารถจะสั่งให้ทำตัวไหนก่อนก็ได้ แยกเป็นอิสระออกจากกัน ผลลัพธ์ที่ได้ทำให้ง่ายต่อการใช้งาน ยืดหยุ่น และสามารถ Scale เพิ่ม/ลด ได้
เป็นอย่างไรกันบ้างครับ สำหรับ Blog นี้ที่พูดถึงนิยามเบื้องต้นและบอกถึงประโยชน์ในการใช้งานของ Kubernetes นะครับ หากท่านใดสนใจอยากทราบข้อมูลเกี่ยวกับ Kubernetes ในด้านอื่นๆ สามารถแจ้งหัวข้อที่สนใจเข้ามาเป็นไอเดียเพิ่มเติมให้กับผู้เขียนได้นะครับเช่น Kubernetes มี Component อะไรบ้าง ใช้ API อย่างไร หรือเรื่องอื่น ๆ ที่เกี่ยวข้องกับ IT ก็สามารถแนะนำเข้ามาได้นะครับ และสุดท้ายหากมีข้อมูลที่ผิดพลาดหรือตกหล่นประการใด ต้องขออภัยไว้ ณ ที่นี้ด้วย ท่านสามารถแนะนำหรือ Comment ได้ที่โพสด้านล่างนะครับ
หมายเหตุ: Blog นี้เป็นเพียงความคิดเห็นส่วนตัว อาจมีข้อผิดพลาด หรือการเปลี่ยนแปลงได้ตามความเหมาะสมครับ