Giải pháp tự mở rộng tùy biến trong môi trường Kubernetes

MỤC LỤC

Kiến thức cơ sở

  • Khái niệm Container Ochestration & Kubernetes

    Bài toán đặt ra là làm thế nào để thiết kế và triển khai một giải pháp tự mở rộng tuỳ biến hiệu quả trong môi trường Kubernetes, giúp các doanh nghiệp có thể tự động điều chỉnh tài nguyên dựa trên nhu cầu thực tế và các điều kiện kinh doanh cụ thể, đồng thời giảm thiểu thời gian chậm trễ và tối ưu hóa chi phí. Mục tiêu cuối cùng là xây dựng một hệ thống có khả năng tự động điều chỉnh tài nguyên dựa trên các yêu cầu thực tế một cách chính xác và kịp thời, tối ưu hóa việc sử dụng tài nguyên và cung cấp trải nghiệm người dùng không bị gián đoạn. Thông qua việc áp dụng công nghệ container các công cụ như Docker hay Containerd, các tổ chức và doanh nghiệp có thể đạt được mức độ tự động hóa và linh hoạt cao, giúp tăng tốc độ triển khai ứng dụng và cải thiện khả năng sẵn sàng của hệ thống.

    Docker tập trung vào việc container hóa và chạy container một cách hiệu quả, nhưng không giải quyết vấn đề về việc tự động quản lý, mở rộng, và điều phối các container trong môi trường sản xuất đa dạng và phân tán. Với khả năng quản lý cụm container, tự động phục hồi, và mở rộng dựa trên tải, Kubernetes không chỉ giải quyết những hạn chế của Docker mà còn mở ra cơ hội mới cho việc triển khai ứng dụng quy mô lớn một cách linh hoạt và hiệu quả. Nó cũng đảm bảo rằng các Container có sự cô lập tài nguyên cần thiết, được kết nối mạng đúng cách và có khả năng chịu lỗi cao bằng cách tự động hóa việc lập lịch chạy Container, cân bằng tải, và quản lý tài nguyên, container orchestration giúp giảm thiểu thời gian downtime và tối ưu hóa việc sử dụng tài nguyên.

    Kubernetes, đặc biệt, đã trở thành giải pháp hàng đầu trong việc quản lý container trên quy mô lớn, cung cấp một hệ thống đầy đủ tính năng và linh hoạt, cho phép các doanh nghiệp triển khai ứng dụng một cách nhanh chóng và dễ dàng mở rộng quy mô theo nhu cầu. Phát triển bởi Google và sau đó được Cloud Native Computing Foundation (CNCF) quản lý, Kubernetes đã trở thành tiêu chuẩn ngành cho việc quản lý container trên quy mô lớn, cung cấp một cách linh hoạt và mạnh mẽ để quản lý các tải công việc và dịch vụ trong môi trường đám mây hoặc on - premise.  Khả năng tự động hóa và tự phục hồi: Kubernetes tự động triển khai và mở rộng ứng dụng dựa trên các yêu cầu tài nguyên và sử dụng các chính sách để khắc phục sự cố, đảm bảo ứng dụng luôn ổn định và khả dụng.

     Quản lý tài nguyên đa dạng: Kubernetes cho phép quản lý một loạt tài nguyên container, từ microservices đơn lẻ đến nhóm ứng dụng phức tạp, trên một cơ sở hạ tầng chung, giúp tối ưu hóa sử dụng tài nguyên và đơn giản hóa quy trình vận hành.  Tính di động và độc lập với cơ sở hạ tầng: Kubernetes giúp container hoạt động độc lập với cơ sở hạ tầng, hỗ trợ triển khai ứng dụng trên mọi môi trường đám mây công cộng, riêng tư, hoặc hybrid, cũng như trên máy chủ vật lý, đảm bảo tính di động cao cho ứng dụng.  Cộng đồng mạnh mẽ và hỗ trợ rộng rãi: Kubernetes được hỗ trợ bởi một cộng đồng người dùng và nhà phát triển đông đảo, cung cấp một lượng lớn tài liệu hướng dẫn, công cụ, và plugins để tăng cường khả năng và tính năng của hệ thống.

    Quản lý tài nguyên chặt chẽ thông qua "requests" và "limits" giúp tối ưu hóa việc sử dụng tài nguyên trong cụm, bảo đảm rằng các ứng dụng và dịch vụ có đủ tài nguyên cần thiết để hoạt động mà không làm ảnh hưởng đến các ứng dụng khác. Qua việc đặt "requests" và "limits", Kubernetes cung cấp khả năng điều chỉnh linh hoạt, cho phép các nhà phát triển và quản trị viên tối ưu hóa sử dụng tài nguyên dựa trên nhu cầu thực tế của ứng dụng và môi trường vận hành, từ đó tăng cường hiệu suất và tính sẵn sàng của ứng dụng. Điều này bao gồm cả việc tăng số lượng bản sao của ứng dụng (pods) để xử lý tải công việc tăng lên và giảm số lượng bản sao khi nhu cầu giảm đi , nhằm đảm bảo hiệu quả và tối ưu hoá chi phí sử dụng tài nguyên cho các nhà phát triển.

    Xây dựng giải pháp mở rộng tuỳ biến cho ứng dụng

    Kiến trúc tổng quan

     Là đơn vị cơ bản nhất của Kubernetes, Pods chứa một hoặc nhiều containers chạy ứng dụng của bạn.  Thu thập thông tin về tài nguyên từ mỗi Pod thông qua Kubelet và cung cấp thông tin này cho HPA.  Là một cầu nối giữa Prometheus và Metrics Server, Adapter này cho phép HPA sử dụng dữ liệu từ Prometheus để thực hiện các quyết định tự động mở rộng.

     Hệ thống giám sát và cảnh báo mạnh mẽ, thu thập và lưu trữ metrics theo thời gian thực từ ứng dụng và cơ sở hạ tầng của bạn.  Công cụ để hiển thị dữ liệu từ Prometheus, cho phép người dùng tạo bảng điều khiển và biểu đồ để trực quan hóa và phân tích các metrics.

    Quy trình tự động mở rộng của hệ thống

      Đây là bước nơi Horizontal Pod Autoscaler (HPA) phân tích dữ liệu thu thập được và đưa ra quyết định về việc cần phải tăng hay giảm số lượng pods dựa trên Metrics đã định nghĩa. Sau khi Metrics Server và Prometheus Adapter cung cấp dữ liệu metrics, HPA tiến hành đánh giá nhu cầu tài nguyên bằng cách so sánh sử dụng tài nguyên hiện tại với ngưỡng được đặt ra. Trong đó, desiredReplicas là lượng Replicas cần thiết, currentMetricValue là giá trị thông số hiện tại, desiredMetricValue là giá trị thông số mong muốn.

      Quyết định mở rộng/thu hẹp quy mô không chỉ dựa trên sự vượt ngưỡng của một Metric cụ thể mà còn dựa trên hành vi trong một khoảng thời gian, tránh việc phản ứng quá mức đối với các biến động nhất thời. Các pods mới sẽ được lên lịch trên các nodes trong cluster có đủ tài nguyên để chạy chúng, và được cân nhắc dựa trên các chính sách về tải công việc và affinity/anti-affinity nếu có. HPA tự động điều chỉnh số lượng pods trong một workload có khả năng mở rộng như Deployment, ReplicaSet, hoặc StatefulSet dựa trên việc quan sát các chỉ số hiệu suất, thường là CPU hoặc lưu lượng mạng.

      HPA giúp ứng dụng duy trì hiệu suất ổn định bằng cách tăng số lượng pods khi nhu cầu tài nguyên tăng lên và giảm số lượng khi nhu cầu giảm xuống, qua đó tối ưu hóa chi phí vận hành. Các metrics như sử dụng CPU, bộ nhớ, lưu lượng mạng, và thời gian phản hồi của ứng dụng được thu thập qua Prometheus và được trực quan hóa bằng Grafana. Các bảng điều khiển Grafana cho phép các quản trị viên nhanh chóng nhận diện bất kỳ vấn đề nào liên quan đến hiệu suất hoặc cấu hình tài nguyên không phù hợp.

      Để đánh giá hiệu quả của các hoạt động tự động mở rộng, cần phải phân tích liệu các thay đổi quy mô có giúp đáp ứng nhu cầu tài nguyên dự kiến hay không. Nếu hiệu suất và sự ổn định của ứng dụng không được cải thiện, hoặc nếu chi phí tài nguyên trở nên quá cao, có thể cần phải điều chỉnh các ngưỡng hoặc chính sách của HPA.  Cân Nhắc Cooldown Period: Khoảng thời gian giữa các hành động mở rộng cũng có thể cần được điều chỉnh để tránh việc mở rộng liên tục không cần thiết.

      Qua từng bước này, tự động mở rộng trở thành một phần không thể thiếu của quản lý hiệu suất và chi phí trong môi trường Kubernetes, đảm bảo rằng ứng dụng có thể phản ứng nhanh chóng và hiệu quả với mọi thay đổi trong nhu cầu sử dụng.

      Cài đặt và thực nghiệm

      • Cài đặt môi trường

        Để có Kubernetes Cluster, người dùng cần cài đặt Kubernetes trên từng Node rồi kết nối giữa các Node với nhau.  Bước 1: Cập nhật hệ thống và cài đặt các gói cần thiết sudo apt update. # (Dành cho Worker Node) Tham gia Kubernetes Cluster bằng kubeadm (Lệnh join sẽ có sẵn khi tạo Kubernetes Cluster cho Master Node thành công.

         Bước 8: Cài đặt hệ thống mạng để giao tiếp giữa các Pods (Calico) kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml.  Bước 2: Tải và cài đặt Metrics Server từ Github Repository của Kubernetes kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/.