Giới thiệu chi tiết về Karpenter - Công cụ tự động mở rộng Kubernetes

Nếu bạn đang quản lý một cụm Kubernetes và từng đau đầu với việc điều chỉnh tài nguyên để đáp ứng nhu cầu thay đổi của ứng dụng, thì Karpenter có thể là giải pháp mà bạn đang tìm kiếm. Được phát triển bởi AWS và hiện là một dự án mã nguồn mở, Karpenter đang nhanh chóng trở thành một trong những công cụ tự động mở rộng (autoscaler) tiên tiến nhất cho Kubernetes. Trong bài blog này, chúng ta sẽ cùng khám phá Karpenter là gì, cách nó hoạt động, điểm khác biệt so với Cluster Autoscaler truyền thống, và tại sao bạn nên cân nhắc sử dụng nó.
Karpenter là gì?
Karpenter là một công cụ tự động mở rộng cụm Kubernetes (cluster autoscaler) mã nguồn mở, được thiết kế để cải thiện hiệu suất và tính linh hoạt khi quản lý tài nguyên tính toán trong cụm Kubernetes. Ra mắt lần đầu bởi AWS vào năm 2021 và đạt trạng thái General Availability (GA) với phiên bản 1.0 vào năm 2024, Karpenter không chỉ giúp đảm bảo ứng dụng của bạn luôn có đủ tài nguyên mà còn tối ưu hóa chi phí bằng cách cung cấp đúng loại và số lượng node cần thiết theo thời gian thực.
Không giống như các công cụ truyền thống, Karpenter hoạt động theo cách "vừa kịp lúc" (just-in-time), nghĩa là nó nhanh chóng tạo ra các node phù hợp ngay khi ứng dụng cần, thay vì phụ thuộc vào các nhóm node được định nghĩa trước (node groups). Điều này làm cho Karpenter đặc biệt hiệu quả trong các môi trường đám mây hiện đại, nơi tính linh hoạt và tối ưu chi phí là ưu tiên hàng đầu.
Karpenter hoạt động như thế nào?
Karpenter được tích hợp chặt chẽ với Kubernetes và hoạt động dựa trên một số bước chính:
Quan sát cụm Kubernetes: Karpenter liên tục theo dõi các pod trong cụm. Khi phát hiện các pod không thể lên lịch (unschedulable) do thiếu tài nguyên (CPU, bộ nhớ, GPU, v.v.), nó sẽ kích hoạt quy trình mở rộng.
Đánh giá nhu cầu tài nguyên: Thay vì chỉ đơn giản thêm một node giống như các node hiện có, Karpenter phân tích yêu cầu tài nguyên của tất cả các pod đang chờ và đưa ra quyết định thông minh về loại node cần tạo.
Cung cấp node: Karpenter giao tiếp trực tiếp với API của nhà cung cấp đám mây (hiện chủ yếu là AWS EC2) để khởi tạo các node mới. Nó có thể chọn từ hàng trăm loại instance khác nhau, bao gồm cả spot instances (instance giá rẻ có thể bị thu hồi), nhằm tối ưu hóa chi phí.
Gắn kết pod với node: Sau khi node được tạo, Karpenter tự động gắn các pod đang chờ vào node đó mà không cần đợi Kubernetes scheduler can thiệp, giúp giảm độ trễ đáng kể.
Tối ưu hóa và thu hồi: Khi nhu cầu giảm, Karpenter tìm kiếm các node không còn được sử dụng đầy đủ, di dời pod sang các node khác nếu cần, và sau đó xóa bỏ các node dư thừa để tiết kiệm tài nguyên.
Điểm nổi bật trong cách hoạt động của Karpenter là nó không sử dụng khái niệm "node group" như Cluster Autoscaler. Thay vào đó, nó quản lý từng instance riêng lẻ, mang lại sự linh hoạt tối đa.
So sánh Karpenter với Cluster Autoscaler
Để hiểu rõ hơn về Karpenter, hãy so sánh nó với Cluster Autoscaler - công cụ tự động mở rộng truyền thống và phổ biến nhất trong Kubernetes:
Tiêu chí | Karpenter | Cluster Autoscaler |
Cách tiếp cận | Quản lý instance trực tiếp, không cần node group | Dựa trên Auto Scaling Groups (ASG) |
Tốc độ mở rộng | Rất nhanh (thường dưới 1 phút) | Chậm hơn (vài phút do phụ thuộc ASG) |
Tính linh hoạt | Hỗ trợ đa dạng instance types, không cần cấu hình trước | Giới hạn bởi cấu hình node group |
Tối ưu chi phí | Tốt hơn nhờ chọn instance phù hợp và spot instances | Ít linh hoạt, dễ dẫn đến lãng phí tài nguyên |
Độ phức tạp cài đặt | Đơn giản với Helm, nhưng cần cấu hình IAM | Phức tạp hơn, cần quản lý nhiều node group |
Hỗ trợ đa đám mây | Hiện chủ yếu cho AWS, đang phát triển thêm | Hỗ trợ nhiều nhà cung cấp đám mây |
Cluster Autoscaler từng là một bước tiến lớn khi ra mắt vào năm 2017, nhưng nó có những hạn chế: chậm mở rộng, phụ thuộc vào nhóm node cố định, và không tận dụng được sự đa dạng của các loại instance trên đám mây. Karpenter ra đời để giải quyết những vấn đề này, mang đến trải nghiệm hiện đại hơn và phù hợp với các workload động.
Lợi ích của Karpenter
Tốc độ vượt trội: Karpenter có thể khởi tạo node mới trong vòng 40 giây đến 1 phút, nhanh hơn nhiều so với Cluster Autoscaler.
Tối ưu chi phí: Bằng cách chọn đúng loại instance và tận dụng spot instances, Karpenter giúp giảm chi phí vận hành cụm Kubernetes.
Linh hoạt cao: Không cần định nghĩa trước node group, Karpenter tự động điều chỉnh dựa trên nhu cầu thực tế.
Tích hợp Kubernetes-native: Sử dụng Custom Resource Definitions (CRDs) như NodePool và NodeClass để cấu hình, rất thân thiện với người dùng Kubernetes.
Hỗ trợ workload đa dạng: Từ các tác vụ tính toán tăng tốc (GPU, Neuron) đến các ứng dụng thông thường, Karpenter đều xử lý tốt.
Hạn chế của Karpenter
Dù mạnh mẽ, Karpenter không phải không có nhược điểm:
Hỗ trợ đám mây hạn chế: Hiện tại, Karpenter chủ yếu hoạt động tốt trên AWS. Hỗ trợ cho các nhà cung cấp khác như GCP hay Azure vẫn đang trong quá trình phát triển.
Yêu cầu cấu hình ban đầu: Việc cài đặt đòi hỏi thiết lập IAM roles và chính sách phù hợp, có thể phức tạp với người mới.
Không thay thế hoàn toàn HPA: Karpenter tập trung vào mở rộng node, không thay thế Horizontal Pod Autoscaler (HPA) để điều chỉnh số lượng pod.
Khi nào nên sử dụng Karpenter?
Karpenter là lựa chọn lý tưởng nếu:
Bạn đang chạy cụm Kubernetes trên AWS (EKS).
Bạn cần tốc độ mở rộng nhanh và tối ưu chi phí.
Workload của bạn thay đổi thường xuyên và yêu cầu nhiều loại tài nguyên khác nhau.
Bạn muốn giảm thiểu công việc quản lý thủ công liên quan đến node group.
Nếu bạn sử dụng nhiều nhà cung cấp đám mây hoặc cần một giải pháp đã được kiểm chứng qua thời gian dài, Cluster Autoscaler vẫn là một lựa chọn đáng cân nhắc.
Cách bắt đầu với Karpenter
Để cài đặt Karpenter trên cụm Kubernetes (ví dụ: EKS), bạn có thể làm theo các bước cơ bản sau:
Chuẩn bị cụm: Đảm bảo cụm của bạn có sẵn tài nguyên tính toán cơ bản.
Tạo IAM Roles: Cấu hình các quyền cần thiết để Karpenter tương tác với AWS EC2.
Cài đặt qua Helm: Sử dụng Helm chart chính thức từ kho lưu trữ Karpenter để triển khai.
Cấu hình Provisioner: Tạo một Provisioner CRD để định nghĩa cách Karpenter chọn instance và quản lý node.
Bạn có thể tham khảo tài liệu chính thức tại karpenter.sh để biết thêm chi tiết.
Cài đặt Karpenter trên Kubernetes
a. Yêu cầu hệ thống
Kubernetes phiên bản 1.19 trở lên.
Có quyền quản trị trên AWS IAM (nếu chạy trên AWS).
Sử dụng
kubectl
để quản lý cluster.
b. Cài đặt Karpenter
kubectl apply -f https://raw.githubusercontent.com/aws/karpenter/main/releases/latest/karpenter.yaml
c. Tạo Karpenter Provisioner
apiVersion: karpenter.k8s.aws/v1alpha5
kind: Provisioner
metadata:
name: default
spec:
requirements:
- key: "node.kubernetes.io/instance-type"
operator: In
values: ["t3.medium", "t3.large"]
- key: "topology.kubernetes.io/zone"
operator: In
values: ["us-west-2a", "us-west-2b"]
limits:
resources:
cpu: "1000"
provider:
subnetSelector:
karpenter.sh/discovery: "my-cluster"
ttlSecondsAfterEmpty: 30
Sau khi áp dụng file YAML trên, Karpenter sẽ tự động tạo node mới khi cần thiết và xóa node không dùng đến.
Quy tắc chọn node (requirements)
requirements: Quy định tiêu chí node được tạo ra:
Loại instance (
instance-type
): Chỉ cho phépt3.medium
vàt3.large
.Vùng khả dụng (
zone
): Chỉ sử dụngus-west-2a
vàus-west-2b
.
\=> Khi có pod cần tài nguyên, Karpenter chỉ tạo node với các loại instance và vùng khả dụng này.
Giới hạn tài nguyên (limits)
Giới hạn tổng tài nguyên CPU của các node do Provisioner này tạo ra là 1000 vCPU.
Nếu tổng số CPU của các node đạt mức này, Karpenter sẽ không tạo thêm node mới.
Cấu hình provider
subnetSelector: Chỉ định các subnet trong AWS nơi node sẽ được tạo ra.
karpenter.sh/discovery: "my-cluster": Karpenter sẽ tìm các subnet có tag
karpenter.sh/discovery=my-cluster
để đặt node.
\=> Điều này giúp đảm bảo node được tạo đúng trong subnet của Kubernetes cluster.
Xóa node không sử dụng (TTL - Time To Live)
- Nếu một node không có workload nào chạy trong 30 giây, Karpenter sẽ tự động xóa node đó để tiết kiệm tài nguyên
Kết luận
Karpenter đại diện cho thế hệ tiếp theo của công cụ tự động mở rộng Kubernetes, mang lại tốc độ, sự linh hoạt và hiệu quả chi phí mà các giải pháp truyền thống như Cluster Autoscaler khó sánh kịp. Dù vẫn còn một số hạn chế, sự phát triển mạnh mẽ của cộng đồng mã nguồn mở và cam kết từ AWS cho thấy Karpenter sẽ ngày càng hoàn thiện và mở rộng hỗ trợ trong tương lai
Subscribe to my newsletter
Read articles from Kilo directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by
