Nội dung bài viết
Hi các bạn 👋. Mình là Hùng Anh.
Đây là bài thứ ba trong series Kubernetes Fundamentals. Ở bài trước, mình đã thấy 1 server vật lý bị giới hạn thế nào: 1 kernel, 1 bộ phần cứng, 1 môi trường duy nhất. Lần này cùng mình xem Virtual Machine giải quyết bài toán đó ra sao, và những nhược điểm của cách triển khai này nhé.
Bắt đầu thôi.
1. Virtual Machine là gì
Virtual Machine (VM) là 1 máy tính được giả lập hoàn toàn bằng phần mềm — có OS và kernel riêng hoàn toàn, hoạt động độc lập, không biết gì về các VM khác đang chạy chung trên cùng 1 máy vật lý.
Đây là 1 sự cô lập mạnh nhất: thay vì chỉ cô lập ở mức tiến trình, VM giả lập nguyên cả 1 bộ phần cứng ảo để 1 hệ điều hành hoàn chỉnh chạy lên trên đó — y như đang chạy trên máy thật.
2. Cách Virtual Machine hoạt động
Nhưng nhiều VM, mỗi VM có 1 OS riêng hoàn toàn, thì làm sao để cùng chia sẻ chung đúng 1 phần cứng vật lý? Cần 1 phần mềm trung gian đứng giữa phần cứng thật và các VM, gọi là hypervisor. Hypervisor có nhiệm vụ chia sẻ CPU/RAM/Disk vật lý cho từng VM, đồng thời cách ly chúng với nhau.
Hypervisor có 2 loại, tuỳ vào việc bên dưới nó có sẵn 1 hệ điều hành nền hay không:
- Type 1 (bare-metal hypervisor) — cài trực tiếp lên phần cứng, không cần OS host. Ví dụ: VMware ESXi, KVM. Dùng trong datacenter/production.
- Type 2 (hosted hypervisor) — cài như 1 phần mềm chạy trên OS có sẵn. Ví dụ: VirtualBox, VMware Workstation. Dùng cho dev/test trên laptop.
Ứng dụng cài trong VM hoạt động y hệt như cài trên máy thật: nó gọi syscall tới kernel của chính VM đó, kernel VM lại gọi xuống hypervisor, và hypervisor mới là bên thực sự "dịch" yêu cầu đó xuống phần cứng thật. VM chỉ dùng chung với máy thật đúng phần cứng vật lý (thông qua hypervisor) — còn OS và kernel thì mỗi VM có bản riêng hoàn toàn.
Liên quan: WSL2 (Windows Subsystem for Linux) chính là ứng dụng thực tế của mô hình này — nó chạy 1 Linux kernel thật bên trong 1 VM nhẹ ẩn phía sau, giúp bạn chạy Linux ngay trên Windows.
3. VM đã giải quyết bài toán ở bài trước như nào
Nhờ hypervisor, giờ 1 máy vật lý duy nhất có thể chạy được nhiều hệ điều hành hoàn toàn độc lập cùng lúc — VM này cần Ubuntu, VM kia cần CentOS, đều chạy chung được trên đúng 1 phần cứng, không cần mua thêm máy mới. Phần tài nguyên vốn nằm không trước đây giờ được chia sẻ cho nhiều VM khác nhau thay vì lãng phí.
4. Nhược điểm của Virtual Machine
- Nặng. Mỗi VM cõng theo cả 1 OS + kernel đầy đủ, thường tốn vài GB cho mỗi VM — dù ứng dụng bên trong có nhỏ tới đâu.
- Khởi động chậm. Mỗi lần bật 1 VM là phải boot nguyên 1 hệ điều hành mới, y như bật 1 máy tính thật — mất từ vài chục giây tới vài phút.
- Tốn tài nguyên chỉ để tồn tại. Trước khi ứng dụng của bạn chạy được dòng code đầu tiên, VM đã tiêu tốn 1 phần CPU/RAM chỉ để nuôi sống bản thân OS của nó.
Câu hỏi đặt ra: trong thực tế, nhiều VM trên cùng 1 server thường chỉ cần đúng 1 loại OS — ví dụ toàn bộ đều là Linux. Vậy có nhất thiết mỗi VM phải chứa riêng hẳn 1 kernel đầy đủ không?
5. Tổng kết
Virtual Machine giải quyết đúng bài toán "1 máy, 1 môi trường" bằng cách giả lập nguyên cả 1 bộ phần cứng cho từng OS riêng, quản lý bởi hypervisor. Nhưng cái giá phải trả là mỗi VM đều nặng, khởi động chậm, và tốn tài nguyên chỉ để duy trì chính OS của nó.
Nếu phần lớn VM chỉ cần dùng chung 1 loại OS, liệu có cách nào nhẹ hơn để cô lập chúng không?
Giờ thì thư giãn một chút, rồi cùng mình sang bài tiếp theo về chủ đề Container nhé.
Happy reading! 🍵
Tài liệu tham khảo
- What's the difference between Type 1 vs. Type 2 hypervisor? - TechTarget
- What is Windows Subsystem for Linux - Microsoft Learn
Bài viết liên quan
Container
Cùng mình xem container giải quyết vấn đề nặng nề và khởi động chậm của Virtual Machine như nào, bằng cách bỏ đúng thứ mà VM chưa bao giờ chịu từ bỏ: 1 kernel riêng của chính nó.
Kubernetes: Kiến trúc và các thành phần
Khi container rải rác trên hàng chục, hàng trăm máy, ai sẽ là người quyết định container nào chạy ở đâu, tự khởi động lại khi nó chết, hay scale thêm khi tải tăng? Đó chính xác là bài toán Kubernetes sinh ra để giải quyết — cùng mình vẽ lại bên trong 1 cluster có những gì.
Các thuật ngữ Linux cơ bản
Trước khi chạm đến Kubernetes, câu chuyện phải bắt đầu từ thứ mà mọi thứ còn lại trong series này được xây trên nền của nó: Linux kernel. Nếu bạn chưa từng thực sự ngồi nghĩ kỹ kernel làm gì, driver là gì, hay "sandbox" trong Linux thực chất là gì, bài này dành cho bạn.