CEDTAN

Lecture 1 — Introduction to Software-Defined Systems

ทำไมงานที่เคยต้องเดินไปทำกับเครื่องจริง ถึงย้ายมาอยู่ในไฟล์และคำสั่งได้ทั้งหมด

เลกเชอร์ 1 · อ่าน 40 นาที · เรียบเรียงจากสไลด์ Lecture 1 ของ รศ.ดร.วีระ เหมืองสิน

แนวคิดหลัก

Software-Defined Systems คือการเอาทุกอย่างที่เคยต้องทำกับเครื่องจริงด้วยมือ ไปเขียนเป็นไฟล์แทน แล้วให้ซอฟต์แวร์ลงมือทำให้ พอมันเป็นไฟล์ได้ มันก็เก็บใน Git ได้ ทดสอบได้ และย้อนกลับได้ เหมือนโค้ดทุกอย่าง

ข้อมูลในหน้านี้มาจากไหน

เนื้อหาทั้งหมดมาจากสไลด์ Lecture 1 ทั้ง 63 หน้า ส่วนคำอธิบายเพิ่ม ตัวอย่าง และรูปประกอบ เขียนขึ้นใหม่เพื่อให้อ่านเข้าใจโดยไม่ต้องมีพื้นฐานมาก่อน หัวสไลด์เขียนรหัสวิชาไว้ว่า 2110415 ซึ่งเป็นรหัสเดิมของวิชาเดียวกันนี้ ปีนี้ใช้รหัส 2110506

คาบนี้จะพาไปไหนบ้าง

สไลด์วางลำดับเรื่องไว้ 7 หัวข้อ และหน้านี้เดินตามลำดับเดียวกัน

  • Software-Defined Systems คืออะไร
  • แรงจูงใจ: ทำให้ DevOps และ CI/CD เกิดขึ้นได้จริง
  • ส่วนประกอบพื้นฐานของระบบ
  • Cloud กับการจัดหาเครื่อง
  • Containers
  • Deployment Orchestration
  • Software-Defined Networks

หัวข้อที่ 1 ถึง 3 คือกรอบความคิด ส่วนหัวข้อที่ 4 ถึง 7 คือของจริงสี่ชิ้นที่จะเรียนกันทั้งเทอม

ระบบคอมพิวเตอร์หนึ่งระบบมีอะไรบ้าง

ก่อนจะพูดว่า software-defined แปลว่าอะไร ต้องเห็นก่อนว่ามีอะไรให้ define บ้าง

สไลด์วางระบบคอมพิวเตอร์เป็นชั้น ๆ จากล่างขึ้นบนสี่ชั้น ล่างสุดคือทรัพยากรจริงที่จับต้องได้ ได้แก่ CPU หน่วยความจำ และดิสก์ ถัดขึ้นมาคือ operating system ที่แบ่งทรัพยากรพวกนั้นให้โปรแกรมใช้ ถัดขึ้นมาอีกคือเครือข่ายที่เชื่อมเครื่องหลาย ๆ เครื่องเข้าด้วยกัน และบนสุดคือแอปพลิเคชันที่รันกระจายอยู่บนหลายเครื่องพร้อมกัน

จุดสำคัญคือ ทุกชั้นมีเวอร์ชัน software-defined ของตัวเอง

ระบบคอมพิวเตอร์ชื่อเมื่อถูกกำหนดด้วยซอฟต์แวร์networked applicationsand distributed systemsOrchestrationnetworksSoftware-Defined Networksoperating systemsSoftware-Defined Serversphysical resources:compute, storageSoftware-Defined StorageVirtualizationCloudsContainers
รูปที่ 1: ระบบคอมพิวเตอร์สี่ชั้น กับชื่อเรียกของแต่ละชั้นเมื่อถูกทำให้เป็น software-defined

ชื่อทางซ้ายทั้งสี่ตัวคือขอบเขตของวิชานี้ทั้งเทอม

  • Orchestration (การสั่งงานหลายบริการพร้อมกัน) ดูแลว่าแอปทั้งชุดต้องรันกี่ตัว ตัวไหนก่อนตัวไหน
  • Software-Defined Networks (เครือข่ายที่กำหนดด้วยซอฟต์แวร์) ทำให้เส้นทางของแพ็กเก็ตเปลี่ยนได้ด้วยการเขียนโปรแกรม
  • Software-Defined Servers (เซิร์ฟเวอร์ที่กำหนดด้วยซอฟต์แวร์) คือการสร้างเครื่องขึ้นมาด้วยคำสั่ง แบ่งย่อยเป็น virtualization, clouds และ containers
  • Software-Defined Storage (ที่เก็บข้อมูลที่กำหนดด้วยซอฟต์แวร์) ทำแบบเดียวกันกับดิสก์

Software-Defined Systems คืออะไร

ทำไมต้องมีสิ่งนี้

สมมติทีมคุณต้องเพิ่มเซิร์ฟเวอร์อีก 10 เครื่องสัปดาห์หน้า ถ้าทำแบบเดิมคือสั่งซื้อเครื่อง รอของมาส่ง ยกไปวาง เสียบสาย ลง OS ทีละเครื่อง ตั้งค่าทีละเครื่อง ใช้เวลาเป็นสัปดาห์ และไม่มีทางรู้ว่าเครื่องที่ 7 ตั้งค่าเหมือนเครื่องที่ 3 จริงหรือเปล่า ปัญหาไม่ได้อยู่ที่ความช้าอย่างเดียว แต่อยู่ที่ว่า "สถานะปัจจุบันของระบบ" ไม่มีใครตอบได้แน่นอน เพราะมันอยู่ในเครื่อง ไม่ได้อยู่ในเอกสารที่ไหน

สไลด์ให้นิยามไว้ว่า Software-Defined Systems คือแนวทางในการจัดหา ตั้งค่า เปลี่ยนแปลง และดูแลระบบกับโครงสร้างพื้นฐาน โดยมีสองแกนหลัก

แกนที่หนึ่ง: ใช้ซอฟต์แวร์เป็นตัวกำหนดระบบ

  • แยกฮาร์ดแวร์ออกจากซอฟต์แวร์ ไม่ผูกกันแบบเดิม
  • ทำทรัพยากรใน data center ให้เป็นของเสมือน แล้วส่งมอบในรูปแบบ as-a-service

แกนที่สอง: ยืมวิธีทำงานของวิศวกรรมซอฟต์แวร์มาใช้กับโครงสร้างพื้นฐาน

  • ทำงานอัตโนมัติ
  • ขั้นตอนคงเส้นคงวา ทำซ้ำแล้วได้ผลเหมือนเดิม
  • มีเวอร์ชัน ทดสอบได้ ย้อนกลับได้ เหมือนที่ทำกับโค้ด
เทียบให้เห็นภาพ

ลองนึกถึงการต่อเฟอร์นิเจอร์ แบบแรกคือช่างมาต่อให้ที่บ้าน ต่อเสร็จแล้วจบ ถ้าอยากได้อีกชุดหนึ่งที่หน้าตาเป๊ะเหมือนเดิม ต้องหวังว่าช่างจำได้ แบบที่สองคือมีแบบแปลนเป็นไฟล์ ใครหยิบแบบไปทำก็ได้ของเหมือนกันทุกครั้ง แก้แบบแล้วก็รู้ว่าแก้ตรงไหน ย้อนกลับไปแบบเก่าก็ได้ software-defined คือการย้ายจากแบบแรกไปแบบที่สอง

