Container เหมาะกับ Cloud อย่างไร

เมื่อกล่าวถึง Cloud เราก็จะนึกไปถึง Hypervisor และ Virtual Machine ที่เป็น Virtualization องค์ประกอบสำคัญของ Cloud โดย Virtualization เต็มรูปแบบซึ่งพื้นฐานนั้นมาจาก Hypervisor-Based ที่ซึ่งพวก Host Operating System และ Hypervisor จะรันชิ้นส่วนของ VM อย่าง Independent Server ด้วย OS ของตน และ Middleware ทั้งนี้การ Virtualization ได้สร้างขอบเขตของระบบที่มีค่ามากใน Cloud และรูปแบบการ Virtualization ที่เป็นที่นิยมอยู่ตอนนี้ก็คือ Container Technology นั่นเอง

แม้ว่า Docker Container จะไม่ได้ขาด IT Support แต่ข้อจำกัดที่ยังต้องพึ่งพา Linux ทำให้จุดยืนของ Docker ในวงการ Cloud ดูไม่ค่อยชัดเจนเท่าไหร่นัก

ในการทำงานของ Container ตัว Server จะรัน OS ที่สร้าง Container แบบกึ่งอัตโนมัติเพื่อรองรับ Application ต่างๆ โดย Application พวกนี้จะแชร์การใช้งาน OS หรือ Host ร่วมกัน ทำให้ Server ไม่ต้องรัน OS ใหม่สำหรับแต่ละ VM และ รองรับการทำงาน Multi-Programming ได้ง่ายขึ้น รวมทังแบ่ง Application ออกจากกันได้ ถึงอย่างนั้นก็ยังไม่ใช่การแยกออกเป็นเอกเทศอย่างสิ้นเชิงเหมือนกับ VM

อาจกล่าวได้ว่าเทคโนโลยี Container เป็นคำตอบที่เหมาะสำหรับ Private Cloud และ Application บางอย่างของ Public Cloud โดยมี Container ยอดนิยม อย่าง Docker เป็น Platform ที่เพอร์เฟ็กต์ที่สุด

กระแสนิยม Docker ใน Cloud

Docker เป็นระบบจัดการ Container (Container Management System) อย่างหนึ่ง ที่จัดการการสร้าง Container อย่างอัตโนมัติเพื่อใช้รัน Application หรือ Component ต่างๆ โดยพื้นฐานแล้ว จะมีชุด API สำหรับจัดการ Container ที่อาจสร้างมาจากTemplate หรือ Command ซึ่งตอนนี้ Docker ก็มีการพัฒนาอยู่ตลอด ออก Orchestration Tool สำหรับ Deploy Component เพิ่มเข้ามาให้ใช้ง่ายได้ง่ายและสะดวกยิ่งขึ้น

ที่จริงแล้วการสร้างระบบ Container-Based จะทำบน OS แบบไหนก็ได้ที่รองรับการ Partition แบบ Container แต่ Docker กลับใช้ Linux Container Tool ดังนั้น Docker Container จึงรันเฉพาะ Application และ Component ของ Linux เท่านั้น แม้จะสามารถรันบน OS อื่นได้ แต่ก็ยังต้องการ Linux Guest OS ติดตั้งไว้ใน VM เพื่อรองรับการทำงานของ Container ซึ่งแน่นอนว่ามันก็ต้องรัน Application ของ Linux อีกเช่นกัน

ส่วนการรองรับ Docker ของ Windows จะเป็นการทำงานแบบที่ใช้ Docker ติดตั้งเอาไว้ใน VM (Docker-in-a-VM Approach) ซึ่งการนำ Docker มาใช้นอก Linux Host นั้นมีความยุ่งยากมาก ทำให้ผู้ใช้หลายคนรู้สึกว่าความยากมันมากเกินกว่าจะช่วยให้ทำงานได้สะดวกขึ้นอย่างที่ควร ต่อให้ผู้ใช้จะรัน Docker บน Host OS อื่นที่ไม่ใช่ Linux แต่สุดท้ายมันก็มีข้อจำกัดว่าต้องใช้ Application ของ Linux อยู่ดี อย่างไรก็ตามการ Host Docker Container บน Server ของ Windows ก็ยังถือว่าเหมาะสมกับผู้ใช้ที่มี Windows Server ขนาดใหญ่และต้องการเพิ่ม Linux-Based Application เข้าไป

