Cài đặt Crossplane và Cluster Controller Runtime
Để bắt đầu quản lý hạ tầng như code, chúng ta cần triển khai Crossplane vào Kubernetes cluster. Crossplane hoạt động như một control plane mở rộng, cho phép bạn khai báo tài nguyên cloud (RDS, S3, VPC) bằng các Custom Resource (CR) chuẩn Kubernetes.
Chúng ta sẽ sử dụng Helm để cài đặt Crossplane core và Crossplane Runtime (CCP). Việc này thiết lập các controller cần thiết để đồng bộ trạng thái giữa Kubernetes và Cloud Provider.
Trước tiên, thêm repository Helm chính thức của Crossplane để đảm bảo phiên bản mới nhất và ổn định.
helm repo add crossplane https://charts.crossplane.io/stable
helm repo update
Kết quả mong đợi: Bạn thấy thông báo "repository 'crossplane' added" và danh sách các chart có sẵn được cập nhật.
Tiếp theo, cài đặt Crossplane core vào namespace 'crossplane-system'. Nếu namespace chưa tồn tại, Helm sẽ tự động tạo.
helm install crossplane crossplane/crossplane \
--namespace crossplane-system \
--create-namespace \
--version 1.14.0 \
--wait
Kết quả mong đợi: Pod 'crossplane' trong namespace crossplane-system chuyển sang trạng thái 'Running' sau vài phút.
Cài đặt Cluster Controller Runtime (CCP) để hỗ trợ các tài nguyên cấp Cluster (như ClusterClaim) và quản lý các Provider.
helm install crossplane-runtime crossplane/crossplane-runtime \
--namespace crossplane-system \
--create-namespace \
--version 1.14.0 \
--wait
Kết quả mong đợi: Các pod 'cluster-controller-runtime' xuất hiện và chạy ổn định trong namespace crossplane-system.
Verify cài đặt Crossplane
Để xác nhận Crossplane đã hoạt động, kiểm tra trạng thái của các Pod và Custom Resource Definition (CRD) đã được đăng ký.
kubectl get pods -n crossplane-system
kubectl get crd | grep crossplane
Kết quả mong đợi: Tất cả pod trong namespace crossplane-system đều ở trạng thái 'Running' và danh sách CRD xuất hiện các tài nguyên như 'providers', 'composition', 'compositeresourceclaim'.
Cấu hình Provider cho Cloud Provider cụ thể
Crossplane không thể tự động biết cách tạo tài nguyên AWS, GCP hay Azure. Chúng ta cần cài đặt "Provider" - các module mở rộng cho phép Crossplane giao tiếp với API của Cloud Provider cụ thể. Ở đây, ví dụ sẽ tập trung vào AWS vì tính phổ biến, nhưng quy trình tương tự cho GCP hoặc Azure.
Trước khi tạo Provider, hãy đảm bảo bạn đã cấu hình AWS Credentials (Secret) trong Kubernetes. Crossplane sẽ dùng secret này để xác thực với AWS API.
kubectl create secret generic aws-creds \
--namespace crossplane-system \
--from-literal=aws_access_key_id=YOUR_ACCESS_KEY_ID \
--from-literal=aws_secret_access_key=YOUR_SECRET_ACCESS_KEY \
--from-literal=region=us-east-1
Kết quả mong đợi: Secret 'aws-creds' được tạo thành công trong namespace crossplane-system. Bạn có thể kiểm tra bằng lệnh `kubectl get secret aws-creds -n crossplane-system`.
Tạo tài nguyên Provider cho AWS để Crossplane tải và khởi chạy các controller tương ứng.
cat
Kết quả mong đợi: Resource 'Provider' được tạo và trạng thái 'INSTALLED' xuất hiện sau vài phút khi container kéo ảnh Docker từ registry.
Cấu hình ProviderConfig để liên kết Provider vừa cài đặt với Secret credentials đã tạo ở trên. Đây là bước quan trọng để Crossplane biết dùng key nào để tạo tài nguyên.
cat
Kết quả mong đợi: ProviderConfig 'default' được tạo và trạng thái 'READY' hiện ra, xác nhận Crossplane đã xác thực thành công với AWS.
Verify Provider đã sẵn sàng
Check trạng thái của Provider và ProviderConfig để đảm bảo mọi thứ đã kết nối.
kubectl get provider
kubectl get providerconfig.aws.upbound.io
Kết quả mong đợi: Provider 'provider-aws' có trạng thái 'INSTALLED' và ProviderConfig 'default' có trạng thái 'READY'.
Tạo và cấu hình Composition để định nghĩa template tài nguyên
Composition là cơ chế cốt lõi của Crossplane để đơn giản hóa trải nghiệm phát triển. Thay vì yêu cầu developer viết hàng trăm dòng YAML cho một RDS, Composition cho phép bạn định nghĩa một "template" duy nhất. Khi developer tạo một Composite Resource Claim (XRC), Composition sẽ tự động mở rộng (compose) thành các Managed Resource (MR) cụ thể (như RDS, SecurityGroup, Subnet).
Chúng ta sẽ tạo một Composition để định nghĩa một "DatabasePostgres" đơn giản, bao gồm một RDS instance và một Security Group cho phép truy cập từ internal VPC.
Tạo file định nghĩa Composition. File này sẽ được lưu tại đường dẫn `/etc/crossplane/compositions/database-postgres.yaml` trong môi trường thực tế, ở đây chúng ta apply trực tiếp vào cluster.
cat
Kết quả mong đợi: Composition 'database-postgres-rds' được tạo thành công. Crossplane sẽ lưu trữ template này để sử dụng khi có yêu cầu tạo DatabasePostgres.
Để Composition hoạt động, chúng ta cũng cần định nghĩa Composite Resource Definition (XRD) để tạo loại tài nguyên tùy chỉnh 'DatabasePostgres' mà developer sẽ thấy.
cat
Kết quả mong đợi: XRD 'databasepostgreses.db.example.com' được tạo. Giờ đây, bạn có thể tạo tài nguyên loại DatabasePostgres trong cluster.
Verify Composition đã sẵn sàng
Kiểm tra xem Composition và XRD đã được tạo chưa.
kubectl get composition
kubectl get xrdb
Kết quả mong đợi: Composition 'database-postgres-rds' xuất hiện trong danh sách và XRD 'databasepostgreses.db.example.com' có trạng thái 'Established'.
Kiểm tra hoạt động của Composition bằng cách tạo Composite Resource
Bây giờ, hãy đóng vai trò là một developer. Bạn không cần biết về RDS hay Security Group. Bạn chỉ cần tạo một Composite Resource Claim (XRC) yêu cầu một "DatabasePostgres" với các thông số cơ bản. Crossplane sẽ tự động gọi Composition để tạo các tài nguyên thực tế.
Tạo một DatabasePostgresClaim trong namespace 'default' (hoặc namespace của project). Lưu ý: Composition đã định nghĩa sẵn các giá trị mặc định (như instanceClass, password) nên developer chỉ cần khai báo những gì thay đổi.
cat
Kết quả mong đợi: Resource 'DatabasePostgresClaim' được tạo với trạng thái 'Reconciling' hoặc 'Ready' sau vài phút.
Theo dõi quá trình Crossplane tạo Composite Resource (XR) từ Claim và sau đó tạo các Managed Resource (MR) như RDS DBInstance.
kubectl get claim my-app-db -n default -o yaml
kubectl get dbinstance -n crossplane-system
kubectl get secret my-app-db-creds -n default -o yaml
Kết quả mong đợi:
- Claim 'my-app-db' có trạng thái 'Ready' và 'Connected'.
- Composite Resource (XR) loại 'DatabasePostgres' được tạo tự động trong namespace 'crossplane-system' (hoặc namespace claim tùy cấu hình).
- Managed Resource 'DBInstance' và 'SecurityGroup' xuất hiện với trạng thái 'Ready'.
- Secret 'my-app-db-creds' được tạo trong namespace 'default' chứa host, port, username, password của DB.
Kiểm tra chi tiết trạng thái của DBInstance để xác nhận thông số đã được áp dụng đúng từ Composition (ví dụ: instanceClass là db.t3.small thay vì default).
kubectl get dbinstance -n crossplane-system -o jsonpath='{.items[0].spec.forProvider.dbInstanceClass}'
kubectl get dbinstance -n crossplane-system -o jsonpath='{.items[0].status.atProvider.instanceStatus}'
Kết quả mong đợi: Output trả về 'db.t3.small' và trạng thái instance là 'available' (hoặc 'modifying' nếu đang chạy).
Để hoàn tất kiểm tra, xác minh rằng ứng dụng có thể kết nối vào DB bằng cách dùng secret đã tạo (trong thực tế, ứng dụng sẽ mount secret này).
kubectl get secret my-app-db-creds -n default -o jsonpath='{.data.host}' | base64 --decode
Kết quả mong đợi: Trả về địa chỉ endpoint của RDS (ví dụ: 'my-app-db-xxxxxx.us-east-1.rds.amazonaws.com').
Điều hướng series:
Mục lục: Series: Series: Xây dựng nền tảng Internal Developer Platform (IDP) với Backstage, Crossplane và GitOps trên Kubernetes để tối ưu trải nghiệm phát triển phần mềm
« Phần 2: Triển khai Backstage và cấu hình Core
Phần 4: Xây dựng quy trình GitOps với ArgoCD »