สไลด์ระบุประโยชน์ไว้ 4 ข้อ

ประโยชน์หมายความว่าอะไร
ทำงานอัตโนมัติและปรับจูนระบบได้ง่ายขึ้นเมื่อระบบเป็นไฟล์ สคริปต์ก็อ่านและแก้มันได้
ยืดหยุ่น คล่องตัว และขยายได้เพิ่มเครื่องคือแก้ตัวเลขในไฟล์ ไม่ใช่สั่งซื้อของ
ทำงานข้ามระบบกันได้ทุกอย่างคุยผ่าน API ไม่ใช่ผ่านสายที่เสียบไว้เฉพาะที่
เปิดทางให้นวัตกรรมฝั่งซอฟต์แวร์ใส่ซอฟต์แวร์ฉลาด ๆ ลงบนฮาร์ดแวร์ที่ต่างยี่ห้อกันได้
ลองตอบดู: ถ้าทีมหนึ่งมีเซิร์ฟเวอร์ 200 เครื่องที่ตั้งค่าด้วยมือทั้งหมด แล้วอยากรู้ว่าเครื่องไหนบ้างที่ยังใช้ OpenSSL เวอร์ชันเก่า ต้องทำอย่างไร

ต้องไล่ SSH เข้าไปเช็คทีละเครื่อง เพราะไม่มีที่ไหนบันทึกไว้ว่าเครื่องแต่ละตัวมีอะไรอยู่ ตรงนี้แหละคือปัญหาที่ software-defined แก้ ถ้าทุกเครื่องถูกสร้างจากไฟล์เดียวกัน คำตอบอยู่ในไฟล์นั้น ไม่ต้องไปถามเครื่อง

ทำไมเรื่องนี้ถึงสำคัญ: DevOps

ทำไมต้องมีสิ่งนี้

เขียนโค้ดเสร็จไม่ได้แปลว่างานเสร็จ โค้ดต้องไปถึงเครื่องจริงที่ผู้ใช้ใช้อยู่ด้วย ในองค์กรแบบเดิม ทีมพัฒนากับทีมดูแลระบบเป็นคนละทีม ส่งงานกันด้วยเอกสาร ผลคือโค้ดที่เขียนเสร็จวันจันทร์ อาจได้ขึ้นจริงอีกสามสัปดาห์ถัดมา และถ้าพัง ก็ไม่มีใครรู้ว่าพังเพราะโค้ดหรือเพราะเครื่อง

DevOps (การรวมงานพัฒนากับงานดูแลระบบเข้าด้วยกัน) เกิดมาเพื่อย่นรอบจากพัฒนาไปถึงใช้งานจริงให้สั้นที่สุด สไลด์ระบุเป้าหมายหลักไว้ว่าประกอบด้วย

  • Continuous Integration (การรวมโค้ดต่อเนื่อง) คือมี pipeline สำหรับ build, test, approve และ deploy
  • การทำโครงสร้างพื้นฐานให้อัตโนมัติ ทั้งการจัดหาและการดูแลทรัพยากร
  • การเฝ้าดูและวัดผลอย่างต่อเนื่อง

นิยามที่เป็นทางการ

สไลด์อ้างมาตรฐาน IEEE P2675 DevOps Standard for Building Reliable and Secure Systems Including Application Build, Package, and Deployment ซึ่งนิยาม DevOps ว่าเป็นชุดของหลักการและวิธีปฏิบัติที่เน้นการทำงานร่วมกันและการสื่อสาร ระหว่างทีมพัฒนาซอฟต์แวร์กับเจ้าหน้าที่ฝ่าย IT operations รวมถึงผู้จัดซื้อ ผู้ส่งมอบ และผู้มีส่วนได้ส่วนเสียอื่น ๆ ตลอดวงจรชีวิตของระบบซอฟต์แวร์

สังเกตว่านิยามนี้ไม่ได้พูดถึงเครื่องมือเลยสักตัว มันพูดถึงคนกับวิธีทำงาน

หลักการพื้นฐาน 4 ข้อ

  1. Collaboration ทุกฝ่ายที่เกี่ยวข้องทำงานร่วมกัน ไม่ใช่โยนงานข้ามกำแพง
  2. Infrastructure as Code (IaC) ทรัพย์สินของระบบถูกเก็บเป็นเวอร์ชัน เขียนเป็นสคริปต์ และแชร์กันได้
  3. Automation ทำให้อัตโนมัติทั้ง deployment, testing, provisioning และงานมือทุกอย่างที่คนทำแล้วพลาดได้
  4. Monitoring วัดทุกตัวเลขในขั้นพัฒนาและขั้นใช้งานจริง ที่ช่วยบอกได้ว่าควรทำอะไรก่อนหลัง

ข้อ 2 คือจุดที่ DevOps กับ Software-Defined Systems มาบรรจบกัน IaC จะเกิดขึ้นไม่ได้เลยถ้าโครงสร้างพื้นฐานยังสั่งด้วยไฟล์ไม่ได้

ผลที่ได้

สไลด์ไล่ประโยชน์ของ DevOps ไว้ 9 ข้อ

  • ความผิดพลาดตอน deploy ลดลง
  • ใช้เวลาน้อยลงทั้งตอน deploy และตอนแก้ปัญหาที่เจอ
  • ขั้นตอนทำซ้ำได้
  • pipeline และตัวแอปพร้อมใช้งานต่อเนื่อง
  • มีเวลาเหลือไปคิดของใหม่มากขึ้น
  • ตอบสนองความต้องการทางธุรกิจได้ไว
  • ตามรอยได้ตลอดวงจรชีวิตของแอป
  • ระบบนิ่งขึ้นและคุณภาพดีขึ้น
  • ได้ feedback ต่อเนื่อง
pipeline หนึ่งเส้นที่วิ่งจนถึง production

สไลด์ยกตัวอย่าง pipeline ที่แบ่งเป็นสามเขต

DEV/TEST ดึงโค้ดจาก Git แล้ว build กับรัน unit test ถัดมา publish Docker image และ Helm chart ขึ้น registry แล้ว deploy ลง Kubernetes cluster ของทีมพัฒนา จบด้วยชุดทดสอบที่ยิง curl เช็คสามอย่างคือ HTTP status code, ขนาดที่ดาวน์โหลดได้ และเวลาที่ใช้ทั้งหมด

STAGING ล้างของเก่าในเขต dev ทิ้ง แล้ว deploy ลง staging cluster และรันชุดทดสอบเดิมซ้ำ

PRODUCTION มีจุดตัดสินใจว่าจะไป production หรือไม่ ถ้าผ่านก็ deploy ลง production cluster แล้วรันชุดทดสอบเดิมอีกรอบ

จุดที่ควรสังเกตคือ ทั้งสามเขตใช้ชุดทดสอบเดียวกันและวิธี deploy เดียวกัน ต่างกันแค่ปลายทาง สิ่งที่ทำให้เป็นแบบนี้ได้คือทั้งสาม cluster ถูกสร้างจากคำสั่งชุดเดียวกัน

เครื่องมือที่จะได้ยินชื่อบ่อย

สไลด์ยกชื่อเครื่องมือที่อยู่ในโลกนี้ขึ้นมาให้เห็นภาพ