ทางด้าน VM-based Virtualization และ Cloud Computing จะมีข้อได้เปรียบตรงความเป็นเอกเทศ เหมาะกับการทำ Public Cloud และ Server Consolidation อย่างยิ่ง โดยการสร้าง Application สำหรับใช้บน Cloud นั้น แทนที่จะย้าย Application จะช่วยลดความจำเป็นของการ Support ความเป็นเอกเทศในระดับนี้ลงไป

กลุ่มองค์กรสามารถ Host Container บน VM ใน Public Cloud หรือ Host ใน Data Center หรือกระทั่งบน Client Device ก็ได้ โดยใช้ Orchestration Tool ใหม่ของ Docker ในการ Deploy Container-Based Component รวมทั้งประสานการทำงานกับ Workflow แถม Tool พวกนี้ยังช่วยให้ใช้งาน Hybrid Cloud ได้สะดวกด้วยระบบ Failover ที่ใช้งานง่ายกว่าเดิม

ด้วยความเล็กและการทำงานอย่างรวดเร็วของ Container ทำให้สามารถ Scale จำนวน Load หรือ เพิ่ม/ลด Feature ได้ตามต้องการ อีกทั้ง Machine Image ที่ต้องใช้ Load โครงสร้าง Container ลงไปบน Bare-Metal หรือ VM ก็ง่ายต่อการพัฒนาระบบ และสามารถ Port ได้สะดวกอีกด้วย ตัว Application Image ที่ต้องติดตั้งลงไปใน Container ก็สามารถพัฒนาและสั่ง Deploy ได้ง่ายเช่นเดียวกัน โดยพึ่งการทำงานของ Host OS และ Middleware Service

Docker เป็นที่นิยมมากขึ้นเรื่อยๆ แต่ยังห่างไกลคำว่าเพอร์เฟ็กต์

ถึงจะได้รับความนิยมอย่างล้นหลามแต่ Docker ก็ไม่ได้สมบูรณ์แบบ ทำให้ VM ยังคงเป็นคำตอบที่ดีที่สุดสำหรับ Application ใน Public Cloud ที่มีผู้เช่าใช้เป็นจำนวนมาก เพราะว่าการเจาะระบบ VM เพื่อโจมตี Application นั้นทำได้ยากกว่าโจมตีที่ตัว Container นอกจากนี้ Docker ยังไม่ค่อยมีระบบป้องกันการดึงทรัพยากรไปใช้เกินจำเป็นของ Container จนส่งผลกระทบต่อเครื่องอื่นๆ และเพื่อบรรเทาปัญหาพวกนี้ จึงต้องรัน Container และ Docker ภายใน VM ซึ่งนับว่าเป็นพื้นฐานของการใช้งาน Docker และ VM ร่วมกัน

นอกจากนี้ ยังมีอีกวิธีหนึ่ง คือ การปรับ VM ให้ทำงานคล้ายกับ Container เรียกว่า “Mini-VM” เช่น การที่ Xen Mirage ใช้ Shim Kernel ที่มีความเป็นเอกเทศกับกับ Application อยู่บ้าง แต่จะเลี่ยงการคัดลอก OS และ Middleware ทั้งหมด

ส่วนการตัดสินใจว่าจะเลือกใช้ Container หรือ VM ดีนั้น ต้องดูจากโครงสร้างของ Application และ Source ซึ่ง Monolithic Application ที่สร้างขึ้นมาด้วย Server Consolidation จะมีขนาดใหญ่และไม่ยืดหยุ่น ใช้ประโยชน์จาก Container ได้ไม่มาก Application ที่เหมาะกับเทคโนโลยี Container คือ พวกที่มีพื้นฐานมาจาก SOA/REST เพราะ Application พวกนี้มีขนาดเล็ก กระจายตัวได้หลากหลาย ย้ายไปมาระหว่าง Cloud ได้ รวมทั้งสามารถ Scale อย่างต่อเนื่อง หรือรันการทำงานแบบเป็นช่วงๆ ได้ อย่างไรก็ดีการเลือกรันการทำงานด้วย Linux Container ก็คือการตัดสินใจเลือกใช้ Docker ไปโดยปริยาย

