26 tháng 5, 2019

Giới thiệu về Kubernetes

Giới thiệu về Kubernetes (k8s)

Trong bài viết này, chúng ta sẽ cùng tìm hiểu Kubernetes (k8s) là gì, nó không phải là gì, nó giải quyết vấn đề gì, các thành phần kiến ​​trúc của nó, làm thế nào để chạy trên local và cuối cùng là một số lựa chọn thay thế trên thị trường.

Vậy Kubernetes là gì?

Để bắt đầu hiểu tính hữu dụng của Kubernetes, trước tiên chúng ta phải hiểu hai khái niệm: hạ tầng bất biếncontainer. Hạ tầng bất biến là khái niệm mà các máy chủ không bao giờ được sửa đổi sau khi đã triển khai. Ý tưởng là nếu cần phải thay đổi một cái gì đó, thì nó không bao giờ được sửa đổi trực tiếp trên máy chủ, thay vào đó một máy chủ mới được xây dựng từ một base-image với tất cả các thay đổi cần thiết để chúng ta có thể thay thế máy chủ cũ bằng máy chủ mới mà không cần bất kỳ sửa đổi thêm nào. Container là một cách để đóng gói code của bạn, runtime, các system tool, các thư viện hệ thống và cấu hình để nó có thể được vận chuyển dưới dạng thực thi độc lập và nhẹ. Ý tưởng là ứng dụng của bạn sẽ hoạt động giống nhau ở mọi nơi, mọi lúc (ví dụ Ubuntu hoặc Windows). Điều đáng nói là container hóa không phải là một khái niệm mới, nó chỉ thực sự được phổ biến với sự phát triển của microservice và Docker.

Bây giờ chúng ta đã hiểu hai khái niệm đó, vậy Kubernetes là gì? Tôi sẽ định nghĩa nó như là container hoặc một nền tảng microservice điều phối computing, network và quản lý công việc cho chúng ta. Kubernetes mở rộng các cách ta scale ứng dụng được đóng gói, vì vậy chúng ta có thể nhận được tất cả những lợi ích của một kiến trúc hạ tầng bất biến

Từ Kubernetes có ý nghĩa gì, đó là một từ trong tiếng Hy Lạp, có nghĩa là người lái xe hoặc phi công và K8S là một từ viết tắt bằng cách thay thế 8 chữ cái "ubernete" bằng số "8".

Kubernetes cung cấp những gì?

K8s cung cấp một số tính năng chính giúp quy mô ứng dụng được đóng gói của bạn hoạt động hiệu quả.

  • Horizontal scaling - dễ dàng scale-up ứng dụng từ command-line hoặc từ giao diện UI

  • Tự động tráo đổi và rollback - theo dõi tình trạng của ứng dụng của bạn để đảm bảo tất cả các instance không bị lỗi cùng lúc. Nếu có sự cố, k8s sẽ tự động rollback thay đổi.

  • Service discovery và load balancing - Các container sẽ có IP riêng và bạn có thể đặt một tập hợp các container phía sau một tên miền DNS duy nhất để cân bằng tải.

  • Storage orchestration - tự động mount local, public-cloud hoặc một network storage.

  • Quản lý Secret và Cấu hình - Tạo và cập nhật các secret và cấu hình mà không cần phải build lại image của bạn.

  • Tự phục hồi - Khởi động lại các container khi không thành công, thay thế và lập lịch lại các container khi các node ngừng hoạt động, kill các container không đáp ứng được health-check do người dùng định nghĩa và không chúng phục vụ client cho đến khi chúng thực sự sẵn sàng.

  • Batch execution - Quản lý batch và tích hợp liên tục lượng công việc. Nó cũng đảm bảo việc thay thế các container bị lỗi

  • Tự động đóng gói - k8s đủ thông minh để lên lịch cho các container dựa trên yêu cầu tài nguyên và các ràng buộc khác.

Như bạn có thể thấy, Kubernetes cung cấp cho chúng ta rất nhiều thứ. Nó cho phép ta khởi chạy một cơ sở hạ tầng bất biến thực sự, nơi mà ứng dụng container của chúng ta có thể bị kill và tự phục hồi, container mới này có quyền truy cập vào tất cả các volume, secret, các cấu hình,... nó cần, tất cả đều là tự động.

Điều khoản và định nghĩa cơ bản của Kubernetes

Để bắt đầu hiểu cách sử dụng k8s, trước tiên chúng ta phải hiểu các đối tượng trong API. Có các đối tượng k8s cơ bản và một vài higher-level abstraction được gọi là các Controller.

Các đối tượng cơ bản

  • Pod - một nhóm gồm một hoặc nhiều container

  • Service - chuyển tiếp các request đến một nhóm các Pod

  • Volume - một thư mục có thể truy cập vào các container trong một Pod

  • Namespace - cho phép chúng ta tách cluster để dành riêng cho mục đích nhất định, ví dụ như một dự án hoặc một team phát triển

