Kubernetes Container Runtimes คืออะไร?

สวัสดีครับเพื่อน ๆ ชาว IT วันนี้กลับมาพบกันอีกครั้งกับ Cloud HM Blog สาระน่ารู้เกี่ยวกับเรื่องไอทีจิปาถะ ช่วงนี้ผมจะเน้นเรื่อง Container เป็นพิเศษเพราะว่าเริ่มมีการใช้งานกันมากขึ้นแล้วในประเทศไทยครับ วันนี้เรามาดูกันในเรื่องของ Container Runtimes นะครับ ใน Blog นี้เราได้แนะนำความสามารถของเจ้า Kubernetes กันไปแล้ว ซึ่งในวันนี้เรามาจะแนะนำถึง Feature หนึ่งที่ทำให้ Kubernetes น่าใช้งานมาก ๆ นั่นก็คือการรองรับกับ Container Runtimes หลาย ๆ ตัว แทนที่จะใช้งานเพียงตัวเดียว แต่ว่าด้วยความยืดหยุ่นนี้นี่แหละที่ทำให้ Kubernetes มีความซ้บซ้อนในการใช้งาน โดยเฉพาะถ้าคุณเป็นมือใหม่ในเรื่องนี้นะครับ การที่จะเข้าใจถึงความแตกต่างของ Kubernetes Container Runtimes และ Runtime ตัวไหนที่เหมาะกับคุณ จะต้องอาศัยการทดลองการใช้งานให้คุ้นเคยกับ Runtime นั้น ๆ ถ้าคุณไม่เคยใช้งานร่วมกับ Container หรือ Kubernetes มาก่อนครับ

เรามาเข้าเนื้อหากันดีกว่านะครับ อย่างที่ผมได้เกริ่นไปว่าวันนี้จะมาแนะนำเรื่องของ Container Runtimes ว่ามีหน้าที่อะไร มีหลักการทำงานอย่างไร ทำไมต้องใช้กับ Kubernetes และเราควรจะใช้ Runtimes ตัวไหนที่เหมาะกับ มาดูกันครับ

Container Runtime คืออะไร?

Runtime เป็น Software ที่ใช้ในการสั่งการ Container
ขยายความอีกนิด สิ่งที่เราต้องแยกให้ออกในเรื่องของ Container คือ Container Image และตัว Container ครับ
Container Image คือ พิมพ์เขียวหรือแบบแปลนที่ใช้ในการสร้าง Container ซึ่งเป็นตัวที่บอกว่า ถ้าจะสร้าง Container ขึ้นมาได้จะต้องการ Resource ในการสร้างเท่าไหร่ถึงจะเพียงพอต่อการนำไปติดตั้ง Application หรือ Service ต่าง ๆ แต่ แต่ เราไม่จำเป็นต้องใช้ Container Runtime ในการสร้าง หรือบริหารจัดการเจ้า Container Image นะครับ แต่การที่เรา Execute Container Image เพื่อที่จะเริ่มใช้งาน Application หรือ Service ตรงส่วนนี้แหละครับที่ Container Runtime เข้ามามีบทบาท
สรุปง่าย ๆ คือ Container Runtime เป็น Software ที่ใช้ในการทำ Container Image ให้กลายเป็น Container ครับ

OCI คืออะไร?

OCI ย่อมาจาก Open Container Initiative เป็น Community Project ตั้งขึ้นเมื่อปี ค.ศ. 2015 ที่ใช้ระบุมาตรฐานว่า Container Runtimes ควรจะทำงานแบบใด
ด้วยจำนวนของ Container Runtimes ที่เพิ่มมากขึ้นจากการพัฒนาของเหล่า Developer และบางตัวก็ไม่สามารถใช้งานร่วมกันได้ ทำให้ยากต่อการพัฒนาและอัพเดท Application ที่เป็น Container-based ที่สามารถใช้งานได้กับทุก ๆ Runtimes ที่มีในตลาด
OCI แก้ปัญหาที่ว่าโดยการทำมาตรฐานเรียกว่า OCI Runtimeขึ้นมาให้ Runtimes ต้องสามารถใช้งานได้กับทุก ๆ Container Platform เช่น Kubernetes
ถ้าให้ยกตัวอย่าง OCI Runtime ให้เห็นภาพง่าย ๆ ก็ลองนึกภาพเทคโนโลยีเช่น USB ที่มี Vendor หลาย ๆ เจ้าผลิตออกไม่ว่าจะเป็น PC หรือ OS รุ่นไหน ๆ ก็สามารถใช้งาน USB ได้ นั่นก็เพราะว่าเค้าทำตามมาตรฐานของ USB ซึ่ง OCI Runtime ก็เป็นมาตรฐานคล้าย ๆ กัน แต่ใช้กับ Container Runtimes เท่านั้นเองครับ

Kubernetes Container Runtime ที่เป็นที่นิยมในการใช้งานมีอะไรบ้าง?

