Cơ bản về máy ảo, docker và Kubernetes

Máy ảo

Máy ảo – Virtual Machine, là một con máy được thiết lập trong một máy thật và có các chức năng y hệt máy thật trừ việc nó không có phần cứng riêng biệt có thể nhìn thấy như một con máy thật. Máy ảo được tạo thành nhờ phần mềm ảo hóa để tận dụng sức mạnh xử lý của máy thật, một máy thật có thể cài đặt tùy ý số lượng các máy ảo miễn là đủ tài nguyên cho phép.

Sử dụng máy ảo là một bước tiến bởi vì thay vì mua và cài đặt nhiều máy, ta có thể dùng một máy vật lý và dùng phần mềm ảo hóa (như Virtual Box) để cài đặt nhiều máy ảo nhằm xây dựng một hệ thống máy tính xử lý mục đích tính toán nào đó.

Docker

Docker có thể coi là máy ảo với hệ điều hành và các thư viện đi kèm, tuy nhiên nó ở một level cao hơn. Docker có thể chạy trên máy thật hoặc máy ảo, nó không yêu cầu phân bổ cấu hình phần cứng cố định như máy ảo mà chạy như một tiến trình xử lý trong máy host. Với Docker, việc đóng gói phần mềm để chạy trên các nền tảng hệ điều hành khác nhau trở nên đơn giản hơn bao giờ hết, nó không còn phụ thuộc phần cứng và hệ điều hành của server mà phần mềm đó được deploy lên nữa. Lợi ích đem lại còn là việc loại bỏ xung đột giữa các thư viện phụ thuộc (dependencies) nếu cài nhiều phần mềm trực tiếp lên một server. Việc đóng gói phần mềm cũng đơn giản với việc tạo ra một Docker image, là một khuôn mẫu (template) để sau đó cài đặt một Docker container trên các môi trường khác nhau.

Thực ra Docker sinh ra để giải quyết việc đóng gói phần mềm, trong khi máy ảo giúp cho việc tối ưu tài nguyên xử lý. Tuy có thể dùng máy ảo để chạy phần mềm tách biệt với các phần mềm trên máy ảo khác, việc triển khai như vậy không tối ưu về mặt phần cứng. Xem hình minh họa dưới đây sẽ rõ.

Kubernetes

Kubernetes là một phần mềm quản lý Docker container, ra đời từ nhu cầu quản lý khi số lượng Docker rất lớn và cần có một công cụ để dễ dàng triển khai và bảo trì các ứng dụng trên nền tảng Docker. Kubernetes hay còn gọi là K8s, hoạt động dựa trên việc tạo ra một cluster – hay một cụm liên kết các máy tính với nhau (có thể là máy thật hay máy ảo) như một tài nguyên duy nhất, rồi triển khai các ứng dụng thành các deployment. Như vậy một ứng dụng được triển khai thành một deployment tương ứng, mỗi deployment có thể có một hay nhiều pod để chạy ứng dụng đó. Trong đó Pod là một khái niệm giúp trừu tượng hóa cao hơn nữa các Docker container, với việc một Pod có thể chứa một hay nhiều Docker container. Có thể hiểu pod tương ứng với một máy ảo, trong đó nó có các thành phần như địa chỉ IP, host OS, vân vân. Các pod sẽ được trao đổi với nhau theo một cách nào đó, giúp cho việc xây dựng một ứng dụng hoàn chỉnh trở nên dễ dàng và mềm dẻo.

Kubernetes giúp lên lịch để deploy và theo dõi hoạt động của các container, khi một container nào đó gặp trục trặc, nó sẽ tự động thay thế một container mới.

– Kubernetes được phát triển bởi Google vào năm 2014

– Năm 2016, Google cùng với Linux Foundation thành lập một tổ chức có tên là Cloud Native Computing Foundation (CNCF) và Kubernetes đã trở thành một project của tổ chức này

– 2018 Kubernetes đạt vị trí số 9 về số lượt commit trên Github

Bạn có thể dùng Kubernetes on-premise tức là chạy trên server riêng của bạn, hoặc dùng dịch vụ Kubernetes trên Cloud, các dịch vụ này gồm có:

  • Google Cloud: Kubernetes Engine
  • Amazon Web Services: Amazon EKS
  • Microsoft Azure: Azure Kubernetes Service (AKS)

Kubernetes cũng giúp đẩy nhanh tốc độ phát triển hệ thống bằng cách dùng các file manifest chứa các đặc tả về hệ thống mong muốn thay vì phải gõ từng lệnh khác nhau để cài đặt. Khả năng mở rộng của Kubernetes đến từ việc tách biệt các ứng dụng thành nhiều ứng dụng nhỏ gọi là microservice, trong đó các service được phát triển và hoạt động độc lập nên dễ dàng được scale.