กลุ่มตัวอย่างที่สไลด์ยกมา
จัดหาและตั้งค่าเครื่องTerraform, Ansible
เก็บและค้น logElasticSearch, Kibana
เก็บตัวเลขและทำ dashboardPrometheus, Grafana
ฐานของระบบClouds, Virtualization, Containers and Orchestration

สไลด์ยังเปิดภาพ CNCF Landscape (แผนที่รวมเครื่องมือของ Cloud Native Computing Foundation) ให้ดูด้วย ซึ่งมีเครื่องมือหลายร้อยตัวอัดกันเต็มหน้า ประเด็นของสไลด์ไม่ใช่ให้จำ แต่ให้เห็นว่าวงการนี้ใหญ่แค่ไหน และทำไมถึงต้องมีแผนที่นำทาง

CNCF Trail Map: ลำดับที่ควรเดิน

CNCF เสนอลำดับ 10 ขั้นสำหรับทีมที่จะย้ายเข้าสู่โลก cloud native สไลด์ยกมาทั้งหมด

  1. Containerization มักทำด้วย Docker container แอปขนาดไหนก็ห่อได้ และเมื่อเวลาผ่านไปควรค่อย ๆ แยกแอปที่เหมาะสมออกเป็น microservices
  2. CI/CD ตั้งระบบให้การแก้โค้ดกลายเป็น container ใหม่ที่ถูก build ทดสอบ และ deploy ขึ้น staging โดยอัตโนมัติ พร้อมระบบ rollout และ rollback อัตโนมัติ
  3. Orchestration & Application Definition Kubernetes เป็นตัวเลือกหลักของตลาด และ Helm chart ช่วยนิยาม ติดตั้ง และอัปเกรดแอปที่ซับซ้อนได้
  4. Observability & Analysis เลือกเครื่องมือสำหรับ monitoring, logging และ tracing เช่น Prometheus, Fluentd และ Jaeger
  5. Service Proxy, Discovery & Mesh CoreDNS ใช้ค้นหาบริการ ส่วน Envoy และ Linkerd ทำ service mesh พร้อม health check, routing และ load balancing
  6. Networking & Policy ใช้เครือข่ายที่รองรับ CNI เช่น Calico, Flannel หรือ Weave Net และใช้ Open Policy Agent เป็นตัวบังคับนโยบาย
  7. Distributed Database & Storage เมื่อฐานข้อมูลตัวเดียวไม่พอ มี Vitess สำหรับ MySQL แบบ sharding, Rook สำหรับจัดการ storage, etcd เป็นที่เก็บสถานะของ Kubernetes และ TiKV เป็น key-value store แบบกระจาย
  8. Streaming & Messaging เมื่อ JSON-REST ช้าเกินไป มี gRPC และ NATS
  9. Container Registry & Runtime Harbor เก็บ ลงลายเซ็น และสแกน image ส่วน runtime ที่ใช้กันมีทั้ง containerd, rkt และ CRI-O ซึ่งล้วนเป็นไปตามมาตรฐาน OCI
  10. Software Distribution ถ้าต้องแจกจ่ายซอฟต์แวร์อย่างปลอดภัย ให้ดู Notary ที่เป็นการนำ The Update Framework มาใช้จริง

ข้อ 1 ถึง 3 คือเนื้อหาหลักของวิชานี้ ส่วนข้อที่เหลือจะได้เจอในวิชาต่อ ๆ ไป

แผนที่ของทั้งวิชา: ระบบสี่ชั้น

สไลด์วางโครงของวิชาไว้เป็นสี่ชั้น แต่ละชั้นส่งของขึ้นไปให้ชั้นที่อยู่เหนือมันใช้

Orchestration Layerสั่งว่าจะรันอะไร กี่ชุด ที่ไหนContainer Layerห่อโปรแกรมให้รันที่ไหนก็เหมือนกันResource Layerเครื่อง หน่วยความจำ ดิสก์Connectivity Layerสายและอุปกรณ์เครือข่ายที่ต่อทุกอย่างเข้าด้วยกันส่ง Services ขึ้นไปให้ชั้นบนส่ง Resources ขึ้นไปให้ชั้นบนส่ง Connectivity ขึ้นไปให้ชั้นบน
รูปที่ 2: สี่ชั้นที่วิชานี้เดินขึ้นจากล่างไปบน ชั้นล่างส่งของให้ชั้นบนใช้เสมอ

อ่านจากล่างขึ้นบน สายและอุปกรณ์เครือข่ายใน Connectivity Layer ทำให้เครื่องใน Resource Layer คุยกันได้ เครื่องพวกนั้นเป็นที่ให้ container ใน Container Layer รัน และ Orchestration Layer เป็นตัวสั่งว่า container ไหนต้องรันกี่ตัว บนเครื่องไหน

จำโครงนี้ไว้ เพราะสี่หัวข้อที่เหลือของคาบนี้ก็คือสี่ชั้นนี้ อ่านสลับลำดับเล็กน้อย

Cloud: เมื่อการมีเครื่องกลายเป็นการเช่าเครื่อง

ทำไมต้องมีสิ่งนี้

สมมติคุณเขียนแอปตัวหนึ่งบนโน้ตบุ๊ก ตอนแรกมีผู้ใช้สิบคน ก็ยังไหว พอผู้ใช้เพิ่มเป็นพัน ต้องย้ายขึ้นเซิร์ฟเวอร์หนึ่งเครื่อง พอเพิ่มเป็นแสน ต้องใช้ cluster หลายเครื่อง แล้วถ้าแอปคุณดังระดับ Facebook ล่ะ ก็ต้องมี data center ของตัวเอง

คำถามที่โหดกว่านั้นอยู่ในสไลด์หน้าถัดไป แล้วถ้าคนเลิกใช้ล่ะ เครื่องที่ซื้อมาทั้งหมดจะทำอย่างไรกับมัน

นี่คือเหตุผลที่ cloud มีอยู่ สไลด์สรุปมุมมองของผู้ใช้ cloud ไว้ประโยคเดียวว่า cloud computing คือการแปลง IT จาก สินค้า ให้กลายเป็น บริการ

ความต่างอยู่ตรงนี้ ถ้า IT เป็นสินค้า คุณต้องซื้อไว้เผื่อจุดที่คนใช้เยอะที่สุด แล้วแบกต้นทุนนั้นไว้ตลอดปี ถ้า IT เป็นบริการ คุณจ่ายตามที่ใช้จริง

สไลด์ระบุเหตุผลที่ควรใช้ cloud ไว้ 4 ข้อ

เหตุผลรายละเอียดจากสไลด์
เศรษฐศาสตร์เช่าแทนซื้อ
ขยายและหดได้ทันทีปรับขนาดทรัพยากรได้ในหน่วยนาที
อินเทอร์เฟซง่ายขอเครื่อง คืนเครื่อง เฝ้าดู และจัดการ ผ่านช่องทางเดียว
ลดต้นทุนดูแลตัดงานดูแลโครงสร้างพื้นฐานบางส่วนออกไป

เกิดอะไรขึ้นตอนกดขอเครื่องหนึ่งเครื่อง

สไลด์แกะขั้นตอนของ Amazon EC2 ตอนที่ผู้ใช้ขอเครื่องหนึ่งเครื่อง ออกมาเป็น 7 ขั้น

