Giới thiệu
Ở bài này thì chúng ta sẽ tìm hiểu về một chủ đề khá thú vị là cách Kubernetes làm việc với Container Runtime như thế nào, và các loại Container Runtime mà kubernetes sử dụng.
Đây là bài thứ ba trong chuỗi bài về Container:
- Linux Namespaces và Cgroups: Container được xây dựng từ gì?
- Tìm hiểu sâu hơn về Container - Container Runtime là gì?
- Kubernetes làm việc với Container như thế nào?
- Tự xây dựng Container với Go
Kubernetes Architecture
Trước khi đi vào chi tiết về cách kubernetes sử dụng container runtime, mình sẽ nói sơ về tổng quan kiến trúc của kubernetes trước.
Một kubernetes cluster bao gồm một master node và một hoặc nhiều worker node.
Với master node có nhiệm vụ chính là quản lý cluster, phân phối và quản lý container tới từng worker node. Worker node có nhiệm vụ chính là nơi chứa các container để chạy ứng dụng. Trong từng master node và worker node nó sẽ có các thành phần sau đây.
Kubernetes master bao gồm 4 component:
- etcd: dùng để lưu trữ trạng thái của cluster.
- API server: thành phần chính mà client hoặc các thành khác sử dụng để giao tiếp với kubernetes cluster.
- Controller Manager: quản lý và tạo các resource tương ứng trong cluster.
- Scheduler: phân phối chọn worker node để chạy container.
Kubernetes worker node bao gồm 3 thành phần:
- kubelet: quản lý container trên từng worker node.
- kube-proxy
- container runtime
Thì ở bài này chúng ta sẽ tìm hiểu về worker node, vì đây sẽ là nơi kubernetes giao tiếp với container. Nếu các bạn muốn hiểu rõ hơn về kiến trúc bên trong kubernetes thì các bạn xem bài này nhé Kubernetes Series - Bài 11 - Kubernetes internals architecture.
How does Kubernetes manage containers in the cluster?
Trong một cluster ta sẽ có nhiều worker node, và worker node sẽ là nơi mà các container của ta chạy.
Và để làm việc với container trên từng worker node, kubernetes dùng một công cụ tên là kubelet.
Đây là thành phần chịu trách nhiệm tương tác với master node và quản lý container bên trong kubernetes cluster. Bên cạnh đó kubelet còn giám sát container ở trên worker node và gửi thông tin đó về master node.
Nó sẽ lắng nghe thông báo từ master node về cấu hình của container mà được phân phối tới worker node, sau đó nó sẽ tạo container tương ứng với cấu hình đó lên trên worker node.
Vậy kubernetes làm việc với container thông qua kubelet, còn kubelet sẽ làm việc với container như thế nào? Ta sẽ tìm hiểu tầng sâu hơn nữa là cách kubelet sẽ làm việc với container.
Container Runtime and Container Runtime Interface
Như đã nói ở bài trước container runtime là một công cụ đóng vai trò quản lý, giúp ta tạo và xóa container một cách dễ dàng, thay vì ta phải tạo container bằng hàng loạt câu CLI phức tạp.
Và kubelet sẽ tương tác với container runtime ở trên worker node thông qua một layer tên là Container Runtime Interface (CRI).
Vậy tại sao ta lại phải cần CRI, sao kubelet không tương tác trực tiếp với container luôn đi, tách ra chi cho rảnh vậy?
Thì lý do cho việc này là vì nhà phát triển kubernetes muốn giữ cho kubelet đơn giản nhất có thể. Vì container runtime thì có rất nhiều loại (docker, cri-o, containerd, …), thì thay vì ta phải implement việc tương tác với rất nhiều loại container runtime khác nhau bên trong kubelet, thì nhà phát triển kubernetes muốn để việc đó cho một thằng trung gian là CRI.
Cho dù ở worker node có xài container runtime nào đi chăng nữa thì kubelet cũng chỉ giao tiếp với CRI thông qua một tập lệnh duy nhất, còn lại việc giao tiếp với các container runtime khác nhau như thế nào thì tự thằng CRI nó implement.
Vậy thì kubelet sẽ thông qua CRI tương tác với container runtime, và container runtime sẽ thực hiện việc tạo container, hình minh họa nguyên một luồng kubernetes tạo container.
- Đầu tiên kubernetes master node báo cho kubelet tạo container.
- Tiếp theo kubelet giao tiếp với high level container runtime (cri-o, containerd, …) thông qua CRI và kêu nó tạo container đi.
- Lúc này high level container runtime sẽ pull image từ container image registry xuống, extract nó ra và lưu xuống disk.
- Sau đó low level container runtime được thông báo và nó nhảy vào disk để lấy container image để tạo container.
- Sau khi lấy được container image thì low level container runtime thực hiện một loạt lệnh xuống dưới linux kernel để tạo container.
Kubernetes works with Container Runtime
Vậy là ta đã hiểu được cách kubernetes làm việc với container runtime như thế nào, tiếp theo ta sẽ xem một số container runtime phổ biến mà kubernetes có thể xài.
Docker
Docker là thằng container runtime đầu tiên mà kubernetes sử dụng, nhưng ở phiên bản 1.24 thì nó đã bị kubernetes remove đi, không sử dụng nữa.
Kubernetes sử dụng docker thông qua CRI là dockershim, và vì nó quá rườm rà nên đã bị remove từ bản 1.24. Mình nhắc lại 2 lần là để cho mọi người nhớ kĩ :)))
.
Containerd
Containerd là một thằng container runtime đơn giản và bớt rờm rà hơn so với thằng docker.
Từ bản 1.1 thì containerd có nhúng sẵn một CRI plugin vào bên trong nó, kubelet chỉ cần tương tác trực tiếp với plugin này là được. Như ta thấy thì thay vì ở trên ta dùng docker cho container runtime ta phải đi qua rất nhiều lớp, còn với containerd thì ta đi thẳng tới nó luôn.
CRI-O
Đây là một thằng container runtime cũng phổ biến mà có thể dùng cho kubernetes như thằng containerd.
CRI-O được phát triển bởi Redhat.
Kết luận
Vậy là ta đã tìm hiểu xong về vấn đề kubernetes làm việc với container runtime như thế nào. Thì chỉ có một điểm quan trọng mà mình cần nhắc là từ bản 1.24 thì kubernetes sẽ bỏ việc sử dụng docker cho container runtime, nếu ta muốn nâng kubernetes lên bản 1.24 thì cần phải cài container runtime khác nhé.
Nếu bài viết có gì sai hoặc cần cập nhật thì liên hệ Admin.
Tham gia nhóm chat của DevOps VN tại Telegram.
Kém tiếng Anh và cần nâng cao trình độ giao tiếp: Tại sao bạn học không hiệu quả?