Tue. Jan 28th, 2025

Kubernetes làm việc với Container như thế nào?

By admin Feb 27, 2024
kubernetes labs post 1

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.

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.

Kubernetes Architecture

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 Architecture

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

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.

kubernetes cluster

Đâ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).

Kubernetes Woker node

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.

imagekubernetes
  1. Đầu tiên kubernetes master node báo cho kubelet tạo container.
  2. 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.
  3. 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.
  4. Sau đó low level container runtime được thông báo và nó nhảy vào disk để lấy container image để tạo container.
  5. 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.

image

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.

Kubernetes

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.

Kubernetes

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é.

Bài viết này được lấy cảm hứng tại bài viết : https://kubernetes.io/docs/concepts/containers/

Để đọc thêm nhiều bài viết về Kubernetes các bạn có thể xem thêm tại đây.

By admin

Related Post

Leave a Reply

Your email address will not be published. Required fields are marked *

error: Content is protected !!
Don`t copy text!