ผู้ใช้เข้า self-service portal แล้วระบุว่าต้องการเครื่องที่มี software stack แบบไหน และมีกฎการเข้าถึงอย่างไร ทั้งหมดนี้ทำผ่านหน้าเว็บหรือ API ไม่มีการโทรหาใคร

ทั้ง 7 ขั้นไม่มีขั้นไหนที่ต้องมีคนเดินเข้า data center เลย นี่คือ software-defined ในรูปแบบที่ชัดที่สุด

สามวิธีวางแอปลงบนฮาร์ดแวร์

สไลด์เทียบวิธีวางแอปสามแบบ ทั้งสามแบบเรียกรวมกันว่า Software-Defined Servers

AppBin / LibraryOperating SystemVirtual MachineAppBin / LibraryOperating SystemVirtual MachineAppBin / LibContainerAppBin / LibContainerAppBin / LibContainerAppBin / LibAppBin / LibContainer RuntimeOperating SystemVirtual MachineAppBin / LibAppBin / LibContainer RuntimeOperating SystemVirtual MachineHypervisorOperating SystemHardwareVirtualizedContainer RuntimeOperating SystemHardwareContainerHypervisorOperating SystemHardwareMulti-Tenant Virtualized ContainerDeploymentDeploymentDeployment
รูปที่ 3: virtual machine, container และ container ที่รันอยู่ใน virtual machine ต่างกันตรงชั้นที่แทรกอยู่ระหว่างแอปกับฮาร์ดแวร์

Virtualized Deployment ฮาร์ดแวร์หนึ่งเครื่องมี OS แล้วมี hypervisor แบ่งออกเป็น virtual machine หลายตัว แต่ละ VM มี OS ของตัวเองครบชุด

Container Deployment ตัด VM ทิ้ง เหลือ container runtime ตัวเดียวบน OS ของเครื่อง แต่ละ container มีแค่แอปกับไลบรารีที่มันต้องใช้ ไม่มี OS ของตัวเอง จึงเบากว่ามาก

Multi-Tenant Virtualized Container Deployment เอาสองแบบมารวมกัน มี hypervisor แบ่ง VM ก่อน แล้วในแต่ละ VM ค่อยรัน container อีกที แบบนี้ใช้เมื่อต้องแยกขาดระหว่างองค์กร แต่ยังอยากแชร์ทรัพยากรภายในองค์กรเดียวกันได้

สไลด์ไล่คุณสมบัติของทั้งสามแบบไว้ครบ

คุณสมบัติVirtualizedContainerMulti-Tenant
ซ่อนฮาร์ดแวร์ไว้ข้างหลัง
ย้ายเครื่องได้
มีของครบในตัว
แยกขาดจากกัน✓ แยกจากเจ้าอื่น
กินทรัพยากรน้อยกว่า
แชร์ทรัพยากรในองค์กรเดียวกัน

สามแถวแรกเหมือนกันหมด ที่ต่างกันคือสามแถวล่าง ซึ่งเป็นการแลกกันระหว่างระดับการแยกขาดกับต้นทุน

จุดที่คนพลาดบ่อย

คนมักคิดว่า container คือ VM ที่เล็กลง ไม่ใช่ VM มี OS ของตัวเองทั้งชุด ส่วน container ใช้ OS ของเครื่องแม่ร่วมกับ container ตัวอื่น ผลตามมาคือสองข้อ ข้อแรก container บูตเร็วกว่าเป็นสิบเท่า เพราะไม่ต้องบูต OS ข้อสอง ทุก container บนเครื่องเดียวกันต้องใช้ kernel เดียวกัน จะรัน container ของ Windows บนเครื่อง Linux ตรง ๆ ไม่ได้

Containers: เขียนครั้งเดียว รันที่ไหนก็ได้

ทำไมต้องมีสิ่งนี้

โปรแกรมหนึ่งตัวไม่ได้มีแค่โค้ดของมัน มันพึ่งไลบรารีเวอร์ชันหนึ่ง พึ่ง runtime ของภาษาเวอร์ชันหนึ่ง พึ่ง OS พึ่งไฟล์บางไฟล์ และพึ่งเครือข่าย พอย้ายเครื่องแล้วของพวกนี้เปลี่ยนไป โปรแกรมก็อาจทำงานผิดทันที

นักพัฒนาอยากเขียนโปรแกรมบนโน้ตบุ๊กตัวเอง แล้วย้ายไปเครื่องทดสอบ แล้วเอาขึ้นเครื่อง production คำถามคือทำอย่างไรให้เขียนครั้งเดียวแล้วรันที่ไหนก็ได้

สไลด์ตอบว่า ต้องห่อโปรแกรมไว้ในหน่วยที่ยืนได้ด้วยตัวเอง มีทุกอย่างที่โปรแกรมต้องใช้อยู่ข้างใน ทั้งโค้ด ไลบรารี และ runtime แล้วหน่วยนั้นต้องรันบนเครื่องต่างกันได้

เทียบให้เห็นภาพ

ก่อนปี 1960 การขนของข้ามประเทศเป็นเรื่องยุ่งมาก เพราะของแต่ละชนิดมีรูปทรงต่างกัน ลัง ถัง เปียโน รถยนต์ กระสอบ ทุกครั้งที่เปลี่ยนพาหนะจากเรือเป็นรถไฟเป็นรถบรรทุก ต้องยกของออกมาจัดใหม่ทั้งหมด และต้องคอยกังวลว่าเมล็ดกาแฟจะดูดกลิ่นเครื่องเทศที่วางข้าง ๆ หรือเปล่า

ตู้คอนเทนเนอร์มาตรฐานแก้ปัญหานี้ด้วยความคิดง่าย ๆ คือ ใส่อะไรลงไปก็ได้ ปิดผนึกไว้จนถึงปลายทาง ข้างนอกตู้หน้าตาเหมือนกันหมด ท่าเรือ เครน รถไฟ และรถบรรทุก ก็แค่ต้องรู้จักตู้แบบเดียว

container ในซอฟต์แวร์ยืมความคิดนี้มาตรง ๆ ข้างในจะเป็น Python, Java หรืออะไรก็ได้ แต่ข้างนอกหน้าตาเหมือนกันหมด เครื่องที่รันมันจึงไม่ต้องรู้ว่าข้างในมีอะไร

จาก Dockerfile ถึง container ที่กำลังรัน

Docker (เครื่องมือสร้างและรัน container ที่ใช้กันแพร่หลายที่สุด) แยกเรื่องนี้เป็นสามสิ่งที่ต้องไม่สับสนกัน

สิ่งที่เป็นคืออะไรเทียบกับการเขียนโปรแกรม
Dockerfileไฟล์ข้อความที่บอกว่าจะประกอบของอย่างไรsource code
Docker Imageผลจากการ build เป็นก้อนที่คัดลอกและส่งต่อได้ไฟล์ที่ compile แล้ว
Docker Containerimage ที่ถูก run แล้วกำลังทำงานอยู่process ที่กำลังรัน

image หนึ่งก้อนสร้าง container ได้หลายตัวพร้อมกัน เหมือนไฟล์โปรแกรมหนึ่งไฟล์เปิดเป็นหลาย process ได้

ในตัว Dockerfile จะรวมสี่อย่างเข้าด้วยกัน คือโค้ด ค่าตั้งค่า รายการ dependency และ runtime engine เมื่อ build ออกมาแล้ว ทุกอย่างนี้ถูกผนึกไว้ในก้อนเดียว

