Docker và Kubernetes là hai công cụ được sử dụng rộng rãi nhất trong hệ sinh thái cloud-native container. Hai nền tảng mở này đã giúp cuộc cách mạng về container phát triển mạnh mẽ nhờ vào tiện ích mà chúng cung cấp và sự phát triển mạnh mẽ của cộng đồng sử dụng. Mặc dù thường được sử dụng cùng nhau, Docker và Kubernetes có các mục tiêu khác nhau. Sự khác biệt này nằm ở cách các container được xây dựng, triển khai và quản lý.
Sự gia tăng trong việc sử dụng container đã tăng lên song song với sự gia tăng của các microservices. Container là một cách hữu ích để đóng gói phần mềm cho các ứng dụng này vì chúng tách biệt code với tất cả các phụ thuộc cần thiết cho thời gian chạy (runtime). Nhưng khi số lượng container tăng lên, việc quản lý chúng trên quy mô lớn sẽ trở thành một trở ngại. Do đó, các kỹ sư DevOps thường triển khai các công cụ tiêu chuẩn để tạo container và điều phối việc triển khai của chúng để tối đa hóa hiệu quả và tối ưu hóa tài nguyên.
Một cách ngắn gọn, Docker nói về việc xây dựng các container riêng lẻ trong khi Kubernetes về việc quản lý và sắp xếp một số lượng lớn các containers. Dưới đây, chúng ta sẽ tìm hiểu chi tiết hơn Docker và Kubernetes là gì, so sánh giữa hai loại, khám phá các kiến trúc tương ứng của chúng và xem xét các lợi ích và hạn chế của việc sử dụng từng loại.
Docker là gì?
Docker là một tiện ích để đóng gói và chạy các containers. Docker giúp xây dựng các containers tiêu chuẩn bao gồm tất cả các thành phần (components) cần thiết để chúng hoạt động riêng biệt, bao gồm code, phần phụ thuộc và thư viện. Về mặt kỹ thuật, Docker giống một công cụ quản lý container hơn là một định dạng container.
Các developer sẽ tương tác với Docker thông qua giao diện dòng lệnh (command line interface – CLI) để giao tiếp với ứng dụng Docker client để chạy các lệnh như docker build
hoặc docker run
. Chúng được dịch là các lệnh API cho Docker daemon dockerd
, vốn dùng để hướng dẫn hệ thống xây dựng môi trường. Một Docker registry lưu trữ các hình ảnh Docker, là các mẫu (templates) có thể thực thi. Do đó, các Docker containers về cơ bản là các thể hiện của những hình ảnh này. Docker Hub là một registry công khai lớn chứa nhiều hình ảnh container được viết sẵn hữu ích.
Docker được phát triển vào năm 2013 và đã định hình phong trào container hiện đại kể từ đó. Định dạng hình ảnh Docker (Docker image format) đã được xem như một tiêu chuẩn mở và ngày nay được gọi là Open Container Initiative (OCI). Khi chúng ta nói về về Docker container, là chúng ta thường đề cập đến Docker, công cụ đóng gói container. Bạn không được nhầm lẫn giữa Docker và Docker Inc., tên của một công ty. Docker Inc., công ty chủ yếu hỗ trợ dự án về án cộng đồng mã nguồn mở, các công cụ từ dự án mã nguồn mở.. Thực tế là công nghệ Docker và công ty có cùng tên có thể gây nhầm lẫn.
Lợi ích và hạn chế của Docker
Có rất nhiều lợi ích khi sử dụng Docker để xây dựng container. Một là tính di động (portability) — bạn có thể chạy các container này ở bất cứ đâu bạn muốn, bất kể máy chủ. Một lợi ích khác là bảo mật — vì các container riêng lẻ chạy trên namespace (không gian tên riêng) của chúng, chúng được chi cách khá tốt. Các container có xu hướng phù hợp với các phương pháp luận phát triển linh hoạt (agile) và tăng hiệu quả cho các quy trình CI / CD. Docker image cũng có thể tái sử dụng và chia sẻ trên các dự án.
Vì container chỉ là tạm thời, việc lưu trữ dữ liệu liên tục có thể là một vấn đề. Tất nhiên, đây là một vấn đề với các container nói chung chứ không chỉ riêng đối với Docker. Docker phù hợp hơn với các ứng dụng dựa trên microservices và có thể không phù hợp để phát triển dựa trên kiến trúc một khối (monolithic). Mặc dù các Docker container tương đối hiệu quả, nhưng chúng làm tăng lên các lớp (layers), làm tăng thêm chi phí so với các ứng dụng chạy trực tiếp trên nền tảng bare metal (tức máy chủ vật lý chỉ bao gồm phần cứng và dành riêng cho một khách hàng). Cuối cùng, các container cũng xuất hiện các vấn đề về bảo mật, do đó cần phải quét các lỗ hổng phổ biến.
Kubernetes là gì?
Kubernetes, còn được gọi là k8s hoặc “kube”, là một nền tảng điều phối container mã nguồn mở tự động hóa nhiều quy trình thủ công liên quan đến việc triển khai, quản lý và mở rộng các ứng dụng được chứa trong container. K8s giống như trò chơi Tetris — nó chọn vị trí của các container để tối ưu hóa tài nguyên máy tính, “điều phối” nơi các khối lượng công việc này kết thúc. Nó cũng cung cấp khả năng tự phục hồi để tự động sửa chữa và khởi động lại các container nếu chúng bị lỗi.
Tìm hiểu kiến trúc của Kubernetes giống như bóc các lớp của một củ hành. Tất cả các triển khai Kubernetes có ít nhất một cluster. Một cluster chứa các node. Các node này lưu trữ các pods. Các pods này bao gồm một tập hợp các containers đang chạy. Một Kubernetes instance có một control plane để quản lý tất cả các thành phần này.
Bạn có thể cho rằng thiết kế này có vẻ quá mức cần thiết, nhưng như vậy là để đảm bảo khả năng chịu lỗi và tính khả dụng cao mà Kubernetes hướng tới. Có nhiều K8s components quan trọng khác bao gồm kubectl
, CLI để quản lý các Kubernetes cluster, kube-Scheduler
, quản lý tính khả dụng và hiệu suất và kubelet, là agent chạy trên mỗi pod. Kubernetes có thể được cài đặt trên Linux, macOS hoặc Windows hoặc được truy cập thông qua giao diện người dùng web hoặc API REST.
K8s lần đầu tiên được phát triển dưới dạng một công cụ nội bộ có tên là Borg tại Google và được tạo mã nguồn mở vào năm 2014. Trong cuộc chiến giữa các container, Kubernetes đã chiến thắng và trở thành nền tảng hàng đầu, đánh bại Apache Mesos, Docker Swarm và Nomad. Ngày nay Kubernetes là nền tảng điều phối container được sử dụng rộng rãi nhất, thường được mô tả là “Linux của đám mây (Linux of the cloud)”. Kubernetes được tổ chức bởi Cloud Native Computing Foundation (CNCF). Bạn có thể thấy có tám chữ cái nằm giữa ‘K’ và ‘s’ trong Kubernetes — đó là nguồn gốc của chữ viết tắt K8s.
Lợi ích và hạn chế của K8s
Kubernetes rất dễ mở rộng và tự động hóa rất nhiều hoạt động phổ biến. Nó giải quyết nhu cầu của các doanh nghiệp trong việc điều phối triển khai container. Nhưng K8s còn làm được nhiều hơn thế, chẳng hạn như service discovry, cân bằng tải và mang lại lợi ích về độ tin cậy. Kubernetes cũng có một cộng đồng nguồn mở sôi động có liên quan đến nhiều hoạt động xây dựng xung quanh nền tảng và đóng góp nhiều công cụ tương thích.
Tuy vậy, cũng có những nhược điểm khi sử dụng Kubernetes. Bạn hãy nhớ rằng Kubernetes được tạo ra tại Google và Google điều hành hàng tỷ vùng chứa mỗi tuần. Họ đã xây dựng nền tảng với mục đích sử dụng quy mô doanh nghiệp lớn. Do đó, K8 có thể quá mức cần thiết cho các dự án nhỏ. Kubernetes rất phức tạp đặc biệt đối với các nhà phát triển không quen thuộc với các công nghệ cơ sở hạ tầng, có thể rất khó làm quen với quy trình phát triển Kubernetes. Kubernetes cũng đòi hỏi việc duy trì và cập nhật theo thời gian, đặc biệt là khi quản lý nhiều cluster.
Việc triển khai Kubernetes cũng khá phức tạp. Bên cạnh đó, K8s cấp quyền lực vô song cho quản trị viên, nhưng bảo mật có thể bị ảnh hưởng nếu các đặc quyền bị định cấu hình sai.
Docker và Kubernetes: Sự khác biệt là gì?
Cả Docker và Kubernetes đều là công nghệ cloud-native mở. Và các nhà cung cấp dịch vụ đám mây lớn hỗ trợ các thành phần của cả Docker và Kubernetes trong các dịch vụ của họ. Sự khác biệt giữa cả hai là Docker đóng gói các containerized applications trong một node duy nhất và Kubernetes chạy các ứng dụng này trên một cluster (một cụm các node). Vì những gói này thực hiện những việc khác nhau, chúng (Docker và Kunernetes) thường được sử dụng song song với nhau.
Tất nhiên, Docker và Kubernetes có thể được sử dụng độc lập. Trong khi một doanh nghiệp lớn có thể được hưởng lợi từ Kubernetes và có nguồn lực để có thể đảm bảo việc bảo trì nó, thì các dự án nhỏ có thể được hưởng lợi từ việc chỉ sử dụng Docker. Hoặc, một công ty có thể sử dụng Docker container hoặc OCI với container scheduler. Tương tự, Kubernetes được sử dụng phổ biến nhất với Docker container, nhưng nó có thể hoạt động với các loại container và runtimes khác.
Năm 2020, Kubernetes tuyên bố sẽ ngừng hỗ trợ Docker container engine để tập trung cho các container engine khác như CRI-O và containerd. Việc này đã loại bỏ Dockershim nhưng Kubernetes vẫn hỗ trợ các Docker image formats và OCI cũng như các Docker registry.
Lời kết
Cả Docker và Kubernetes đều ra đời để đáp ứng nhu cầu phát triển microservices. Trong mô hình này, các nhóm phải nhanh cung cấp các dịch vụ có tính khả dụng cao, phải lặp đi lặp lại cho người dùng cuối. Các container là một cách hiệu quả, có thể mở rộng để cung cấp các ứng dụng này, nhưng việc quản lý chúng trên quy mô lớn đặt ra nhiều thách thức.
Kết quả cuối cùng của việc chuyển sang các nền tảng quản lý container hiện đại là triển khai nhanh hơn và tiết kiệm chi phí hơn. Ví dụ: Booking.com đã xây dựng 500 ứng dụng trên nền tảng này trong tám tháng bằng cách sử dụng Kubernetes. Mặc dù các tiện ích như K8 liên quan đến đường cong học tập và các rào cản bảo trì liên tục nhưng hiện tại, chúng đang mở đường cho một tương lai có thể mở rộng của quản lý container.
Các tài liệu tham khảo
1/ https://docs.docker.com/get-started/overview/
2/https://kubernetes.io/docs/concepts/overview/components/
3/ https://kubernetes.io/docs/concepts/overview/what-is-kubernetes/