Các thành phần chính của Kubernetes

  • Một hệ thống Kubernetes có thể bao gồm nhiều cluster
  • Mỗi cluster bao gồm nhiều node, mỗi node có thể là physical hoặc virtual machine
  • Mỗi cluster bao gồm một master node (control plane) và nhiều worker node
  • Master node lại bao gồm 5 thành phần chính
    1. API server: cung cấp REST API cho cluster
    2. etcd: key-value storage được sử dụng để lưu trạng thái và metadata của cluster
    3. kube controller manager: chứa các controller khác nhau để cập nhật trạng thái của kubernetes
    4. cloud controller manager: liên kết cluster với cloud provider
    5. scheduler: sử dụng kubernetes API để tìm các pod chưa được lên lịch sau đó đặt các pod này vào các Node dựa trên tài nguyên và các ràng buộc khác trên file manifest
  • Worker node xử lý workload của application trong cluster, mỗi worker node bao gồm 3 thành phần chính:
    1. kube-proxy: quản lý network policy trên mỗi node, chuyển tiếp hoặc lọc traffic tới node dựa trên các policy này
    2. kubelet: là agent chạy trên mỗi worker, có trách nhiệm giám sát giao tiếp với master node và quản lý các pod, dùng CRI để quản lý container runtime
    3. container runtime: chịu trách nhiệm chạy các container

Một số khái niệm quan trọng trong Kubernetes:

  • Pod: là vị nhỏ nhất dùng để schedule, deploy và cô lập runtime của một hoặc nhiều container liên quan tới nhau. Các container trong một pod sẽ được schedule trên cùng một node và cùng nhau chia sẻ tài nguyên chẳng hạn như file system và networking. Nếu node đó dừng hoạt động các pod đó sẽ được schedule để run trên một node khác trong cùng cluster.
  • Service: các ứng dụng của chúng ta chạy trên các pod nhưng thực tế chúng ta không truy cập trực tiếp đến các pod mà thông qua service. Service đại diện cho một điểm vào (entry point) để truy cập application của bạn. Service được dùng để khám phá và thực hiện chức năng load balancing cho một nhóm các đối tượng các pod bằng nhãn (label). Service giúp bạn scale application mà không ảnh hưởng đến end user. Ngoài ra service còn có thể giúp truy cập tới các tài nguyên bên ngoài cluster.
  • Label: cung cấp metadata nhận dạng cho các object trong kubernetes, cho phép người dùng tổ chức và nhóm các object trong cluster. Một object có thể có nhiều label và mỗi label có thể được gán cho nhiều object khác nhau.
  • Annotations (chú thích): là một object khác giống với label nhưng annotations cung cấp metadata cho các máy tính sử dụng chứ không phải con người. Ví dụ có thể dùng annotations để bổ sung các thông tin như timestamp, git branch, build id, release id.
  • ReplicaSet: đảm bảo application sẽ luôn chạy đúng loại và số lượng pod trong cluster. Ví dụ bạn muốn chạy webserver trên 4 instance để load balancing thì bạn có thể dùng ReplicaSet. ReplicaSet được thiết kế cho Stateless application ví dụ như webserver
  • StatefulSet: tương tự như ReplicaSet, nhưng có một số khác biệt. Mỗi bản sao của pod sẽ có 1 tên cố định và không thay đổi, được tạo lần lượt theo index từ thấp tới cao (db-01, db-02, db-03…). StatefulSet được thiết kế cho các Stateful application, nghĩa là dữ liệu của application sẽ được lưu lại trong mỗi session. Có 2 cách để cung cấp data cho application ở runtime đó là ConfigMap và Secret.
  • ConfigMap cung cấp dữ liệu dưới dạng key-value để cung cấp cho container tại runtime. Khi đã tạo ra ConfigMap có 2 cách để truyền vào container: một là tham chiếu tới environment variable trong đó các key của ConfigMap trở thành tên của environment variable; hai là các key của ConfigMap sẽ được ánh xạ thành các file trong một ổ đĩa của pod, key sẽ tương ứng là tên của file.
  • Secrets: cũng tương tự như ConfigMap nhưng được sử dụng để truyền các dữ liệu nhạy cảm cho container. Ví dụ bạn muốn cung cấp MongoDB password hoặc API token. Sử dụng Secrets giúp bạn tạo container mà không phải đóng gói các dữ liệu nhạy cảm trong container. ConfigMap và Secrets có thể được truyền vào pod thông qua manifest file và kubernetes API
  • Namespace: tất cả các object trong kubernetes được deploy vào trong các namespace. Kubernetes sử dụng namespace để quản lý các obẹct trong cluster. Ví dụ bạn muốn có 2 môi trường là Staging và Production thì bạn có thể tạo ra 2 namespace là staging và production. Lưu ý là mặc định các pod trong 1 namespace có thể truy cập tới các pod và service của namespace khác, vì vậy khi sử dụng namespace bạn cần thiết lập network policy trong kubernetes cluster để kiểm soát truy cập các resource.

Leave a comment