Khái niệm về Composite Resource và Composition trong Crossplane
Trong kiến trúc Crossplane, Composite Resource (XR - eXtended Resource) đóng vai trò là một tài nguyên trừu tượng cấp cao mà người dùng sẽ tương tác trực tiếp.
Khác với Managed Resource (MR) là tài nguyên cụ thể của một nhà cung cấp (như EC2 hay VM Proxmox), XR không ánh xạ 1-1 với một tài nguyên hạ tầng vật lý.
Composition là quy tắc logic giúp Crossplane tự động phân tích XR và tạo ra một tập hợp các Managed Resource tương ứng để thực thi yêu cầu đó.
Mục tiêu ở bước này là tạo ra một loại tài nguyên logic tên là AppServer, khi được tạo, hệ thống sẽ tự động quyết định triển khai VM trên Proxmox hoặc EC2 trên AWS dựa trên tham số cấu hình.
Định nghĩa Composite Resource Definition (XRD)
Bước đầu tiên là định nghĩa schema cho tài nguyên trừu tượng của chúng ta. Chúng ta sẽ tạo một XRD để mô tả các trường dữ liệu mà người dùng cần cung cấp.
File cấu hình này sẽ được lưu tại đường dẫn: /opt/crossplane/resources/appserver-xrd.yaml
Schema này bao gồm: provider (AWS hoặc Proxmox), cpu, memory, và image.
apiVersion: apiextensions.crossplane.io/v1
kind: CompositeResourceDefinition
metadata:
name: appservers.example.org
spec:
connectionDetails:
- name: privateIP
- name: publicIP
- name: username
- name: password
claimNames:
kind: AppServer
singular: appserver
plural: appservers
namespaced: false
group: example.org
versions:
- name: v1alpha1
served: true
storage: true
schema:
openAPIV3Schema:
type: object
properties:
spec:
type: object
properties:
provider:
type: string
enum:
- aws
- proxmox
description: "Nhà cung cấp hạ tầng mục tiêu"
cpu:
type: integer
description: "Số lượng CPU cores"
memory:
type: string
description: "Dung lượng RAM (ví dụ: 2Gi)"
image:
type: string
description: "Tên image hoặc template OS"
region:
type: string
description: "Region cho AWS hoặc Node cho Proxmox"
tags:
type: object
additionalProperties:
type: string
description: "Các tag để quản lý tài nguyên"
required:
- provider
- cpu
- memory
- image
required:
- spec
Sau khi áp dụng file này, Kubernetes sẽ tạo ra Custom Resource Definition (CRD) mới. Bạn có thể verify bằng lệnh:
kubectl get xrd appservers.example.org
Kết quả mong đợi là trạng thái Established và Ready của XRD.
Tạo Composition để tự động hóa phân phối Workload
Viết Composition YAML cho AWS và Proxmox
Composition đóng vai trò là "bản vẽ kỹ thuật". Nó chỉ cho Crossplane cách biến đổi một AppServer (XR) thành các EC2 (AWS) hoặc VM (Proxmox) (MR).
Chúng ta sẽ tạo một file Composition duy nhất chứa cả hai trường hợp, sử dụng Selector để quyết định logic dựa trên trường provider trong XR.
File cấu hình sẽ lưu tại: /opt/crossplane/resources/appserver-composition.yaml
apiVersion: apiextensions.crossplane.io/v1
kind: Composition
metadata:
name: appserver-v1alpha1
labels:
environment: dev
spec:
compositeTypeRef:
apiVersion: example.org/v1alpha1
kind: AppServer
data:
- source:
type: Inline
patches:
- fromFieldPath: spec.provider
toFieldPath: metadata.labels.provider
patchSets:
- name: compute-spec
patches:
- fromFieldPath: spec.cpu
toFieldPath: spec.resourceRequirements.cpu
- fromFieldPath: spec.memory
toFieldPath: spec.resourceRequirements.memory
- fromFieldPath: spec.image
toFieldPath: spec.image
resources:
- name: aws-ec2
base:
apiVersion: ec2.aws.crossplane.io/v1beta1
kind: Instance
metadata:
labels:
provider: aws
spec:
providerConfigRef: {}
forProvider:
ami: ""
instanceType: t3.micro
subnetId: ""
vpcId: ""
tags:
Name: ""
rootBlockDevice:
volumeSize: 10
connectionDetails:
- name: privateIP
fromSource: Observation
attributeName: PrivateIp
- name: publicIP
fromSource: Observation
attributeName: PublicIp
- name: username
fromSource: ConfigRef
namespace: crossplane-system
name: aws-ec2-creds
key: username
- name: password
fromSource: ConfigRef
namespace: crossplane-system
name: aws-ec2-creds
key: password
patches:
- fromFieldPath: metadata.name
toFieldPath: metadata.name
- fromFieldPath: spec.tags
toFieldPath: spec.forProvider.tags
- fromFieldPath: spec.image
toFieldPath: spec.forProvider.ami
- fromFieldPath: spec.region
toFieldPath: spec.forProvider.availabilityZone
- fromFieldPath: spec.cpu
toFieldPath: spec.forProvider.instanceType
transform:
type: Map
map:
"1": "t3.micro"
"2": "t3.small"
"4": "t3.medium"
- name: proxmox-vm
base:
apiVersion: proxmox.upbound.io/v1beta1
kind: VirtualMachine
metadata:
labels:
provider: proxmox
spec:
providerConfigRef: {}
forProvider:
name: ""
node: ""
cores: 1
memory: 2048
cloudInit:
enabled: true
type: "configdrive"
disk:
- size: "10G"
bus: "scsi"
cpu:
type: "host"
connectionDetails:
- name: privateIP
fromSource: Observation
attributeName: ip
- name: publicIP
fromSource: Observation
attributeName: ip
- name: username
fromSource: ConfigRef
namespace: crossplane-system
name: proxmox-creds
key: username
- name: password
fromSource: ConfigRef
namespace: crossplane-system
name: proxmox-creds
key: password
patches:
- fromFieldPath: metadata.name
toFieldPath: metadata.name
- fromFieldPath: metadata.name
toFieldPath: spec.forProvider.name
- fromFieldPath: spec.tags
toFieldPath: metadata.labels
- fromFieldPath: spec.region
toFieldPath: spec.forProvider.node
- fromFieldPath: spec.cpu
toFieldPath: spec.forProvider.cores
- fromFieldPath: spec.memory
toFieldPath: spec.forProvider.memory
transform:
type: Convert
convert:
to: "integer"
strategy:
trimUnit: true
readyWhen:
- path: status.atProvider.status
type: Equals
value: "running"
File Composition này sử dụng labels để Crossplane tự động lọc xem nên tạo AWS EC2 hay Proxmox VM dựa trên giá trị provider trong XR.
Apply file này vào cluster:
kubectl apply -f /opt/crossplane/resources/appserver-composition.yaml
Kết quả mong đợi: Crossplane sẽ tạo tài nguyên Composition và liên kết nó với XRD. Kiểm tra bằng lệnh:
kubectl get composition appserver-v1alpha1
Triển khai ứng dụng đơn giản qua Composite Resource
Tạo tài nguyên AppServer trên AWS
Bây giờ chúng ta sẽ đóng vai trò là người dùng (Developer hoặc Sysadmin). Bạn không cần biết chi tiết kỹ thuật về AWS hay Proxmox, chỉ cần khai báo yêu cầu.
Tạo file khai báo ứng dụng tại: /opt/crossplane/resources/appserver-aws.yaml
Trong file này, chúng ta yêu cầu một máy chủ với 2 CPU, 4GB RAM chạy Ubuntu trên AWS.
apiVersion: example.org/v1alpha1
kind: AppServer
metadata:
name: web-server-aws
spec:
provider: aws
cpu: 2
memory: "4Gi"
image: "ami-0abcdef1234567890"
region: "us-east-1"
tags:
Environment: "Production"
Project: "HybridDemo"
Apply tài nguyên này:
kubectl apply -f /opt/crossplane/resources/appserver-aws.yaml
Kết quả mong đợi: Crossplane sẽ tự động tạo một Instance loại EC2 trên AWS. Kiểm tra trạng thái:
kubectl get appserver web-server-aws
Hãy đợi khoảng 1-2 phút để trạng thái chuyển sang Ready và Reconciled.
Tạo tài nguyên AppServer trên Proxmox
Tiếp theo, chúng ta sẽ tạo một máy chủ tương tự nhưng chạy trên hạ tầng Proxmox local của bạn.
Tạo file khai báo tại: /opt/crossplane/resources/appserver-proxmox.yaml
Chú ý thay đổi provider thành proxmox và điều chỉnh region thành tên node Proxmox.
apiVersion: example.org/v1alpha1
kind: AppServer
metadata:
name: app-server-proxmox
spec:
provider: proxmox
cpu: 2
memory: "4Gi"
image: "ubuntu-22.04-cloudimg"
region: "pve-node-01"
tags:
Environment: "Staging"
Project: "HybridDemo"
Apply tài nguyên này:
kubectl apply -f /opt/crossplane/resources/appserver-proxmox.yaml
Kết quả mong đợi: Crossplane sẽ tự động tạo một VirtualMachine trên Proxmox. Kiểm tra trạng thái:
kubectl get appserver app-server-proxmox
Verify kết quả và thu thập thông tin kết nối
Để xác nhận cả hai máy chủ đã chạy và lấy thông tin kết nối (IP, user, pass), chúng ta sử dụng lệnh get secret do Crossplane tự động tạo.
Crossplane lưu thông tin kết nối trong Secret có prefix crossplane và tên tương ứng với AppServer.
kubectl get secret crossplane-web-server-aws -o yaml
kubectl get secret crossplane-app-server-proxmox -o yaml
Kết quả mong đợi: Bạn sẽ thấy các Secret chứa privateIP, publicIP, username và password của cả hai máy chủ. Đây là bằng chứng xác nhận Composition đã hoạt động đúng và trừu tượng hóa thành công hạ tầng Hybrid.
Để xem chi tiết quá trình reconcile (log hoạt động), hãy dùng lệnh:
kubectl describe appserver web-server-aws
kubectl describe appserver app-server-proxmox
Điều hướng series:
Mục lục: Series: Series: Xây dựng nền tảng Multi-Cloud Hybrid với Terraform, Crossplane và GitOps trên hạ tầng Proxmox và AWS
« Phần 4: Giới thiệu Crossplane: Cài đặt và tích hợp với Kubernetes
Phần 6: Triển khai GitOps với ArgoCD trên nền tảng Hybrid »