บนเครื่องที่รัน โครงจะเป็นชั้น ๆ ตามนี้ คือ infrastructure อยู่ล่างสุด ถัดขึ้นมาคือ host operating system ถัดขึ้นมาคือ Docker และบนสุดคือ container ของแอปหลาย ๆ ตัวที่รันเคียงกันอยู่

ลำดับการทำงานจริงเมื่อพัฒนาแอปแบบ container

สไลด์วางลำดับไว้ 7 ขั้น

เขียนแอปตามปกติบนเครื่องตัวเอง ยังไม่ต้องยุ่งกับ container

ลองตอบดู: ทำไมการมี Dockerfile ถึงสำคัญกว่าการมี image ที่ build เสร็จแล้ว

เพราะ Dockerfile คือสูตร ส่วน image คือของที่ทำเสร็จ ถ้ามีแต่ image แล้วอยากรู้ว่าข้างในมีไลบรารีเวอร์ชันอะไร ต้องเปิดเข้าไปดู แต่ถ้ามี Dockerfile คำตอบอยู่ในไฟล์ที่อ่านได้ แก้ได้ และเก็บใน Git ได้ นี่คือหลัก Infrastructure as Code ข้อเดียวกับที่ DevOps พูดถึง

Deployment Orchestration: เมื่อแอปมีมากกว่าหนึ่งชิ้น

container แก้ปัญหาว่าโปรแกรมหนึ่งตัวจะรันที่ไหนก็เหมือนกัน แต่แอปจริงไม่ได้มีตัวเดียว

ทำไมต้องมีสิ่งนี้

สไลด์เริ่มด้วยประโยคเดียวว่า การ deploy แอปที่ซับซ้อนในโลกจริงเป็นเรื่องยากเสมอ แล้วไล่เหตุผลออกมาสี่ข้อ

เหตุผลที่หนึ่ง: dependency ชนกัน แอปเวอร์ชัน 1.5 ต้องใช้ไลบรารีชุดหนึ่ง ส่วนเวอร์ชัน 1.6 ต้องใช้อีกชุดที่เลขเวอร์ชันไม่ตรงกัน พอสองเวอร์ชันต้องอยู่บนเครื่องเดียวกัน ก็ชนกัน

เหตุผลที่สอง: มีหลายสภาพแวดล้อม เครื่อง Dev อยู่ที่ IP 10.0.1.40 มี webapp กับ service อย่างละตัว เครื่อง Test อยู่ที่ 11.5.1.93 หน้าตาคล้ายกัน แต่ Production อยู่ที่ 35.8.4.1 กับ 35.8.4.2 มี webapp สองตัวและ service สามตัว โครงไม่เหมือนกันสักเครื่อง แปลว่าทดสอบผ่านบน Test ไม่ได้แปลว่าจะผ่านบน Production

เหตุผลที่สาม: ขั้นตอน deploy ยาวและเปราะ สไลด์ยกตัวอย่างขั้นตอนจริงมาให้ดู

ขั้นตอน deploy ที่ต้องพิมพ์เองทีละบรรทัด
adduser dbadm:pass1
setenv DB_HOST= 35.8.4.1, 35.8.4.2
pip install db_driver
mkdir /opt/db
db_install
chown -r dbadm .
chmod 777 -r /opt/db
start service_A
# หลัง service_A ขึ้นแล้ว จึงสั่ง
start service_B
# รอจน service_B พร้อม จึงสั่ง
init main

สไลด์เขียนกำกับไว้สั้น ๆ ว่า พิมพ์ผิดตัวเดียวอาจนำไปสู่หายนะ ลองดูบรรทัด chmod 777 -r /opt/db ถ้าเผลอพิมพ์ path ผิดเป็น / ทั้งเครื่องจะเปิดสิทธิ์ให้ทุกคนทันที และสามบรรทัดสุดท้ายยังมีลำดับที่ห้ามสลับด้วย

เหตุผลที่สี่: ระบบเปลี่ยนตลอดเวลา สไลด์ยกผลสำรวจที่เทียบองค์กร IT สามระดับ

คำถามในแบบสำรวจHigh performersMediumLow
deploy บ่อยแค่ไหนตามต้องการ วันละหลายครั้ง (มากกว่า 46 เท่า)สัปดาห์ละครั้งถึงเดือนละครั้งสัปดาห์ละครั้งถึงเดือนละครั้ง
จากคอมมิตถึงขึ้นจริงใช้เวลาเท่าไรน้อยกว่า 1 ชั่วโมง (เร็วกว่า 440 เท่า)1 สัปดาห์ถึง 1 เดือน1 สัปดาห์ถึง 1 เดือน
พังแล้วกู้คืนใช้เวลาเท่าไรน้อยกว่า 1 ชั่วโมง (เร็วกว่า 24 เท่า)น้อยกว่า 1 วัน1 วันถึง 1 สัปดาห์
สัดส่วนการเปลี่ยนแปลงที่ทำให้พัง0-15% (ต่ำกว่า 5 เท่า)0-15%31-45%

สไลด์เขียนตัวเลขจริงกำกับไว้ด้วยว่า Amazon deploy ทุก 11.6 วินาที Netflix ใช้เวลาจากคอมมิตถึงขึ้นจริง 16 นาที และ Amazon มีอัตราการเปลี่ยนแปลงที่ทำให้พังราว 0.001%

ตัวเลขพวกนี้เป็นไปไม่ได้เลยถ้ายังพิมพ์คำสั่งเองทีละบรรทัด

ทางออก: เขียนสิ่งที่ต้องการลงไฟล์

สั่งทีละขั้นด้วยมือ

บอกเครื่องว่า ต้องทำอะไรบ้าง ตามลำดับไหน ถ้าขั้นที่ 5 พัง ต้องรู้เองว่าจะย้อนขั้นที่ 1 ถึง 4 อย่างไร และเอกสารที่บอกว่าตอนนี้ระบบเป็นอย่างไร ก็คือความจำของคนที่พิมพ์

เขียนไฟล์บอกผลลัพธ์ที่ต้องการ

บอกเครื่องว่า สุดท้ายอยากได้อะไร แล้วให้เครื่องหาทางไปเอง ไฟล์นั้นเก็บใน Git ได้ ใครอ่านก็รู้ว่าระบบหน้าตาอย่างไร และย้อนกลับเวอร์ชันก่อนได้ด้วยคำสั่งเดียว

docker-compose.yml ที่นิยามแอปทั้งชุด
version: "3.8"
services:
  todo:
    image: "todo:release-2"
    container_name: todo
    ports:
      - 8000:8000
    environment:
      REDIS_HOST: redis
    networks:
      - todo-net
  webapp:
    image: "todo-webapp:release-1"
    container_name: webapp
    stdin_open: true
    ports:
      - 3000:3000
  redis:
    image: "redis:7.0.12"
    container_name: redis
    networks:
      - todo-net
networks:
  todo-net: {}

ไฟล์นี้ยาว 22 บรรทัด และแทนที่ขั้นตอนพิมพ์มือทั้งหมดข้างบน สังเกตสามจุด

