Kubernetes sẽ không còn hỗ trợ Docker? Lý do và những phương án thay thế
Ngày 02 tháng 12 năm 2020, trong thông báo đi kèm với bản phát hành Kubernetes v1.20, Kubernetes đã tuyên bố ngừng việc hỗ trợ docker từ những bản release tiếp theo. Điều này cũng đồng nghĩa với Dockershim (lớp hỗ trợ tiêu chuẩn CRI của Kubernetes) sẽ bị gỡ bỏ.
Lý do gì khiến Kubernetes không hỗ trợ docker trên những bản release tiếp theo? Kubernetes sẽ sử dụng những phương án nào để thay thế? Từ đó Bizfly Cloud có một số đánh giá về vấn đề này như sau:
Tại sao kubernetes không hỗ trợ docker trên những phiên bản tiếp theo
Để hiểu rõ lý do vì sao kubernetes không hỗ trợ docker ở những phiên bản tiếp theo, chúng ta có thể tham khảo hình vẽ dưới đây nhé.
Có thể thấy các node sẽ giao tiếp với Control Plane, trên mỗi node Kubelet sẽ lấy thông tin node và thực thi CRI mục đích tạo hoặc xóa container chạy trên node mà Kubenet đang quản lý.
Để tiếp tục phân tích chúng ta hãy tìm hiểu thêm khái niệm về CRI là gì. CRI là viết tắt của cụm từ Container Runtime Interface đảm nhiệm vai trò duy trì hoạt động của container. Trong 1 bộ Kubernetes cluster, Docker đóng vai trò duy nhất là CRI cho Kubernetes cluster dưới hình thái là 1 module có tên gọi là dockershim. Chính vì vậy mà trong các phiên bản Kubernetes tiếp theo sẽ không còn module dockershim này.
Được biết Kubernetes chỉ có chức năng chính là CRI trong Cluster. Tuy nhiên, nó lại có khá nhiều thành phần không cần thiết trên Cluster, bởi vậy làm cho Cluster hoạt động nặng hơn bình thường. Đó là lý do chính để giải thích vì sao kubernetes không hỗ trợ docker trong các phiên bản sắp tới theo như tuyên bố của họ.
Để có thể hiểu sâu hơn về vấn đề này, cùng Bizfly Cloud tiếp tục xem hình vẽ bên dưới.
Có thể thấy phần Docker network và Docker volume đối với Kubernetes hiển nhiên là không cần thiết. Đối với hệ thống kubernetes chạy trên môi trường production thì những thành phần này chỉ khiến cho nguy cơ bảo mật kém đi và bộ máy nặng hơn mà thôi. Vì vậy, kubernetes không hỗ trợ docker trong những phiên bản sắp tới, Kubernetes sẽ thay thế CRI dockershim bằng CRI khác.
Kubernetes không hỗ trợ docker có phải là tin chấn động?
Container runtime chịu trách nhiệm đẩy và chạy container image bên trong Kubernetes cluster. Thông thường thì Docker sẽ là lựa chọn hợp lý cho runtime đó. Ngoài ra thì còn có 2 lựa chọn phổ biến là containerd và CRI-O sẽ được đề cập ở phần tiếp theo. Một vấn đề phát sinh đó là docker không được thiết kế tương thích với Kubernetes.
Docler không chỉ đơn thuần được thiết kế chỉ làm một việc mà nó còn làm việc với toàn bộ tech stack. Docker với nhiều cải tiến UX sẽ giúp các developers dễ dàng tương tác khi làm việc. Tuy nhiên những cải tiến này cũng không thực sự cần thiết đối với Kubernetes vì Kubernetes không phải là human.
Để tạo ra được lớp thân thiện với người dùng thì Kubernetes cluster phải dùng công cụ khác gọi là Dockershim. Khi Dockershim ra đời lại gây thêm 1 phiền toái đó chính là có thêm 1 cái để maintain và cũng có thể là lý do của việc làm tăng khả năng mất kết nối. Vì vậy Kubernetes không hỗ trợ docker mà cụ thể là Dockershim sẽ bị loại bỏ từ phiên bản Kubelet v.123. Và từ đó cũng sẽ bỏ hỗ trợ cho Docker như là container runtime luôn.
Có thể bạn thắc mắc rằng nếu containerd đã có trong Docker stack thì Kubernetes cần Dockershim để làm gì? Lý do vì Docker không hề tuân theo chuẩn CRI. Người dùng chỉ cần đổi container runtime từ Docker sang một loại khác được hỗ trợ mà thôi.
Bạn cần lưu ý thêm rằng nếu trong workflow của cluster đang dựa trên docker socket cơ bản (/var/run/docker.sock) thì việc chuyển runtime khác có khả năng sẽ không thể dùng được nữa. Trường hợp này thường được gọi là Docker in Docker. Bạn có thể thay thế Pattern này bằng Kaniko (https://github.com/GoogleContainerTools/kaniko), img (https://github.com/genuinetools/img) hoặc buildad (https://github.com/containers/buildah).
Có cần phải viết Dockerfiles và build các thứ với Docker nữa không?
Hiện nay môi trường Docker dành cho Develop sẽ không liên quan đến Docker runtime của Kubernetes Cluster. Vì vậy việc thay đổi một môi trường khác rõ ràng là tốt hơn thay vì phải cố gắng tương thích được với Docker. Trước khi có sự thay đổi này thì Docker vẫn có ích đối với các lập trình viên. Tuy nhiên Container Image mà Docker tạo ra theo chuẩn OCI (Open Container Initiative) chứ không phải theo mô hình Docker-specific image. Dù tool bạn dùng là gì thì bất kỳ Container Image tương thích với chuẩn OCI đều tương thích với Kubernetes.
Khi kubernetes không hỗ trợ docker nữa, bạn có thể dùng containerd và CRI-O làm giải pháp thay thế. Cả containerd và CRI-O đều xử lý chạy Container image như nhau. Đây thực sự là lý do vì sao có chuẩn dành riêng cho containers của chúng ta.
Những CRI nào được lựa chọn để làm phương án thay thế sau khi kubernetes không hỗ trợ docker nữa, hãy cùng tìm hiểu ở trong phần tiếp theo sau đây.
Những phương án thay thế khi kubernetes không hỗ trợ docker nữa
1. Containerd
Khi kubernetes không hỗ trợ docker nữa thì phương án đầu tiên được khuyên dùng là containerd. Nhìn sơ qua thì có thể nhầm tưởng nó thuộc Docker nhưng thực chất nó là CRI và hoạt động độc lập với docker. Bởi vì CRI này khá gần gũi với docker nên người dùng có thể chuyển sang dùng CRI containerd này làm phương án thay thế.
Địa chỉ source code của containerd:https://github.com/containerd/containerd/
2. CRI-O
Phương án thay thế tiếp theo có thể kể đến khi kubernetes không hỗ trợ docker nữa là CRI-O. Với phương án Containerd được đề cập ở trên khi khởi động sẽ giống 1 phần của Docker và khiến cho một số phần mềm khác khởi động theo. Có thể thấy phương án sử dụng CRI-O sẽ ưu việt hơn so với Containerd ở chỗ nó chỉ tạo ra 1 CRI runtime nên hoạt động nhẹ nhàng hơn containerd rất nhiều.
Địa chỉ source code của CRI-O:https://github.com/cri-o/cri-o
Kubernetes không hỗ trợ docker chưa chắc đã là thông tin không tốt đối với giới công nghệ toàn cầu, Docker sẽ tiếp tục vai trò của mình trong những phương diện khác. Còn đối với việc Google thay đổi CRI của Kubernetes là nhằm mục đích cải tiến hoạt động của bộ máy Kubernetes, hướng đến sự phát triển mạnh mẽ hơn cho những công nghệ mới tiếp theo.
Hy vọng bài viết này có thể giải đáp được phần nào thắc mắc về thông tin Kubernetes không hỗ trợ docker trong những phiên bản tiếp theo. Giúp bạn có những định hướng đúng đắn trong việc sử dụng các phương án thay thế CRI đối với hệ thống máy tính mà mình đang vận hành.
Theo Bizfly Cloud chia sẻ
>> Có thể bạn quan tâm: Cách triển khai Nginx Ingress với Cert-Manager trên Bizfly Kubernetes Engine