เทคโนโลยี Container และบทบาทของ Docker ในระบบ Cloud Computing มีแนวโน้มจะเติบโตอย่างต่อเนื่อง โดยเฉพาะเมื่อ Application ใหม่ๆ สำหรับ Cloud โดยเฉพาะได้รับการพัฒนาออกมาอยู่เรื่อยๆ นานวันเข้าก็จะมีการทำงานร่วมกันระหว่าง Docker กับ VM มากขึ้น Orchestration Tool คุณภาพสูงจะช่วยให้ผู้ใช้สามารถสั่งใช้งาน Component ใน Container หรือ VM หรือกระทั่ง Container ภายใน VM ก็ยังได้ ซึ่งเทคโนโลยีไม่ว่าจะเป็นอะไรก็ตาม จะไม่เกิดขึ้นมาเพื่อลบล้างการใช้งานของเทคโนโลยีเดิม แต่พวกมันจะทำงานร่วมกันเพื่อนำมาซึ่งประสิทธิภาพสูงสุดต่างหาก

Container Orchestration

ทั้ง Container และ OpenStack ต่างก็เป็นเทคโนโลยีสุดฮอตในระบบ Cloud แต่รู้หรือไม่ว่า Container Orchestration Tool ตัวไหนบ้างที่สามารถนำมาใช้งานร่วมกับ Open Source Cloud Platform อย่าง OpenStack ได้? มาหาคำตอบกันที่บทความนี้ได้เลย

องค์กรทั้งหลายมักใช้ Container Orchestration Tool (หรือบางครั้งก็เรียกว่า Container Orchestration Engine) ในการ Deploy, Scale, และ เชื่อมต่อส่วนประกอบต่างๆ ของ Container Technology เข้าด้วยกัน ซึ่ง Orchestration Tool นี้ช่วยให้องค์กรสามารถ Monitor พวก Container Instance เพื่อลดจำนวน Container ที่กระจายตัวอยู่ในระบบได้อีกด้วย

OpenStack Magnum Module ที่เป็นบริการ OpenStack API สำหรับ Container นั้นรองรับ 3 Container Orchestration Engine หลักๆ คือ Docker, Google Kubernetes, และ Apache Mesos

Docker เป็นหนึ่งใน Orchestration Engine ที่ได้รับความนิยมและเป็นที่รู้จักมากที่สุด Docker ทำให้ Developer สามารถ  Package และ Deploy ทั้ง Application ตลอดจนสิ่งที่ Application ต้องใช้ได้ภายในหนึ่ง Image ที่รันบนระบบของ Linux ทั้งนี้ Docker ก็มี Tool ของตัวเอง เช่น Docker Machine สำหรับสร้าง Docker Host, Docker Compose สำหรับรวบรวม Application ซับซ้อนทั้งหลายที่กระจายตัวอยู่, และ Docker Swarm สำหรับรองรับ Container Cluster ให้มีระบบ Computing ที่ยืดหยุ่นและ Scale การใช้งานได้

Google Kubernetes เป็น Container Orchestration Engine แบบ Open Source ที่รองรับการงานร่วมกับ Docker Container โดย Kubernetes นี้จะ Deploy และจัดการ Container อยู่ภายใน Compute Cluster ทั้งยังทำ Workload Balancing เพื่อคงไว้ซึ่งศักยภาพการทำงาน

Apache Mesos ก็เป็นอีกหนึ่ง Orchestration Engine แบบ Open Source ที่เน้นด้านความคงทนต่อความเสียหาย (Fault-Tolerant), Compute Cluster ขนาดใหญ่, และการรองรับ Node จำนวนนับหมื่นที่รัน Docker Container นอกจากนี้ Mesos ยังรองรับคอนเซ็ปต์ของ Jobs And Tasks รวมทั้งสภาพแวดล้อม Container ที่เปลี่ยนแปลงอยู่ตลอดและมีความสามารถการ Scale สูง ซึ่งองค์กรมักจะใช้งาน Mesos กับ Job System อย่าง Marathon สำหรับรัน Jobs และ Tasks