ทุก image ระบุเวอร์ชันชัดเจน todo:release-2, todo-webapp:release-1 และ redis:7.0.12 ไม่มีคำว่า latest ที่ไหนเลย แปลว่าสั่งวันนี้กับสั่งอีกหกเดือนได้ของชุดเดียวกัน

ที่อยู่ของบริการเป็นชื่อ ไม่ใช่ IP REDIS_HOST: redis ชี้ไปที่ชื่อบริการ ไม่ใช่ 35.8.4.1 แบบในสคริปต์ที่แล้ว ย้ายไปรันที่ไหนไฟล์ก็ไม่ต้องแก้

เครือข่ายถูกประกาศไว้ด้วย todo-net เป็นเครือข่ายส่วนตัวที่มีแค่ todo กับ redis อยู่ ส่วน webapp ไม่ได้อยู่บนนั้น จึงต่อตรงเข้า redis ไม่ได้ นี่คือการกำหนดขอบเขตความปลอดภัยด้วยไฟล์

สั่ง docker compose up ครั้งเดียว ได้ผลลัพธ์แบบนี้

InfrastructurePort: 3000Todo Webapptodo-webapp:release-1Port: 8000Todo Servicetodo:release-2Port: 6379Redisredis:7.0.12todo-net
รูปที่ 4: ผลจากไฟล์เดียว: สามบริการขึ้นมาพร้อมกัน พร้อมเวอร์ชัน พอร์ต และเครือข่ายส่วนตัวที่กำหนดไว้

หมายเหตุเล็กน้อย สไลด์ติดป้ายบริการ todo ว่า Front-End Service และ webapp ว่า Back-End Service ซึ่งดูจะสลับกันกับสิ่งที่ไฟล์บอก เพราะ todo คือตัวที่คุยกับ Redis ส่วน webapp คือตัวที่เปิดพอร์ต 3000 ให้เบราว์เซอร์เข้า ให้ยึดตามไฟล์เป็นหลัก

ได้อะไรกลับมา

สไลด์สรุปประโยชน์ของ deployment orchestration ไว้ 5 ข้อ

  • ทำให้การ deploy แอปที่ซับซ้อนง่ายขึ้น
  • ลดความผิดพลาดที่เกิดจาก dependency และจากคน
  • deploy ได้เร็วขึ้นและมีประสิทธิภาพกว่าเดิม
  • ทำ automated test และ regression test ได้สะดวก
  • ย้อนกลับไปเวอร์ชันก่อนหน้าได้เมื่อต้องการ
ลองตอบดู: ทำไมการ rollback ถึงง่ายขึ้นมาก เมื่อระบบถูกนิยามด้วยไฟล์

เพราะการ rollback กลายเป็นการเอาไฟล์เวอร์ชันเก่ากลับมาใช้ แล้วสั่งใหม่ ในเมื่อไฟล์ระบุเวอร์ชันของทุก image ไว้ครบ ระบบที่ได้ก็จะเหมือนเดิมทุกจุด ตรงข้ามกับการ rollback แบบมือ ที่ต้องไล่ย้อนคำสั่งทีละบรรทัดโดยไม่รู้ว่าคำสั่งไหนย้อนได้บ้าง

Software-Defined Networks: ยกสมองออกจากอุปกรณ์

สามหัวข้อที่ผ่านมาอยู่ในโลกของเครื่องและโปรแกรม หัวข้อสุดท้ายลงไปที่ชั้นล่างสุด คือเครือข่าย

ทำไมต้องมีสิ่งนี้

ในอินเทอร์เน็ตแบบเดิม router แต่ละตัวเป็นก้อนปิดที่รวมทุกอย่างไว้ในตัวเอง มีทั้งฮาร์ดแวร์สำหรับสับสวิตช์แพ็กเก็ต และซอฟต์แวร์เฉพาะของผู้ผลิตที่รันโปรโตคอลมาตรฐานอย่าง IP, RIP, IS-IS, OSPF และ BGP อยู่บน router OS ของเจ้านั้นเอง เช่น Cisco IOS

ปัญหาคือ ถ้าอยากเปลี่ยนวิธีเลือกเส้นทาง คุณทำไม่ได้ ต้องรอผู้ผลิตออก firmware ใหม่ และถ้าอยากได้ฟังก์ชันอื่น เช่น firewall หรือ load balancer ก็ต้องซื้อกล่องเพิ่มอีกกล่อง ราว ๆ ปี 2005 คนในวงการจึงเริ่มกลับมาคิดใหม่ว่าจะควบคุมเครือข่ายอย่างไร

Middlebox: กล่องที่โผล่มาเต็มเครือข่าย

RFC 3234 นิยาม Middlebox (กล่องที่แทรกอยู่กลางทาง) ว่าเป็นกล่องใด ๆ ที่แทรกอยู่บนเส้นทางระหว่างต้นทางกับปลายทาง แล้วทำงานอื่นนอกเหนือจากงานมาตรฐานของ IP router

สไลด์ไล่ให้ดูว่ามันอยู่ทุกที่จริง ๆ

ชนิดเจอที่ไหน
NATบ้าน เครือข่ายมือถือ และองค์กร
Firewall และ IDSบริษัท สถาบัน ผู้ให้บริการ และ ISP
Load balancerบริษัท ผู้ให้บริการ data center และเครือข่ายมือถือ
Cacheผู้ให้บริการ เครือข่ายมือถือ และ CDN
กล่องเฉพาะงานผู้ให้บริการ สถาบัน และ CDN

ทิศทางที่วงการเดินไปมีสี่ขั้น

  1. เริ่มจากฮาร์ดแวร์ปิดเฉพาะของแต่ละเจ้า
  2. ขยับไปใช้ฮาร์ดแวร์แบบ whitebox ที่เปิด API มาตรฐานให้
  3. ทำให้ตัวอุปกรณ์โปรแกรมได้ในระดับพื้นฐาน ด้วยรูปแบบ match กับ action
  4. ย้ายการแข่งขันไปอยู่ที่ซอฟต์แวร์ โดย SDN รวมศูนย์การควบคุมและการตั้งค่าไว้ทางตรรกะที่เดียว ส่วน Network Functions Virtualization (การทำหน้าที่ของอุปกรณ์เครือข่ายให้เป็นซอฟต์แวร์) ทำให้บริการเครือข่ายรันบนเครื่องธรรมดาได้

ทำไมอินเทอร์เน็ตถึงยอมให้ทำแบบนี้ได้

ต้องย้อนไปที่รูปทรงของโปรโตคอลอินเทอร์เน็ต

HTTPSMTPQUICDASHRTPapplicationTCPUDPtransportIPnetworkEthernetWiFiBluetoothPPPPDCPlinkcopperradiofiberphysicalthin waistทุกเครื่องต้องพูดได้
รูปที่ 5: รูปนาฬิกาทรายของอินเทอร์เน็ต ชั้นบนและชั้นล่างมีโปรโตคอลเยอะมาก แต่ชั้นกลางมี IP ตัวเดียว

ชั้น network มีโปรโตคอลเดียวคือ IP และทุกอุปกรณ์ที่ต่ออินเทอร์เน็ตหลายพันล้านเครื่องต้องพูดมันได้ ส่วนชั้นอื่นมีทางเลือกมากมาย ชั้นบนมี HTTP, SMTP, QUIC, DASH, RTP ชั้นล่างมี Ethernet, WiFi, Bluetooth, PPP, PDCP และลงไปถึงสายทองแดง คลื่นวิทยุ และไฟเบอร์ คอขวดตรงกลางนี้เรียกว่า thin waist

