Xây dựng Developer Platform Doanh nghiệp với Backstage, Score và Crossplane
Xây dựng Platform Tự Phục Vụ Hạ Tầng Đa Đám Mây với Backstage, Score và Crossplane
Khi các doanh nghiệp mở rộng quy mô hạ tầng trên AWS, GCP và Azure, gánh nặng nhận thức (cognitive load) của lập trình viên đã đạt mức báo động. Kỹ sư phát triển phần mềm thường xuyên phải tự thao tác trên các Console của nhà cung cấp cloud, viết các mẫu Infrastructure-as-Code (IaC) phức tạp (Terraform/Pulumi) và chỉnh sửa tệp YAML Kubernetes thô chỉ để triển khai một microservice. Sự phân mảnh này tạo ra nghẽn cổ chai trong vận hành, gây rủi ro về tuân thủ an ninh và tạo ra Shadow IT.
Để giải quyết bài toán này, các tổ chức DevOps tiên tiến đang áp dụng giải pháp Internal Developer Platform (IDP). Bài viết này trình bày kiến trúc chuẩn doanh nghiệp kết hợp bộ ba công cụ mã nguồn mở: Backstage (Developer Portal & Service Catalog), Score (Khung tả đặc tả Workload không phụ thuộc môi trường) và Crossplane (Control Plane hạ tầng mã nguồn mở native cho Kubernetes).
Kiến trúc Bộ Ba IDP Hiện Đại
Một hệ thống IDP doanh nghiệp phải đảm bảo sự phân tách trách nhiệm rõ ràng giữa Đội ngũ Platform (người thiết kế abstraction hạ tầng và thiết lập các khung bảo mật) và Đội ngũ Phát triển Phần mềm (người tiêu thụ tài nguyên và triển khai ứng dụng).
- Backstage (Giao diện tập trung): Cung cấp cổng thông tin tập trung cho lập trình viên, tự động hóa khởi tạo dịch vụ (Software Templates), quản lý Catalog và theo dõi chỉ số khả năng quan sát (Observability).
- Score (Tầng trừu tượng hóa Workload): Cung cấp định dạng cấu hình mã nguồn mở (
score.yaml) giúp lập trình viên khai báo yêu cầu ứng dụng (containers, biến môi trường, tài nguyên phụ thuộc như database hay queue) hoàn toàn độc lập với môi trường triển khai thực tế. - Crossplane (Universal Control Plane): Mở rộng Custom Resource Definitions (CRDs) của Kubernetes để quản trị và khởi tạo hạ tầng multi-cloud trực tiếp qua Kubernetes API, thay thế các pipeline IaC bất đồng bộ truyền thống bằng vòng lặp tự điều chỉnh (continuous reconciliation).
Luồng hoạt động kiến trúc như sau:
+-----------------------------------------------------------------------------------+
| MIỀN LẬP TRÌNH VIÊN (DEVELOPER) |
| +------------------------+ +------------------------------+ |
| | Backstage Portal | --- (Tạo mẫu) ---> | Git Repo (code + score.yaml) | |
| | (Catalog & Scaffolder)| +------------------------------+ |
| +------------------------+ | |
+----------------------------------------------------------------|------------------+
| Git Push / CI
v
+-----------------------------------------------------------------------------------+
| MIỀN NỀN TẢNG (PLATFORM) |
| +------------------------+ +------------------------------+ |
| | score-k8s / Translator| -- (Chuyển đổi) -> | Crossplane Claims & K8s Spec | |
| +------------------------+ +------------------------------+ |
| | |
| ArgoCD / GitOps |
| v |
| +-----------------------------------------------------------------------------+ |
| | Kubernetes Platform Cluster | |
| | +--------------------+ +----------------------------+ | |
| | | Application Pods | | Crossplane Control Plane | | |
| | +--------------------+ +----------------------------+ | |
| +-----------------------------------------------------------|-----------------+ |
+--------------------------------------------------------------|--------------------+
| API Reconciliation
v
+----------------------------------------------------+
| Hạ Tầng Đa Đám Mây (AWS RDS, GCP CloudSQL, v.v.) |
+----------------------------------------------------+1. Crossplane: Trừu Tượng Hóa Hạ Tầng Với Composition
Các kỹ sư platform sẽ định nghĩa các khối hạ tầng tái sử dụng và tuân thủ chính sách doanh nghiệp bằng cách sử dụng Crossplane Composite Resource Definition (XRD) và Composition. Dưới đây là ví dụ về XRD định nghĩa một PostgreSQL Database chung mà không lộ thông tin nền tảng bên dưới là AWS RDS hay GCP CloudSQL.
# definition.yaml: Định nghĩa CompositeResourceDefinition (XRD)
apiVersion: apiextensions.crossplane.io/v1
kind: CompositeResourceDefinition
metadata:
name: xpostgresinstances.platform.enterprise.io
spec:
group: platform.enterprise.io
names:
kind: XPostgresInstance
plural: xpostgresinstances
claimNames:
kind: PostgresInstance
plural: postgresinstances
versions:
- name: v1alpha1
served: true
referenceable: true
schema:
openAPIV3Schema:
type: object
properties:
spec:
type: object
properties:
storageGB:
type: integer
default: 20
engineVersion:
type: string
default: "15"
required:
- storageGBSau đó, Đội ngũ Platform sẽ liên kết XRD này với tài nguyên chi tiết trên AWS thông qua Crossplane Composition:
# composition-aws.yaml: Composition thực thi trên AWS RDS
apiVersion: apiextensions.crossplane.io/v1
kind: Composition
metadata:
name: xpostgresinstance.aws.rds
labels:
provider: aws
db: postgresql
spec:
compositeTypeRef:
apiVersion: platform.enterprise.io/v1alpha1
kind: XPostgresInstance
resources:
- name: rds-instance
base:
apiVersion: database.aws.upbound.io/v1beta1
kind: Instance
spec:
forProvider:
region: us-east-1
dbSubnetGroupName: enterprise-vpc-subnets
engine: postgres
instanceClass: db.t4g.medium
allocatedStorage: 20
skipFinalSnapshot: true
publiclyAccessible: false
patches:
- type: FromCompositeFieldPath
fromFieldPath: spec.storageGB
toFieldPath: spec.forProvider.allocatedStorage
- type: FromCompositeFieldPath
fromFieldPath: spec.engineVersion
toFieldPath: spec.forProvider.engine2. Score: Chuẩn Hóa Khai Báo Cấu Hình Ứng Dụng
Thay vì bắt lập trình viên tự viết tệp Kubernetes Deployment, Service, và Resource Claim phức tạp, lập trình viên chỉ cần khai báo nhu cầu dịch vụ thông qua tệp score.yaml.
# score.yaml: Đặt tả Workload của Lập trình viên
apiVersion: score.dev/v1b1
metadata:
name: payment-service
containers:
web:
image: 123456789.dkr.ecr.us-east-1.amazonaws.com/payment-service:v2.4.1
variables:
PORT: "8080"
DB_HOST: "${resources.db.host}"
DB_NAME: "${resources.db.name}"
DB_USER: "${resources.db.username}"
DB_PASSWORD: "${resources.db.password}"
resources:
db:
type: postgres
properties:
host: metadata.name
name: metadata.database
username: status.username
password: status.passwordTrong quá trình chạy CI/CD pipeline, công cụ CLI score-k8s hoặc các bộ dịch Score tùy chỉnh sẽ tự động biên dịch tệp cấu hình này thành Kubernetes Manifests và Crossplane Resource Claim (PostgresInstance). Lập trình viên không cần biết hoặc lưu trữ thông tin credentials hay cấu hình RDS thô.
3. Backstage: Tích Hợp Software Catalog và Template Scaffolder
Backstage giữ vai trò là cổng giao tiếp chính với lập trình viên. Thông qua Backstage Software Templates, lập trình viên có thể tạo mới ứng dụng microservice đi kèm hạ tầng đám mây chỉ bằng vài cú nhấp chuột trên giao diện web.
Dưới đây là đoạn cấu hình Backstage Scaffolder Template sinh ra kho chứa mã nguồn microservice bao gồm mã nguồn cơ bản và tệp score.yaml chuẩn hóa:
# template.yaml: Backstage Software Template
apiVersion: backstage.io/v1alpha1
kind: Template
metadata:
name: golang-microservice-template
title: Go Microservice đi kèm Postgres DB
description: Tự động khởi tạo Go microservice và tích hợp sẵn Postgres DB qua Crossplane và Score spec.
spec:
owner: platform-team
type: service
parameters:
- title: Cấu hình dịch vụ
required:
- serviceName
- dbStorageSize
properties:
serviceName:
title: Tên Dịch Vụ
type: string
default: order-processing
dbStorageSize:
title: Dung lượng DB (GB)
type: integer
default: 50
steps:
- id: fetch-base
name: Tải Mã Nguồn Mẫu
action: fetch:template
url: ./template
values:
serviceName: ${{ parameters.serviceName }}
dbStorageSize: ${{ parameters.dbStorageSize }}
- id: publish-git
name: Đẩy lên GitHub
action: publish:github
input:
allowedOwners: ['enterprise-org']
repoUrl: 'github.com?repo=' + parameters.serviceName + '&owner=enterprise-org'
- id: register-catalog
name: Đăng ký Component vào Backstage
action: catalog:register
input:
catalogInfoUrl: 'https://github.com/enterprise-org/' + parameters.serviceName + '/blob/main/catalog-info.yaml'Quản Trị Doanh Nghiệp, Kiểm Soát Tuân Thủ Và GitOps
Một hệ thống IDP vững chắc đòi hỏi cơ chế kiểm tra chính xác ở runtime và khả năng chống trôi cấu hình (drift detection) triệt để. Bằng việc kết hợp ArgoCD và Open Policy Agent (OPA) / Kyverno, đội ngũ platform có thể đảm bảo tuân thủ quy định trên toàn bộ hệ thống:
- Kiểm soát chính sách tại API Layer: Các chính sách Kyverno thực thi quét các Crossplane Composite Resources (XRs) để đảm bảo các tag bắt buộc (như
cost-center,owner) luôn tồn tại và giới hạn dung lượng tài nguyên khởi tạo. - Tự động đồng bộ khi trôi cấu hình: Crossplane liên tục so sánh trạng thái thực tế trên Cloud với trạng thái khai báo trong Kubernetes API, tự động khôi phục cấu hình về chuẩn nếu có bất kỳ thay đổi trái phép nào trên AWS hay GCP Console.
- Bảo mật thông tin quản trị Secret: Các secret do Crossplane tạo ra (chẳng hạn như mật khẩu RDS) được đẩy trực tiếp vào HashiCorp Vault hoặc Kubernetes Secret, sau đó tự động inject vào môi trường Pod của ứng dụng thông qua bộ giải mã của Score.
Kết Luận
Sự kết hợp giữa Backstage, Score, và Crossplane mang lại một nền tảng Internal Developer Platform có tốc độ triển khai cao và độ an toàn tuyệt đối. Backstage loại bỏ sự phân mảnh về cổng thông tin, Score bảo vệ lập trình viên khỏi sự phức tạp của Kubernetes YAML, và Crossplane biến Kubernetes thành một Universal Control Plane quản trị hạ tầng đa đám mây. Kiến trúc hiện đại này giúp đội ngũ phát triển chủ động tự phục vụ nhu cầu hạ tầng chỉ trong vài phút, đồng thời cho phép đội ngũ platform duy trì quyền kiểm soát an ninh, chi phí và sự tuân thủ trên toàn bộ quy mô doanh nghiệp.