Higher-Level Abstractions

  • ReplicaSet - đảm bảo rằng số lượng Pod chúng ta muốn là những gì đang chạy.

  • Deployment - cung cấp các tham số cập nhật cho các PodReplicaSet

  • StatefulSet - đối tượng được sử dụng để quản lý các ứng dụng có trạng thái như các cơ sở dữ liệu.

  • DaemonSet - đảm bảo rằng tất cả hoặc một số node worker chạy một bản sao của một Pod. Điều này rất hữu ích cho các ứng dụng daemon như fluentd.

  • Job - tạo một hoặc nhiều Pod và thực thi một hoặc nhiều tác vụ nhất định, sau đó xóa các Pod.

Kiến trúc & Thành phần Kubernetes

Một k8s cluster được tạo thành từ một node Master. Node Master này có nhiệm vụ expose API, lên lịch triển khai và quản lý cluster nói chung. Các node Worker chịu trách nhiệm về container-runtime (giống như Docker hoặc rkt), cùng với một agent để giao tiếp với Master.

Các thành phần Master:

  • Kube-apiserver - expose API.

  • Etcd - Một key-value store lưu trữ tất cả dữ liệu cluster.

  • Kube-scheduler - lập lịch các pod mới trên các node worker

  • Kube-controller-manager - khởi chạy các controller

  • Cloud-controller-manager - giao tiếp với các clould-provider

Những thành phần này tạo nên một node Master. Etcd có thể được chạy trên cùng một server như một node Master hoặc trên một cluster chuyên dụng.

Các thành phần node:

  • Kubelet - Một tác nhân đảm bảo các container đang chạy trong một pod.

  • Kube-proxy - tuân theo các network-rule và thực hiện chuyển tiếp.

  • Container Runtime - Chịu trách nhiệm chạy container.

Dưới đây là một sơ đồ kiến ​​trúc cơ bản.

Hình 1

Cách cài đặt Kubernetes

Cài đặt k8s local rất đơn giản và dễ hiểu. Bạn sẽ phải cần hai công cụ sau: KubectlMinikube.

  • Kubectl - một CLI được sử dụng để tương tác với cluster.

  • Minikube - đây là file binary giúp triển khai một k8s cluster local trên máy phát triển.

Với hai công cụ này, bạn có thể bắt đầu triển khai các ứng dụng đã được container hóa của mình lên k8s cluster local chỉ trong vòng vài phút. Đối với một cluster-production đáp ứng tính sẵn sàng cao, bạn có thể sử dụng các công cụ như Kops, EKS, đây là service được cung cấp bởi AWS hoặc như GKE được cung cấp bởi Google.

Kubernetes sẽ không làm cho bạn những việc gì?

  • Nó không giới hạn loại ứng dụng bạn có thể triển khai. Nó cho phép bất kỳ loại ứng dụng được viết bằng bất kỳ ngôn ngữ lập trình nào. Miễn là nó được đặt trong một container.

  • Nó không thay thế các công cụ giống như Jenkins vì vậy nó sẽ không build ứng dụng của bạn cho bạn.

  • Nó không phải là một middleware nên nó sẽ không thực hiện các tác vụ mà middleware thực hiện như các message-bus hoặc caching quen thuộc.

  • Không quan tâm giải pháp ghi log nào được sử dụng. Hãy thiết lập ứng dụng của bạn ghi log ra stdout, và sau đó bạn có thể thu thập những log bạn muốn.

  • Không quan tâm về ngôn ngữ cấu hình của bạn (ví dụ: json).

K8s không quan tâm đến những điều này chỉ đơn giản là nó cho phép chúng ta xây dựng ứng dụng theo cách chúng ta muốn, phơi bày và thu thập bất kỳ loại thông tin nào theo cách chúng ta muốn.

Các đối thủ cạnh tranh Kubernetes

Có các công cụ khác tương tự như k8s. Ví dụ: có Docker Compose cho staging nhưng không thích hợp cho production hoặc Nomad cho phép chúng ta quản lý cluster và lên lịch nhưng nó không giải quyết được nhu cầu quản lý và giám sát cấu hình, secret của chúng ta, Netflix chỉ mở mã nguồn nền tảng điều phối (orchestration) của họ được gọi là Titus do đó không có đủ người sử dụng nó trong production, ngoại trừ Netflix. Nhìn chung, k8s cung cấp các tính năng tốt nhất hiện có với các dự án bổ trợ của bên thứ 3 để mở rộng chức năng của nó.

view raw Kubernetes.md hosted with ❤ by GitHub
z_img_001.png
view raw z_img_001.png hosted with ❤ by GitHub