สไลด์เล่นมุกต่อว่า พอนาฬิกาทรายอายุมากขึ้น มันก็มี "ห่วงยางรอบเอว" ขึ้นมา ซึ่งก็คือ middlebox ทั้งหลายอย่าง NAT, firewall, cache และ NFV ที่ไปทำงานอยู่ข้างใน network แทนที่จะอยู่ที่ขอบ

ความฉลาดควรอยู่ตรงไหน

RFC 1958 บันทึกหลักคิดของอินเทอร์เน็ตไว้ว่า เป้าหมายคือการเชื่อมต่อ เครื่องมือคือ Internet Protocol และความฉลาดอยู่ที่ปลายทางทั้งสองข้าง ไม่ใช่ซ่อนอยู่ใน network

RFC เดียวกันยังตั้งข้อสังเกตไว้อย่างตรงไปตรงมาว่า หลายคนในชุมชนอินเทอร์เน็ตจะเถียงว่ามันไม่มีสถาปัตยกรรม มีแต่ธรรมเนียมที่ไม่เคยถูกเขียนลงกระดาษเลยตลอด 25 ปีแรก

ความเชื่อหลักสามข้อคือ การเชื่อมต่อต้องเรียบง่าย IP คือคอขวดที่แคบตรงกลาง และความซับซ้อนกับความฉลาดควรอยู่ที่ขอบของเครือข่าย

สไลด์เทียบสามยุคให้ดู

ยุคความฉลาดอยู่ที่ไหน
เครือข่ายโทรศัพท์ศตวรรษที่ 20อยู่ที่ชุมสายกลางเครือข่าย
อินเทอร์เน็ตก่อนปี 2005อยู่ที่ขอบ
อินเทอร์เน็ตหลังปี 2005อุปกรณ์เครือข่ายโปรแกรมได้ และยังมีโครงสร้างระดับแอปพลิเคชันขนาดใหญ่อยู่ที่ขอบด้วย

แยก control plane ออกจาก data plane

หัวใจของ SDN คือการแยกสองงานนี้ออกจากกัน

  • Data plane (ส่วนที่ส่งแพ็กเก็ตจริง) คือการรับแพ็กเก็ตเข้ามาแล้วส่งออกไปทางไหน ทำงานเร็วมาก ระดับทุกแพ็กเก็ต
  • Control plane (ส่วนที่ตัดสินใจเส้นทาง) คือการคำนวณว่าตารางส่งต่อควรมีหน้าตาอย่างไร ทำงานนาน ๆ ครั้ง
แบบเดิม: control plane อยู่ในทุก routerSDN: control plane ย้ายออกมารวมศูนย์routingalgorithmforwardingrouterroutingalgorithmforwardingrouterroutingalgorithmforwardingrouterทุกเครื่องคำนวณเอง แล้วคุยกันด้วยโปรโตคอลตั้งค่าผิดเครื่องเดียว กระทบทั้งเส้นทางRemote Controllercontrol plane / data planeCAswitchCAswitchCAswitchCAswitchcontroller คำนวณตารางแล้วส่งลงไปให้ทุกตัวswitch ส่งแพ็กเก็ตตามตารางอย่างเดียว
รูปที่ 6: แบบเดิม router ทุกตัวคำนวณตารางเอง แบบ SDN มี controller ตัวเดียวคำนวณแล้วส่งตารางลงไปให้ทุกตัว

แบบเดิม ทุก router รัน routing algorithm ของตัวเอง แล้วคุยกันผ่านโปรโตคอลจนได้ตารางส่งต่อของแต่ละตัว เมื่อแพ็กเก็ตเข้ามา router จะอ่านค่าใน header แล้วเทียบกับตารางว่าจะส่งออกทางพอร์ตไหน

แบบ SDN ยก routing algorithm ออกไปไว้ที่ remote controller ตัวเดียว controller คำนวณตารางให้ทุกตัวแล้วส่งลงไปติดตั้ง ตัวอุปกรณ์เหลือแค่หน้าที่ส่งแพ็กเก็ตตามตาราง

สไลด์ให้เหตุผลว่าทำไมการรวมศูนย์ทางตรรกะถึงดีกว่า

  • จัดการง่ายกว่า ลดโอกาสตั้งค่า router ผิด และปรับเส้นทางของ traffic ได้ยืดหยุ่นกว่า
  • โปรแกรม router ได้ การส่งต่อแบบอิงตาราง เช่นที่ OpenFlow API ทำ เปิดให้เขียนโปรแกรมสั่ง router ได้ การคำนวณตารางที่เดียวแล้วแจกออกไปนั้นง่ายกว่าการให้ทุกตัวคำนวณเองแล้วมาตกลงกัน
  • เปิด ไม่ผูกกับเจ้าใดเจ้าหนึ่ง เมื่อ control plane เป็นของเปิด ใครก็เข้ามาทำของใหม่ได้
เทียบให้เห็นภาพ

สไลด์เทียบ SDN กับการเปลี่ยนจากยุค mainframe มาเป็นยุค PC

ยุค mainframe ทุกอย่างรวมเป็นก้อนเดียวในแนวตั้ง ฮาร์ดแวร์เฉพาะ OS เฉพาะ แอปเฉพาะ ทั้งหมดมาจากเจ้าเดียวกัน ผลคือของใหม่ออกช้าและอุตสาหกรรมเล็ก

ยุค PC ตัดเป็นชั้นแนวนอนที่มีอินเทอร์เฟซเปิดคั่นระหว่างชั้น ใครจะทำ microprocessor ก็ทำ ใครจะทำ OS ก็ทำ ไม่ว่าจะเป็น Windows, Linux หรือ macOS และใครจะเขียนแอปก็เขียนได้ ผลคือของใหม่ออกเร็วและอุตสาหกรรมใหญ่ขึ้นมหาศาล

SDN พยายามทำแบบเดียวกันกับอุปกรณ์เครือข่าย

สี่อย่างที่ทำให้เครือข่ายหนึ่งเป็น SDN

  1. การส่งต่อแบบอิง flow ในรูปแบบทั่วไป เช่น OpenFlow
  2. แยก control plane ออกจาก data plane
  3. ฟังก์ชันของ control plane อยู่นอกตัว switch ที่ทำหน้าที่ data plane
  4. มี control application ที่โปรแกรมได้อยู่ข้างบน เช่น routing, access control และ load balancing

ข้อ 4 คือจุดที่น่าสนใจที่สุด เพราะมันแปลว่าฟังก์ชันเครือข่ายกลายเป็นแอปพลิเคชันที่เขียนเพิ่มเองได้

จุดที่คนพลาดบ่อย

คำว่า "centralized" ใน SDN หมายถึงรวมศูนย์ ทางตรรกะ ไม่ใช่มีเครื่องเดียว ถ้ามี controller เครื่องเดียวจริง ๆ เครื่องนั้นพังทีเดียวเครือข่ายก็ล่มทั้งระบบ ในทางปฏิบัติ controller จึงรันเป็นระบบกระจายที่มีหลายเครื่อง แต่แสดงตัวออกมาเป็นหนึ่งเดียวต่อผู้ใช้

สิ่งที่ยังเป็นโจทย์อยู่

