- บทความที่ไล่ย้อนประวัติของปัญหาการดีพลอยเซิร์ฟเวอร์และการแยกโปรเซส พร้อมชี้ให้เห็นว่า FreeBSD jails ได้นำแนวคิดคอนเทนเนอร์สมัยใหม่ไปใช้จริงก่อนอุตสาหกรรมถึง 10 ปี
- jails ที่ถูกเพิ่มเข้ามาใน FreeBSD 4.0 เมื่อปี 2000 เป็นการขยาย
chroot ให้สามารถแยก ไฟล์ซิสเต็ม เครือข่าย และโปรเซสได้อย่างสมบูรณ์ ในฐานะความสามารถแบบเนทีฟของเคอร์เนล
- Linux เข้าสู่โลกคอนเทนเนอร์ผ่าน LXC ในปี 2008 และ Docker ในปี 2013 แต่ระหว่างทางก็มีการสะสมของ ชั้นนามธรรมที่ซับซ้อนอย่าง namespace, cgroups, OCI
- สิ่งที่ Docker แก้ได้ดีคือปัญหาเรื่องการแพ็กเกจและการส่งมอบแอปพลิเคชัน (shipping) ขณะที่ jails เด่นด้านการแยก แต่มีจุดอ่อนคือ ไม่มีมาตรฐานการส่งมอบแบบเนทีฟ
- ตอนถัดไปจะพูดถึงการสร้างโครงสร้างพื้นฐานบน jails, ZFS snapshots, การ provision ด้วย Ansible และวิธีใช้งานจริง
ปัญหาของการดีพลอยเซิร์ฟเวอร์ในยุคแรก
- หลายสิบปีก่อน วิธีมาตรฐานในการดีพลอยอะไรบางอย่างขึ้นเซิร์ฟเวอร์คือการ คัดลอกไฟล์ด้วยตนเองผ่าน FTP โดยใช้ Total Commander, FileZilla, FAR Manager ฯลฯ ส่วนผู้ใช้ขั้นสูงอาจใช้
scp หรือ rsync แต่แก่นของวิธีก็ไม่ต่างกัน
- ในโปรเจ็กต์ที่ทำคนเดียว ความผิดพลาดอาจไม่ใช่ปัญหาใหญ่ แต่เมื่อดูแล โปรเจ็กต์ของลูกค้าหลายสิบราย มันอาจกลายเป็นเรื่องร้ายแรง
- ในสถาปัตยกรรมแบ็กเอนด์ทั่วไป เว็บไซต์หลายแห่งจะใช้ Apache web server instance เดียวกันและมีวงจรชีวิตเดียวกัน ถ้า Apache ล่ม ทุกเว็บก็ล่มตาม
- เมื่อทราฟฟิกพุ่งขึ้น หากเว็บไซต์หนึ่งกินทรัพยากรทั้งหมด ก็จะเกิดปัญหาที่ เว็บไซต์อื่น ๆ บนเซิร์ฟเวอร์เดียวกันค่อย ๆ ถูกบีบจนแทบหายใจไม่ออก
- ผู้ดูแลระบบพยายามทำ automation ด้วยเชลล์สคริปต์ แต่ก็ ไม่มีวิธีมาตรฐานสำหรับการจัดการเวอร์ชันหรือ rollback และมักใช้ธรรมเนียมการตั้งชื่อโฟลเดอร์โปรเจ็กต์ด้วยเลขลำดับหรือ timestamp ต่อท้าย
สองปัญหาหลักที่ต้องแก้
- การดีพลอย (Deployment): ต้องมีโซลูชันอเนกประสงค์ที่รองรับการส่งมอบอย่างเสถียร ป้องกัน human error จัดการเวอร์ชันและ rollback ได้ และครอบคลุมทุกกรณีทางธุรกิจ
- การแยกโปรเซส (Process Isolation): ต้องมีการปกป้องทั้งระหว่างแอปกับระบบ ป้องกันไม่ให้ความต้องการของแอปหนึ่งไปทำให้อีกแอปพังโดยไม่รู้ตัว และแก้ปัญหาการชนกันของ dependency
- ความพยายามในการแก้ปัญหาการดีพลอยได้วิวัฒน์มาเป็น CI/CD pipelines, มาตรฐานการแพ็กเกจ และระบบควบคุมเวอร์ชันสมัยใหม่ แต่ประวัติของปัญหาด้านการแยกกลับเป็นสิ่งที่คนรู้จักน้อยกว่า
จาก chroot สู่ virtual machine
chroot ที่ Bell UNIX นำมาใช้ในปี 1979 มอบ มุมมองไฟล์ซิสเต็มแบบแยกขาด ให้กับโปรเซส ทำให้เข้าถึงภายนอก subtree นั้นไม่ได้ เป็นแนวคิดพื้นฐานที่หยาบแต่มีประโยชน์
- ข้อจำกัด: มันแยกได้แค่ไฟล์ซิสเต็มเท่านั้น ยังสามารถไปรบกวนเครือข่าย โปรเซสอื่น หรือทรัพยากรของระบบได้ และยังหลุดออกมาได้ด้วย
- คำตอบระดับองค์กรอย่างจริงจังครั้งแรกคือ virtual machine (VM) ซึ่ง VMware ทำให้แพร่หลายในช่วงปลายทศวรรษ 1990
- มันมอบสภาพแวดล้อม OS ที่แยกจากกันอย่างสมบูรณ์ให้แต่ละแอปพลิเคชัน แต่ทุก VM ต้องมี OS เต็มชุดของตัวเอง จึงมี overhead สูงพอสมควร และมีต้นทุนด้านเวลาเริ่มต้นที่กินเป็นนาที
การถือกำเนิดของ FreeBSD Jails
- ในปี 2000 การปฏิวัติแบบเงียบ ๆ เกิดขึ้นบน FreeBSD ไม่ใช่ Windows Server หรือ Linux
- FreeBSD แตกต่างจาก Linux อย่างถึงราก โดย Linux ให้แค่เคอร์เนล ส่วน GNU userland, ecosystem ของแพ็กเกจ และตัวเลือกตามแต่ละดิสโทรถูกประกอบเข้าด้วยกัน ขณะที่ FreeBSD พัฒนา จัดการเวอร์ชัน และทดสอบเคอร์เนล userland เครื่องมือพื้นฐาน และไลบรารีเป็น OS สมบูรณ์ชุดเดียว
- โซลูชันที่สร้างขึ้นบนรากฐานอันสอดคล้องนี้คือ jails ซึ่งถูกนำเสนอโดย Poul-Henning Kamp และ Robert Watson และถูกรวมเป็นความสามารถแบบเนทีฟของเคอร์เนลใน FreeBSD 4.0 (มีนาคม 2000)
- แต่ละ jail มี มุมมองไฟล์ซิสเต็ม, network stack และพื้นที่โปรเซส ของตัวเอง และมองไม่เห็นระบบโฮสต์
- เพราะใช้เคอร์เนลของโฮสต์ร่วมกัน จึงมี overhead แทบเป็นศูนย์ และใช้เวลาเริ่มต้นแทบจะทันที
- FreeBSD ทำให้สิ่งที่ปัจจุบันเราเรียกว่าคอนเทนเนอร์เกิดขึ้นจริงในเชิงปฏิบัติบน production ก่อนอุตสาหกรรมถึง 10 ปี
ไทม์ไลน์ของเทคโนโลยีการแยก
- เส้นทางวิวัฒน์ที่แท้จริงของปัญหาการแยกคือ: shared server ที่ไม่มีการแยก → virtual machine ที่หนักแต่แยกได้ → container ที่เบาและแยกได้
- FreeBSD ไปถึงขั้นที่สามตั้งแต่ปี 2000 ส่วน Linux ไปถึงผ่าน LXC ในปี 2008 และ Docker ปรากฏในปี 2013
- ตอนที่ Docker ได้รับการยกย่องว่าเป็นของปฏิวัติวงการนั้น FreeBSD jails ก็อยู่ในสถานะที่ สุกงอมและผ่านการพิสูจน์ในสนามจริงมาแล้ว 13 ปี
เหตุใด Linux จึงชนะ
- ความเหนือกว่าทางเทคนิคไม่ได้แปลว่าจะชนะในสงคราม ecosystem
- Linux ชนะด้วย การตัดสินใจที่รวดเร็ว, แรงส่งแบบไวรัลของไลเซนส์ GPL และการสนับสนุนระดับองค์กรอย่างแข็งแกร่งจาก Red Hat และ IBM
- ต่อมา Google, Facebook และ Amazon ก็พัฒนาเครื่องมือสำหรับดาต้าเซ็นเตอร์ขนาดใหญ่ และ เป็นผู้กำหนดทิศทางของอุตสาหกรรมทั้งระบบ
- Linux เปลี่ยนจาก “OS ฟรีสำหรับคนที่ซื้อไลเซนส์เชิงพาณิชย์ไม่ไหว” ไปเป็น “ตัวเลือกเดียวสำหรับเซิร์ฟเวอร์”
ความซับซ้อนของ ecosystem คอนเทนเนอร์บน Linux
- วิศวกร Linux สร้าง kernel primitives อย่าง namespace, cgroups, seccomp เพื่อแก้ปัญหาการแยกและการดีพลอย แล้วจึงซ้อน ชั้นนามธรรมที่ซับซ้อน ทับลงไปอีกเป็น LXC (2008) → OCI/runc (2015) → Docker/Podman (2013/2018) → Docker Hub เป็นต้น
- ผลลัพธ์คือก้อนของ leaky abstractions ที่ถูกออกแบบเกินจำเป็น สำหรับโครงสร้างพื้นฐานแบบคลาวด์และพึ่งพา vendor
- ปัจจุบัน หากต้องรันแอปพลิเคชันบนระบบขนาดใหญ่ การทำให้เป็นคอนเทนเนอร์ด้วย Docker และ orchestration ด้วย Kubernetes ได้กลายเป็น ค่าตั้งต้นโดยปริยาย ไม่ใช่เพียงหนึ่งในหลายทางเลือก แต่ถูกเสนอเป็นสิ่งที่ต้องทำอยู่แล้ว
สิ่งที่ Docker สร้างไว้ และจุดอ่อนของ Jails
- สิ่งที่ Docker แก้ได้ดีคือ ปัญหา shipping: การแพ็กแอปพลิเคชันพร้อม dependency ทั้งหมด การกระจายผ่าน registry และการทำให้รันได้เหมือนกันบนทุกเครื่อง ด้วย มาตรฐานอเนกประสงค์
- OCI image format ได้กลายเป็นมาตรฐานโดยพฤตินัยของอุตสาหกรรม
- Jails แก้ปัญหาการแยกได้อย่างยอดเยี่ยม แต่ไม่มี โซลูชันแบบเนทีฟสำหรับ shipping และนี่คือสาเหตุหลักที่ทำให้ ecosystem ของ jails ดูยังไม่สุกงอมเมื่อเทียบกับ ecosystem ของ Docker
- ชุมชนก็รับรู้ถึงช่องว่างนี้เช่นกัน และมีเครื่องมือบางตัว (cbsd, bastille, pot, appjail ฯลฯ) ที่พยายามเลียนแบบ ecosystem คอนเทนเนอร์สมัยใหม่ ขณะเดียวกันก็ยังมี แนวทางอื่น ที่ใช้ประโยชน์จาก FreeBSD native primitives
เกริ่นถึงตอนถัดไป
- ในตอนถัดไป ผู้เขียนจะพูดถึงความกระชับและความสง่างามของโครงสร้างพื้นฐานบน FreeBSD ตั้งแต่พื้นฐานของ jails และวิธีการทำงาน การลด boilerplate ผ่าน jail managers, การ provision และการดีพลอยด้วย Ansible, พลังของ ZFS snapshots และวิธีรวมทุกอย่างเข้าด้วยกันเพื่อสร้างโครงสร้างพื้นฐานที่แข็งแรงและขยายได้สำหรับ Hypha
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
แค่ความเหนือกว่าทางเทคนิคอย่างเดียวก็ไม่พอจะชนะใน สงคราม ecosystem
ช่วงกลางทศวรรษ 90 Linux เติบโตได้เพราะการตัดสินใจที่รวดเร็ว, แรงแพร่ของไลเซนส์ GPL, และการสนับสนุนจากบริษัทอย่าง Red Hat กับ IBM
ฉันติดตั้ง Linux ครั้งแรกในปี 1994 แต่ในชุมชน FreeBSD กลับเมินเครื่อง PC ราคา $3,500 ของฉันว่า “งั้นๆ”
ตอนนั้นมีบั๊กในอินเทอร์เฟซ IDE แต่ Linux ออกวิธีเลี่ยงมาให้ภายในไม่กี่วัน ขณะที่ฝั่ง BSD เอาแต่บอกให้ไปซื้ออุปกรณ์ SCSI
ตอนนั้นฉันยังเป็นนักศึกษาและไม่มีเงิน สุดท้าย Linux จึงเป็นตัวเลือกที่ใช้งานได้จริง
ภายหลังฉันกลับไปลอง FreeBSD อีกครั้ง แต่ตอนนั้น Linux ก็ทำทุกอย่างที่ฉันต้องการได้อยู่แล้ว
บั๊กที่เกี่ยวข้องมีสรุปไว้ใน บทความวิกิ CMD640
ถึงอย่างนั้นสิ่งที่ชอบใน FreeBSD คือ ความสม่ำเสมอ ของทั้งระบบมากกว่า และองค์ประกอบหลักอย่างเสียงหรือ event API ก็ยังถูกดูแลอย่างเสถียร
การรองรับไดรเวอร์ฮาร์ดแวร์รุ่นใหม่ยังไง Linux ก็ยังดีกว่า แต่ก็หวังว่า FreeBSD จะไม่ “กลายเป็น Linux” มากเกินไป
เอาจริงๆ *nix สมัยใหม่ฝั่งไหนก็ทำอะไรได้แทบเหมือนกันหมดแล้ว ตอนนี้จึงเป็นเรื่องของ รสนิยมและความคุ้นมือ มากกว่าประสิทธิภาพ
ส่วน BSD ถูกบริษัทหลีกเลี่ยงเพราะคดีความกับ AT&T และในช่วงนั้น Linux ก็ยึดตลาดไปแล้ว
แม้ตอนนี้จะยังมีบทความออกมาปกป้อง FreeBSD แต่ก็ยากจะพลิกแนวโน้มที่ถูกกำหนดไว้ตั้งแต่ยุค 90
ถึงอย่างนั้นก็ยังคิดว่าการรองรับฮาร์ดแวร์ทุกวันนี้ยังมีช่องให้พัฒนาอีกมาก
บทความนี้น่าสนใจดี
แต่ฉันไม่เห็นด้วยกับความเห็นที่ว่าพวก kernel primitive ของ Linux อย่าง namespaces, cgroups, seccomp ได้กลายเป็นระบบนิเวศของ abstraction ที่ซับซ้อนในที่สุด
Linux ซับซ้อนขึ้นเพราะมันประสบความสำเร็จ ไม่ใช่เพราะเป็นการออกแบบที่ล้มเหลว
ถ้า BSD เป็นกระแสหลัก ก็คงเกิด ecosystem แบบ “over-engineered” เหมือนกัน
container สุดท้ายก็เป็นแค่ VM แบบเบาๆ ดังนั้นฉันจึงคิดว่าใช้ VM จริงไปเลยจะดีกว่า
ที่ Docker ได้รับความนิยมก็เพราะการนำกลับมาใช้ซ้ำได้และ ecosystem ไม่ใช่เพราะเรื่อง security isolation
jail ของ FreeBSD นั้นเรียบง่ายและสง่างาม แต่ OCI container ของ Linux ใช้งานง่ายกว่ามาก
container ไม่ใช่ความสามารถเดี่ยวของเคอร์เนล แต่เป็นภาพลวงที่ประกอบขึ้นจากหลาย namespace, mount และการแยก process
การออกแบบของ Linux เป็นสิ่งที่ตั้งใจไว้ และ cgroups กับ seccomp ก็ถูกใช้กว้างขวางนอกเหนือจาก container เช่นใน systemd หรือ flatpak
ปรัชญา “cattle vs pets” สามารถนำไปใช้ได้ที่ระดับ VM และ orchestration
คำบอกว่า jails ดีกว่านั้นฟังดูไม่ค่อยตรงกับความเป็นจริง
ที่ Docker ชนะได้ไม่ใช่เพราะ การแยกเชิงเทคนิค แต่เพราะ ecosystem
ด้วยเครื่องมืออย่าง Dockerfile, public registry, และ compose ทำให้สร้างสภาพแวดล้อมที่พร้อมรันได้ภายใน 30 วินาที
FreeBSD jail นั้นยอดเยี่ยมในเชิงเทคนิค แต่มีกำแพงการเริ่มต้นใช้งานสูง
ช่วงหลังๆ ก็เริ่มเห็นกระแสอยากกลับไปหา jail หรือ VM ที่เรียบง่ายกว่า เพราะความซับซ้อนของ container stack
แต่จริงๆ แล้วไม่ใช่เรื่องการแข่งขัน แค่แต่ละฝั่งมีบทบาทต่างกัน
FreeBSD ไม่มีแนวคิดแบบนี้ และยังขาด ระบบ image ด้วย
ถ้า FreeBSD ลงทุนกับ UX และ ecosystem แบบที่ Docker ทำ ฐานผู้ใช้อาจโตขึ้นหลายเท่า
ราวปี 2005 ฉันเคยรันทั้งบริษัทบน FreeBSD
แต่เมื่อเวลาผ่านไป Linux ก็ครองทั้งงานส่วนตัวและงานองค์กร
ตอนนี้ Docker ก็ดีพอแล้ว และไม่มี เหตุผลเชิงตรรกะ ที่จะย้อนกลับไปอีก
แต่ตอบสนองต่อยุค CPU แบบมัลติคอร์ช้าเกินไป เลยถูก Linux กับ Windows แซง
ทุกวันนี้ประสิทธิภาพกลับมาดีแล้ว แต่ก็ยังเสียเปรียบจาก การขาดแคลนไดรเวอร์ และข้อจำกัดด้านจำนวนผู้พัฒนา
ฉันใช้ Linux ในงานที่ต้องการ GPU หรือ CUDA และใช้ FreeBSD กับเซิร์ฟเวอร์ที่ต้องการความเสถียร
UX ของ FreeBSD สม่ำเสมอกว่า แต่ในโลกความจริง Linux กลายเป็น “เส้นทางที่มีความสุข” ไปแล้ว
ยินดีเสมอที่ได้เห็นบทความแนะนำ FreeBSD
แม้ FreeBSD จะนำ jail มาใช้ตั้งแต่ปี 2000 แต่ฝั่ง Linux ก็มีเทคโนโลยีคล้ายกันอย่าง OpenVZ และ VServer อยู่แล้ว
สุดท้ายเมื่อ LXC ปรากฏขึ้นในช่วงปลายยุค 2000 จึงค่อยเกิดภาพจำว่า “FreeBSD นำหน้าอยู่ก่อนแล้ว”
ฉันสงสัยว่ามีบทความที่อธิบายเชิงเทคนิคเรื่อง วิธีการทำ isolation ของ container และ VM ไว้ไหม
ไม่ใช่แค่ระดับที่บอกว่า “ใช้เคอร์เนลเดียวกันเลยอ่อนกว่า” แต่เป็นรายละเอียดการทำงานจริงๆ
ช่วงนี้ฟีเจอร์อย่าง systemd-oomd ทำให้ฉันอยากกลับไปใช้ FreeBSD
แต่ก่อนฉันเคยเปิดหลาย process ไว้ในเทอร์มินัลพร้อมเก็บล็อกเพื่อทำงานพัฒนา
ตอนนี้ systemd กลับ ฆ่า process ทั้งชุดในระดับ cgroup จนงานหายไปหมด
การเปลี่ยนแปลงระบบที่ไม่เข้ากันแบบนี้ ทำลาย workflow การพัฒนา และน่าหงุดหงิดที่ต้องคอยใช้ systemd-run หรือ Docker ทุกครั้งเพื่อแยก process
หัวใจของความสำเร็จของ Linux คือ ความแพร่กระจายแบบติดเชื้อของ GPL และ network effect
เมื่อผู้ใช้มองว่า Linux คือมาตรฐาน ผู้ผลิตฮาร์ดแวร์ก็เริ่มออกไดรเวอร์สำหรับ Linux ตามธรรมชาติ
ด้วยความยืดหยุ่นของเคอร์เนล ecosystem ของไดรเวอร์โอเพนซอร์สจึงเติบโตอย่างระเบิดระเบ้อ