ผู้ใช้งาน OpenStack สามารถเลือกใช้อย่างไหนก็ได้จาก 3 Orchestration Tool นี้ โดย Engine ที่เลือกใช้จะถูก Provision อัติโนมัติไปยัง Host System ที่มี Container Deploy อยู่ทันที

Containers เปลี่ยนทุกอย่างได้อย่างไร

กลุ่ม DevOps เติบโตมาพร้อมกับ Automation Tools ทั้งหลายในช่วงที่ผ่านมา ทำให้การพัฒนา Application สมัยใหม่ไม่ใช่แค่นั่งเขียน Code แต่ Developer ยังต้องคำนึงถึงการเลือกใช้ Tools และวิธีทำงานร่วมกันเพื่อสร้าง Application

Container เป็นหนึ่งใน Tools ชิ้นสำคัญสำหรับ Workflow โดยเทคโนโลยี Container อย่าง Docker ทำให้เราสามารถจับเอาพวก Key Service จาก Infrastructure ออกมาใช้งานได้ นับว่าฉีกแนวความคิดเรื่องการ Deploy Application และการใช้ประโยชน์จาก Cloud Infrestructure ไปอย่างสิ้นเชิง

เมื่อ Infrastructure ใหม่ถูก Deploy และทดสอบเรียบร้อยแล้ว แค่เปลี่ยน DNS ก็ย้ายมาใช้งานได้ทันที วิธีการนี้จะทำให้สามารถเก็บ Virtual Infrastructure ตัวเก่าไว้เป็น Backup ได้ในช่วงแรก ก่อนจะลบมันทิ้งในภายหลัง

การสร้าง Complete Infrastructre ขึ้นมาเลยอาจฟังดูแปลก แต่เมื่อคำนึงถึงความคุ้มค่าของ Cloud Deployment แล้วก็ไม่แพงไปกว่าการ Deploy Update เฉพาะ Server หรือ Service ที่อาจจะทำงานแค่ระยะหนึ่งเท่านั้น นอกจากนี้การ Deploy ทั้งระบบยังอาจทำให้ OS หรือ ซอฟต์แวร์ได้รับการอัพเดทโดยอัตโนมัติอีกด้วย

การไม่ต้องลงทุนกับ Hardware เราสามารถใช้ Cloud Platform ตัวเดียวกันนี้ในขั้นตอน Dev, Test, และ Production ได้เลย เพียงแค่มี Virtual Network แยกแต่ละ Environment กับ Access Control ยิ่งไปกว่านั้น เรายังสามารถทำงานกับ Production Data ในขั้นตอน Development ได้ด้วยการ Clone Store เมื่อต้องการ Clean Data

 

Container แหล่งบรรจุทุกอย่าง

การบรรจุ Application ลงใน Docker Container ทำให้จัดการและดึงเอาองค์ประกอบหลักๆ ของ Application จาก Infrastructure มาได้ง่ายขึ้น ทั้งยัง Scale Service ได้อย่างอิสระ

วิธีการนี้นำมาซึ่งรูปแบบใหม่ของ DevOps คือ Idempotent Container โดยแทนที่จะสร้าง Aplication หรือ Service แบบสำเร็จ ก็เปลี่ยนมาเป็นการสร้าง Container ที่เก็บรวม Application, Service, และทุกสิ่งทุกอย่างที่ต้องใช้ในการรัน Application เข้าไว้ด้วยกัน เมื่อไหร่ก็ตามที่นึกอยากจะเปลี่ยนแปลงส่วนใดส่วนหนึ่ง ก็สร้าง Container ขึ้นมาใหม่ ทดสอบ และ Deploy ในฐานะที่เป็นทั้ง Application ไม่ใช่แค่องค์ประกอบชิ้นหนึ่ง การทำแบบนี้ช่วยลดความเสี่ยงของขั้นตอน Development ได้ ต่างจากวิธีการแบบดั้งเดิมที่จะทดสอบแค่ส่วนที่มีการเปลี่ยนแปลง