สไลด์ปิดหัวข้อด้วยความท้าทายที่ยังแก้ไม่จบ

  • ทำให้ control plane แข็งแรงพอ ต้องเป็นระบบกระจายที่เชื่อถือได้ ทนต่อความล้มเหลว ขยายขนาดได้ และปลอดภัย โดยออกแบบความปลอดภัยเข้าไปตั้งแต่วันแรก ไม่ใช่มาแปะทีหลัง
  • รองรับความต้องการเฉพาะทาง เช่นเครือข่ายที่ต้อง real-time หรือต้องเชื่อถือได้และปลอดภัยระดับสูงมาก
  • ขยายไปทั้งอินเทอร์เน็ต ตอนนี้ SDN ทำงานได้ดีภายในองค์กรเดียว การขยายข้าม autonomous system ยังเป็นโจทย์
  • 5G SDN เป็นชิ้นส่วนสำคัญของเครือข่ายมือถือ 5G

คำถามปลายเปิดที่สไลด์ทิ้งไว้คือ ในอนาคตฟังก์ชันของเครือข่ายจะถูกทำด้วยโปรโตคอลแบบกระจายต่อไป หรือจะถูกคำนวณจากส่วนกลางแบบ SDN สไลด์ยกตัวอย่างว่าแม้แต่ congestion control ก็อาจย้ายมาทำแบบรวมศูนย์ได้ โดยให้ controller กำหนดอัตราการส่งของแต่ละต้นทาง จากระดับความแออัดที่ router รายงานเข้ามา

ทุกอย่างมาบรรจบกันตรงไหน

กลับไปที่รูปแรกอีกครั้ง ทั้งสี่หัวข้อที่ผ่านมาคือชั้นเดียวกันนั้น

  • Cloud ทำให้ได้ เครื่อง มาด้วยคำสั่ง
  • Container ทำให้ โปรแกรม รันที่ไหนก็เหมือนกัน
  • Orchestration ทำให้ แอปทั้งชุด ขึ้นมาพร้อมกันได้จากไฟล์เดียว
  • SDN ทำให้ เครือข่าย ที่เชื่อมทุกอย่างถูกสั่งด้วยโปรแกรมได้

ทั้งสี่อย่างใช้ความคิดเดียวกัน คือย้ายสิ่งที่เคยต้องทำด้วยมือกับของจริง ไปเป็นไฟล์ที่ซอฟต์แวร์อ่านแล้วลงมือทำแทน พอมันเป็นไฟล์ ทุกวิธีที่วงการซอฟต์แวร์ใช้กับโค้ดมาสามสิบปี ทั้งการเก็บเวอร์ชัน การทดสอบ การ review และการย้อนกลับ ก็ใช้กับโครงสร้างพื้นฐานได้ทันที

สรุปท้ายคาบ
  • Software-Defined Systems คือการจัดหา ตั้งค่า เปลี่ยน และดูแลระบบด้วยซอฟต์แวร์ โดยแยกฮาร์ดแวร์ออกจากซอฟต์แวร์ ทำทรัพยากรให้เป็นของเสมือน และส่งมอบแบบ as-a-service
  • ระบบคอมพิวเตอร์มีสี่ชั้น คือทรัพยากรจริง, OS, เครือข่าย และแอปพลิเคชัน แต่ละชั้นมีเวอร์ชัน software-defined ของตัวเอง
  • DevOps มีหลักการพื้นฐาน 4 ข้อ คือ collaboration, infrastructure as code, automation และ monitoring ข้อ IaC คือจุดที่ DevOps ต้องพึ่ง SDS
  • Cloud แปลง IT จากสินค้าเป็นบริการ เหตุผลที่ใช้คือเช่าถูกกว่าซื้อ ขยายหดได้ในหน่วยนาที อินเทอร์เฟซเดียวจบ และลดงานดูแล
  • ขั้นตอนขอเครื่องบน cloud มี 7 ขั้น จาก portal ไป cloud manager ไป hypervisor ที่สร้าง VM จาก image แล้วเปิด monitoring กับ billing และส่งรายละเอียดกลับ
  • VM มี OS ของตัวเองครบชุด container ใช้ OS ของเครื่องแม่ร่วมกัน จึงเบากว่าและบูตเร็วกว่า แต่แยกขาดจากกันน้อยกว่า
  • Dockerfile คือสูตร image คือของที่ build เสร็จ container คือ image ที่กำลังรัน
  • การ deploy แอปจริงยากเพราะ dependency ชนกัน มีหลายสภาพแวดล้อม ขั้นตอนยาวและพิมพ์ผิดได้ และระบบเปลี่ยนตลอดเวลา
  • Deployment orchestration แก้ด้วยการเขียนผลลัพธ์ที่ต้องการลงไฟล์เดียว เช่น docker-compose.yml แล้วได้ทั้งชุดขึ้นมาพร้อมเวอร์ชันและเครือข่ายที่กำหนดไว้
  • อินเทอร์เน็ตมีรูปนาฬิกาทราย ชั้น network มี IP ตัวเดียวเป็น thin waist ส่วน middlebox คือกล่องที่แทรกกลางทางแล้วทำงานนอกเหนือจาก IP router ตามนิยาม RFC 3234
  • SDN แยก control plane ออกจาก data plane แล้วยกการคำนวณตารางไปไว้ที่ controller ที่รวมศูนย์ทางตรรกะ ทำให้จัดการง่ายขึ้น โปรแกรมได้ และไม่ผูกกับผู้ผลิตรายเดียว
  • สี่อย่างที่ทำให้เป็น SDN คือ flow-based forwarding, แยก control กับ data plane, control plane อยู่นอก switch และมี control application ที่โปรแกรมได้

On this page

คาบนี้จะพาไปไหนบ้างระบบคอมพิวเตอร์หนึ่งระบบมีอะไรบ้างSoftware-Defined Systems คืออะไรทำไมเรื่องนี้ถึงสำคัญ: DevOpsนิยามที่เป็นทางการหลักการพื้นฐาน 4 ข้อผลที่ได้เครื่องมือที่จะได้ยินชื่อบ่อยCNCF Trail Map: ลำดับที่ควรเดินแผนที่ของทั้งวิชา: ระบบสี่ชั้นCloud: เมื่อการมีเครื่องกลายเป็นการเช่าเครื่องเกิดอะไรขึ้นตอนกดขอเครื่องหนึ่งเครื่องสามวิธีวางแอปลงบนฮาร์ดแวร์Containers: เขียนครั้งเดียว รันที่ไหนก็ได้จาก Dockerfile ถึง container ที่กำลังรันลำดับการทำงานจริงเมื่อพัฒนาแอปแบบ containerDeployment Orchestration: เมื่อแอปมีมากกว่าหนึ่งชิ้นทางออก: เขียนสิ่งที่ต้องการลงไฟล์ได้อะไรกลับมาSoftware-Defined Networks: ยกสมองออกจากอุปกรณ์Middlebox: กล่องที่โผล่มาเต็มเครือข่ายทำไมอินเทอร์เน็ตถึงยอมให้ทำแบบนี้ได้ความฉลาดควรอยู่ตรงไหนแยก control plane ออกจาก data planeสี่อย่างที่ทำให้เครือข่ายหนึ่งเป็น SDNสิ่งที่ยังเป็นโจทย์อยู่ทุกอย่างมาบรรจบกันตรงไหน