Quản lý tài nguyên trên AWS thông qua Kubernetes? - AWS Controller Kubernetes
AWS Controller Kubernetes là gì?
AWS Controller for Kubernetes (ACK) là một công cụ quan trọng trong hệ sinh thái của Amazon Web Services (AWS), được thiết kế để cung cấp tích hợp mạnh mẽ giữa Kubernetes và các dịch vụ AWS. Với ACK, người dùng có thể quản lý tài nguyên đám mây của AWS, như S3 buckets, DynamoDB tables, và nhiều dịch vụ khác, trực tiếp từ các định nghĩa Kubernetes Manifest thông qua Custom Resource Definitions (CRDs). Điều này giúp giảm thiểu sự phân tán của công việc quản lý và tăng tính nhất quán trong việc triển khai và vận hành ứng dụng trên Kubernetes và AWS.
Controller trong Kubernetes là gì?
ACK được cài đặt trên Kubernetes cluster và hoạt động như một Kubernetes Controller, vậy nên trước khi tìm hiểu về ACK thì chúng ta nên có hiểu biết cơ bản về Kubernetes Controller làm công việc gì. Mặc định khi cài đặt K8s cluster ta sẽ có các controller như deployment controller, statefulset controller,...
Kubernetes controller hoạt động dựa trên một vòng lặp điều khiển (control loop). Trong vòng lặp này, có ba bước chính: Quan sát (Observe), Phân tích (Analyze), và Hành động (Act).
-
Quan sát (Observe): Controller đầu tiên quan sát trạng thái hiện tại (Actual State) của hệ thống. Nó lấy thông tin từ cluster Kubernetes để hiểu rõ các thành phần như pod, service, và node đang hoạt động như thế nào.
-
Phân tích (Analyze): Sau khi thu thập thông tin, controller phân tích trạng thái hiện tại và so sánh với trạng thái mong muốn (Desired State). Trạng thái mong muốn được định nghĩa trong các tệp khai báo của Kubernetes (YAML/JSON).
-
Hành động (Act): Nếu phát hiện sự khác biệt giữa trạng thái hiện tại và trạng thái mong muốn, controller sẽ thực hiện các hành động cần thiết để đưa hệ thống về trạng thái mong muốn. Các hành động này có thể bao gồm việc tạo, cập nhật, hoặc xóa các đối tượng Kubernetes như pod, deployment, service, v.v.
Vòng lặp này diễn ra liên tục, đảm bảo rằng hệ thống luôn ở trong trạng thái mong muốn, ngay cả khi có sự thay đổi hoặc sự cố xảy ra.
Ví dụ: Nếu bạn xóa 1 pod trong một deployment có 5 pod thì ngay lập tức controller sẽ tạo một pod mới để đảm bảo deployment đó luôn có đủ 5 pods.
ACK hoạt động thế nào?
Một quá trình triển khai tài nguyên trên AWS thông qua ACK sẽ có các bước như sau:
- Người dùng định nghĩa tài nguyên: Người dùng tạo ra một tệp định nghĩa tài nguyên Kubernetes (1), ví dụ như Custom Resource Definition (CRD), để mô tả các tài nguyên AWS cần tạo, chẳng hạn như một S3 bucket.
- Gửi yêu cầu tới K8s API server: Tệp định nghĩa tài nguyên được gửi tới kube-apiserver (2) trong Kubernetes Cluster.
- Kube-apiserver lưu trữ định nghĩa: Kube-apiserver sẽ lưu trữ thông tin định nghĩa tài nguyên này trong etcd (3), database của K8s.
- K8s xác nhận resource được tạo: Thông tin CRD được tạo được gửi về cho user.
- ACK-S3-Controller nhận thông tin: ACK-S3-Controller trên worker node (5) nhận thông tin về định nghĩa tài nguyên từ kube-apiserver.
- ACK-S3-Controller tạo tài nguyên trên AWS: ACK-S3-Controller tương tác với các dịch vụ AWS (6) để tạo tài nguyên đã định nghĩa, như là một S3 bucket trong ví dụ này.
- Cập nhật trạng thái tài nguyên: ACK-S3-Controller sau đó cập nhật trạng thái của tài nguyên trên Kubernetes để phản ánh những thay đổi và trạng thái hiện tại của tài nguyên trên AWS (7).
Cài đặt ACK thế nào?
Trong tài liệu chính thức của ACK cũng đã giới thiệu rất chi tiết các để cài đặt ACK controller nên mình sẽ không đi chi tiết mà chỉ nói khái quát các bước giúp các bạn có cái hình dung nhanh chóng các thức cài đặt và cấp quyền cho controller giúp ACK có thể tương tác được với AWS API
- Bước 1: Bạn có thể cài đặt ACK lên bất cứ cụm K8s nào bằng Helm hoặc manifest files, tuy nhiên khi sử dụng EKS thì việc xác thực sẽ dễ dàng hơn.
- Bước 2: Tạo OIDC cho cluster của bạn dùng để xác thực
- Bước 3: Tạo IAM Role và cung cấp quyền tương ứng cho role này phục vụ việc tạo tài nguyên trên AWS.
- Bước 4: Cho phép service account trên EKS sử dụng IAM Role này và tiến hành restart ACK controller để nhận quyền mới.
Lab thử tạo AWS resource
Trong phần lab này mình sẽ hướng dẫn các bạn tạo thử 1 database trên AWS RDS. Để thực hiện được phần này các bạn cần:
- Đã cài đặt ACK RDS Controller thành công
- Đã cấp quyền đầy đủ cho Service account mà ACK RDS Controller đang sử dụng
Tạo file manifest rds.yaml
định nghĩa database có nội dung như sau:
# Secret
apiVersion: v1
kind: Secret
metadata:
name: mydb-secret
namespace: default
type: Opaque
data:
password: bXktc2VjdXJlLXBhc3N3b3Jk # pass: my-secure-password
---
apiVersion: rds.services.k8s.aws/v1alpha1
kind: DBInstance
metadata:
name: ack-rds
namespace: default
spec:
allocatedStorage: 20
autoMinorVersionUpgrade: true
backupRetentionPeriod: 1
backupTarget: region
dbInstanceClass: db.t4g.micro
dbInstanceIdentifier: ack-rds
deletionProtection: false
engine: mysql
engineVersion: 8.0.35
masterUserPassword:
key: password
name: mydb-secret
namespace: default
masterUsername: admin
multiAZ: false
networkType: IPV4
storageType: gp2
Sau khi apply file này ta sẽ có resource DBInstance được tạo trong cụm K8s tại namespace default.
Trên AWS Console ta cũng thấy được database đã được tạo với cấu hình đã định nghĩa trong file manifest
Để xem trạng thái và logs việc tạo resource này trong trường hợp gặp lỗi bạn có thể describe CRD và chú ý đến phần Status trong resource, hoặc ngoài ra bạn có thể xem log của pod controller.
Như vậy là ta đã thực hiện sử dụng công cụ ACK để tạo được resource trên K8s, cũng khá đơn giản đúng không 😁
Ưu / Nhược điểm công cụ ACK
Ưu điểm
- Công cụ ACK có thể sử dụng như mô hình GitOps bằng cách tích hợp với Helm và ArgoCD để tự động hóa quá trình cập nhật infra.
- Hỗ trợ cơ chế giúp đảm bảo hạ tầng luôn giống với trạng thái được định nghĩa trong code. (Tính năng của K8s Controller)
- Theo mình thấy công việc định nghĩa Infra nếu so sánh với Terraform thì sẽ nhẹ nhàng hơn do có thể sử dụng Helm để đóng gói.
Nhược điểm
- Nhiều controller có version API beta hoặc Alpha nên có thể chưa ổn định hoặc chưa hỗ trợ đầy đủ cấu hình
- Mỗi loại tài nguyên muốn tạo trên AWS sẽ yêu cầu một controller riêng biệt để quản lý. Việc này có thể gây tốn tài nguyên và công sức quản lý tất cả controller trong hệ thống.
- Nhiều tài nguyên chưa được hỗ trợ, thời gian phát triển cũng khá chậm. 🥶
Kết
Bài viết này được viết sau khi mình nghiên cứu về công cụ này trong tầm 1 tuần nên không khỏi có những thiếu sót. Nếu các bạn có câu hỏi gì thì đừng ngần ngại comment ở dưới nhé.
Cám ơn các bạn đã đọc đến đây. Nếu thấy bài viết đem lại giá trị cho bạn thì hãy cho mình 1 Upvote nhé! Have a nice day! 👋🏻
All rights reserved