Kubernetes เป็น Container Orchestrator หมายความว่า Kubernetes ใช้ในการบริหารจัดการ Container ในขณะที่มีสถานะ Running อยู่ ไม่รวมการทำงานในลักษณะของ Execute การที่จะ Execute ได้จึงต้องใช้ Container Runtimeโดย Kubernetes ไม่ได้บังคับว่าต้องเลือกใช้ Runtimes ตัวไหน กลับกัน Kubernetes มีสิ่งที่เรียกว่า Container Runtime Interface (CRI) เป็น Interface ที่ทำให้ Kubernetes สามารถ Integrate กับ Container Runtimes หลาย ๆ เจ้าได้ รวมไปถึงเจ้าที่อาจจะไม่ได้ Support ตาม OCI Runtime ด้วยสรุปคือ คุณสามารถใช้งาน Container Runtimes อะไรก็ได้ใน Kubernetes ไม่ว่าจะเป็นแบบ OCI Runtime หรือแบบอื่น ๆ ปัจจุบันมี Runtime อยู่ 2 ตัวที่นิยมใช้งานกับ Kubernetes ได้แก่

  • CRI-O: สามารถใช้งานได้กับ OCI-compliant Container Image บน Kubernetes จริง ๆ แล้ว Container Image ที่รองรับ OCI-compliant ก็สามารถใช้งานบน Kubernetes โดยไม่ต้องใช้ CRI-O ก็ได้ ถ้า Image นั้นรองรับ Runtime อื่น ๆ ที่เป็นแบบ CRI-compliant แต่ที่นิยมใช้งานกันเพราะว่า CRI-O ถูกออกแบบมาให้เป็นทางเลือกในการใช้งานนอกจากการที่ต้องใช้ Runtime ที่เป็นของ Docker
  • Containerd เป็น Container Runtime ที่พัฒนาโดย Docker เพื่อใช้สำหรับการบริการ Container สำหรับองค์กรที่มีการใช้งานอย่างจริงจังที่ใช้ Docker เป็นหลัก

ทำไมไม่ใช้ Docker เป็น Kubernetes Runtime?

อย่างที่ได้แนะนำไปว่า Containerd เป็น Runtime ที่ใช้กับ Docker ซึ่งคุณสามารถใช้ Containerd ที่มีให้ใน Docker หรือจะใช้เครื่องมืออื่น ๆ ในการบริหารจัดการ Container Image ก็ได้
แต่จริง ๆ แล้ว Docker ไม่ได้มีแค่การใช้งาน Containerd เพียงอย่างเดียว โดย Docker เป็น Platform ที่ใช้ในการสร้าง และบริการจัดการ Container Image ที่ทำได้มากกว่าการใช้งาน Containerd
หลาย ๆ คนใช้เครื่องมือหลาย ๆ อย่างจาก Docker ในการบริหารจัดการ Container Image แล้ว หลังจากนั้นค่อยนำไป Deploy บน Kubernetes ทำให้ต้อง Integrate Kubernetes กับ Service อื่น ๆ ของ Docker ทั้ง ๆ ที่อาจจะใช้งานเพียงแค่ Containerd เพียงอย่างเดียว เนื่องจาก Kubernetes ไม่ได้ Support เทคโนโลยีของ Docker โดยตรง แต่มี Interface พิเศษที่ช่วยให้ใช้งาน Docker Runtime ได้แบบเต็มประสิทธิภาพชื่อว่า Dockershim แต่มีข่าวร้ายก็คือ ทาง Kubernetes ได้ประกาศออกมาแล้วว่ามีแผนที่จะเลิกใช้ Dockershim โดยน่าจะเริ่มต้นทำตามแผนใน Patch  1.23 ในช่วงที่เราเขียน Blog นิแหละครับ (2021) จะเกิดอะไรขึ้นบ้าง? Kubernetes จะไม่รองรับการใช้งาน Docker แบบ Runtime แล้ว ผู้ที่ใช้งาน Kubernetes จะต้องใช้ตัวเลือกอื่น ๆ เช่น CRI-O หรือ containerd
ถึงแม้ว่าคุณจะเคยได้ยินหลาย ๆ คน พูดเกี่ยวกับ Docker ว่าเป็น Kubernetes Runtime ในอนาคตก็อาจจะได้ยินคนพูดถึงในลักษณะนี้น้อยลง เนื่องจากทาง Kubernetes เลือกที่จะกระตุ้นให้เหล่านักพัฒนาเลือกทางออกอื่น ๆ ในการพัฒนานอกจากการยึดติดกับ Containerd Runtime นั่นเองครับ

จะเลือกใช้ Container Runtime ที่เหมาะกับเราอย่างไร?

Kubernetes Container Runtime ที่มีให้ใช้งานในทุกวันนี้มีความคล้ายคลึงกันหลาย ๆ อย่าง เช่น สามารถ Run Container Image ที่ Comply กับ OCI ได้
ยกเว้นถ้าคุณมีเคสพิเศษ เช่น อยากให้ Security แน่นหน้าหน่อย ก็ควรจะเลือกใช้เป็น Kata Runtime จะเป็นตัวเลือกที่ดี แต่ถ้าอยากได้แบบขนาดเล็ก ไม่หนักมาก แนะนำเป็น crun ครับ
ทีนี้คุณก็มีตัวเลือกอื่น ๆ นอกจาก CRI-O หรือ Containerd ที่จะใช้เป็น Kubernetes Runtime แล้วครับ
Kubernetes มีทางเลือกให้คุณสามารถใช้ Container Runtime อะไรก็ได้ แต่ถ้าจะให้แนะนำก็ควรที่จะเลือกใช้งานตามความนิยมของคนส่วนใหญ่ เพราะว่าเครื่องมือไหนที่เป็นนิยมก็คือเครื่องมือที่ใช้งานง่าย และเป็นตัวเลือกที่ดีที่สุดครับ
เป็นอย่างไรกันบ้างสำหรับเรื่องขององค์ประกอบสำคัญของ Kubernetes Container Runtime หวังว่าทุกคนจะนำเอาไปปรับใช้ให้เกิดประโยชน์นะครับ หากมีข้อมูลผิดพลาด หรือต้องการเสริมความรู้เพิ่มเติม สามารถพิมพ์ข้อความในช่องแสดงความคิดเห็นทางด้านล่างเข้ามาได้เลยนะครับ สำหรับท่านที่สนใจบริการของ Cloud HM สามารถติดต่อเราได้ผ่านช่องทางนี้นะครับ
ขอบคุณครับ


— Cloud HM