เมื่อ Container ถูกสร้างและ Deploy ขึ้นมาแล้ว จะไม่มีการเปลี่ยนแปลงอะไรจนกว่า Container อันใหม่จะถูก Deploy เพราะ Container เองก็เป็น Sandbox อย่างหนึ่ง การจะเข้าถึงและจัดการ Content ภายในจึงต้องทำผ่าน API เท่านั้น ส่วนในกรณีของ End-User ก็ต้องใช้บริการ UI ทำให้ Container เป็นรูปแบบในอุดมคติสำหรับ Microservice ที่ใช้ API เป็นแค่สื่อกลางการใช้งาน และด้วยบทบาทของ API ซึ่งเป็นเหมือนข้อตกลงระหว่างทีม DevOps ดังนั้น Container ที่รันบน Server Instance ขนาดเล็ก เช่น CoreOS หรือ Nano Server ของ Microsoft ก็จะกลายมาเป็น Block หนึ่งของ Infrastructure

 

เป็นไปตามกระแส

ไม่น่าแปลกใจเลยที่ Jenkins กลายเป็น Tool มาตรฐานในขั้นตอนการ Build ได้สร้าง Pipeline Tool ที่รองรับ Docker เพิ่มเข้ามา ลักษณะโครงสร้างที่ปรับแต่งได้ ทำให้สามารถปรับเข้ากับแต่ละ Workflow และทำงานร่วมกับ Source Control Tool รวมทั้ง Development และ Test Platform ได้ง่ายๆ

Kohsuke Kawaguchi ผู้เป็น CTO ของ Cloudbees และ Project Founder ของ Jenkins กล่าวถึงการเพิ่ม Support ของ Docker ว่า “มันช่วยผลักดันความต้องการใช้งาน Jenkins โดยมี Docker ในฐานะ Executable Package Format ให้ Compile และ Package ลงไปใน Binary Blob ที่สามารถนำไปใช้งานได้ทันที และลบทิ้งได้เมื่อไม่ต้องการแล้ว”

เห็นได้ชัดว่า Docker และ Container Format อื่นๆ เข้ากันได้ดีกับวิสัยทัศน์ของ Cloudbee ที่มีต่อ Jenkins “ผู้ใช้สามารถใช้มันสำหรับการ Test หรือ Production ได้ และถ้าล้มเหลว ก็สร้างขึ้นมาใหม่ สามารถ Compile Code ลงใน Module เหมือนกับ Ruby Gem แล้วใส่ลง Container ก่อนจะส่งไปยัง Puppet เพื่ือ Deployment”

ในขณะที่ Docker File Format อยู่ในฐานะภาษาสากลสำหรับโลก Container ทางด้าน Linux Foundation ก็กำลังสนับสนุนการพัฒนา “Open Container Format” ที่มีลักษณะเป็น Common Format ร่วม ดึงเอาเหล่า Container Developer และตัวแทนผู้ให้บริการทั้งหลายมารวมกัน กระทั่งบริษัทอย่าง Microsoft ก็เข้าร่วมด้วย ซึ่ง Common Container Format นี้จะช่วยกระจายการใช้ Container ในกลุ่มผู้ให้บริการ Cloud ทั้ง Public และ Private ให้กว้างขวางยิ่งขึ้น

อย่างไรก็ดี การมี Common Format ของ Container ไม่ได้ช่วยขจัดปัญหาด้านการจัดการ Cloud Infrastructure ที่แตกต่างกันได้ทั้งหมด แต่อย่างน้อยมันก็พอจะช่วยให้การย้าย Service ระหว่าง Cloud สะดวกขึ้น เช่น การย้ายจาก Azure ไปยัง AWS หรือ จาก OpenStack ไปยัง Google Cloud เป็นต้น ส่วน Infrasturcture ที่ถูกจัดการด้วย Puppet หรือ Chef ในระบบคลังของ Git ก็ช่วยให้พัฒนา Translation Layer ที่ใช้ Generic VM และ Network Description สำหรับ Application ได้ และมี Orchestration ที่เหมาะสม ไม่ว่าจะใช้บริการ Cloud แบบไหนอยู่ก็ตาม