Quay lại danh sách
Tin tức công nghệ

Xây Dựng Enterprise IDP Với Backstage, Score và Crossplane Cho Hạ Tầng Đa Đám Mây

22 tháng 8, 2026

Xây Dựng Enterprise Internal Developer Platform Với Backstage, Score và Crossplane

Các tổ chức công nghệ hiện đại đang đối mặt với một nghịch lý lớn: mặc dù kiến trúc microservices và cloud APIs mang lại sự linh hoạt vượt trội, chúng lại tạo ra gánh nặng nhận thức (cognitive load) quá lớn cho các kỹ sư phần mềm. Lập trình viên liên tục phải quản lý các tệp YAML phức tạp của Kubernetes, chính sách IAM, Terraform modules, Helm charts và mạng đám mây chỉ để triển khai một dịch vụ đơn giản.

Để giải quyết bài toán này, các đội ngũ Platform Engineering xây dựng Internal Developer Platform (IDP). Giải pháp này giúp tách biệt ý định phát triển ứng dụng khỏi các cơ chế hạ tầng phức tạp. Bằng cách kết hợp Backstage (Developer Portal và Service Catalog), Score (chuẩn hóa mô tả workload), và Crossplane (Control Plane quản lý hạ tầng đa đám mây), doanh nghiệp có thể cung cấp dịch vụ hạ tầng tự phục vụ (Self-Service) chuẩn GitOps.

Tổng Quan Kiến Trúc Stack Công Nghệ

Kiến trúc lõi chia chia trải nghiệm lập trình viên và hạ tầng quản trị thành ba tầng tách biệt:

  • Tầng Portal (Backstage): Đóng vai trò là giao diện trung tâm, lưu trữ Software Catalog và khởi tạo dự án thông qua Software Templates.
  • Tầng Trừu Tượng Hóa (Score): Cung cấp tệp cấu hình score.yaml trung lập với môi trường cloud, cho phép lập trình viên khai báo nhu cầu hạ tầng mà không cần hiểu sâu về cloud API.
  • Tầng Control Plane (Crossplane & ArgoCD): Crossplane mở rộng Kubernetes thành một Control Plane toàn năng bằng Composite Resource Definitions (XRDs) để khởi tạo tài nguyên đám mây (AWS RDS, GCP CloudSQL, Azure Database), trong khi ArgoCD liên tục đồng bộ trạng thái mong muốn từ Git.
+---------------------------------------------------------------------------------+
|                               LẬP TRÌNH VIÊN (DEVELOPER)                        |
|                                                                                 |
|  +-------------------+        +-------------------+       +------------------+  |
|  |  Backstage UI     |  --->  |   score.yaml      | --->  | Git Repository   |  |
|  | (Software Template|        | (Intent-based Spec|       | (Declarative Repo|  |
|  +-------------------+        +-------------------+       +------------------+  |
+-----------------------------------------|---------------------------------------+
                                          | GitOps Sync (ArgoCD / Flux)
+-----------------------------------------v---------------------------------------+
|                            PLATFORM CONTROL PLANE                               |
|                                                                                 |
|  +---------------------------------------------------------------------------+  |
|  |                   Kubernetes Cluster (Control Plane)                      |  |
|  |                                                                           |  |
|  |  +------------------------+             +------------------------------+  |  |
|  |  | score-k8s / score-xp   |  -------->  | Crossplane Composite Resource|  |  |
|  |  | (Spec Transformer)     |             | (Ví dụ: XPostgreSQLInstance) |  |  |
|  |  +------------------------+             +------------------------------+  |  |
|  +--------------------------------------------------------|------------------+  |
+-----------------------------------------------------------|---------------------+
                                                            | Cloud Provider APIs
                                                            v
                                     +-----------------------------------------------+
                                     |  AWS RDS  |  GCP CloudSQL  |  Azure Postgres  |
                                     +-----------------------------------------------+

Bước 1: Khai Báo Nhu Cầu Hạ Tầng Với Score

Lập trình viên không nên phải viết hàng trăm dòng code Helm hay HCL để xin cấp một cơ sở dữ liệu. Với Score, họ chỉ cần mô tả những gì ứng dụng cần để chạy trong tệp spec chuẩn hóa.

Dưới đây là tệp score.yaml tiêu chuẩn doanh nghiệp khai báo một workload cần tài nguyên PostgreSQL:

apiVersion: score.dev/v1b1
metadata:
  name: payment-service
containers:
  app:
    image: 123456789012.dkr.ecr.us-east-1.amazonaws.com/finance/payment-service:v2.4.1
    variables:
      LOG_LEVEL: "info"
      DB_HOST: "${resources.db.host}"
      DB_PORT: "${resources.db.port}"
      DB_NAME: "${resources.db.name}"
    resources:
      requests:
        cpu: "500m"
        memory: "512Mi"
      limits:
        cpu: "2"
        memory: "2Gi"
resources:
  db:
    type: postgres
    class: production
    params:
      storageGb: 100
      engineVersion: "15.4"

Bước 2: Thiết Kế Crossplane Composite Resource Definition (XRD)

Platform team định nghĩa các mẫu tài nguyên hạ tầng trừu tượng thông qua Crossplane XRD. Dưới đây là tệp CompositeResourceDefinition cho một instance PostgreSQL (XPostgreSQLInstance):

apiVersion: apiextensions.crossplane.io/v1
kind: CompositeResourceDefinition
metadata:
  name: xpostgresqlinstances.platform.enterprise.io
spec:
  group: platform.enterprise.io
  names:
    kind: XPostgreSQLInstance
    plural: xpostgresqlinstances
  claimNames:
    kind: PostgreSQLInstance
    plural: postgresqlinstances
  versions:
  - name: v1alpha1
    served: true
    referenceable: true
    schema:
      openAPIV3Schema:
        type: object
        properties:
          spec:
            type: object
            properties:
              parameters:
                type: object
                properties:
                  storageGb:
                    type: integer
                    default: 20
                  engineVersion:
                    type: string
                    default: "15"
                  cloudProvider:
                    type: string
                    enum: ["aws", "gcp", "azure"]
                required:
                - storageGb
                - cloudProvider
            required:
            - parameters

Bước 3: Triển Khai Crossplane Compositions Cho Đa Đám Mây

Tiếp theo, đội ngũ Platform xây dựng Composition để ánh xạ Custom Resource sang các tài nguyên thực tế trên AWS (RDS Instance, Subnet Group, Security Group):

apiVersion: apiextensions.crossplane.io/v1
kind: Composition
metadata:
  name: aws-rds-postgres-production
  labels:
    provider: aws
    environment: production
spec:
  compositeTypeRef:
    apiVersion: platform.enterprise.io/v1alpha1
    kind: XPostgreSQLInstance
  resources:
  - name: rds-instance
    base:
      apiVersion: rds.aws.upbound.io/v1beta1
      kind: Instance
      spec:
        forProvider:
          region: us-east-1
          dbSubnetGroupName: enterprise-vpc-db-subnet
          vpcSecurityGroupIdRefs:
          - name: db-sec-group
          allocatedStorage: 20
          engine: postgres
          instanceClass: db.m6i.large
          publiclyAccessible: false
          skipFinalSnapshot: false
    patches:
    - type: FromCompositeFieldPath
      fromFieldPath: spec.parameters.storageGb
      toFieldPath: spec.forProvider.allocatedStorage
    - type: FromCompositeFieldPath
      fromFieldPath: spec.parameters.engineVersion
      toFieldPath: spec.forProvider.engineVersion

Bước 4: Tự Động Hóa Qua Backstage Software Templates

Để lập trình viên tương tác một cách dễ dàng nhất, Backstage sử dụng Software Templates để thu thập thông tin, tự động sinh mã nguồn chứa `score.yaml`, biến đổi thành Crossplane Claims và đẩy lên kho chứa Git.

apiVersion: backstage.io/v1alpha1
kind: Template
metadata:
  name: microservice-idp-template
  title: Enterprise Cloud-Native Service
  description: Tự động khởi tạo dịch vụ microservice và hạ tầng đa đám mây với Score và Crossplane.
spec:
  owner: platform-engineering
  type: service

  parameters:
    - title: Service Configuration
      required:
        - serviceName
        - cloudProvider
      properties:
        serviceName:
          title: Service Name
          type: string
          pattern: '^[a-z0-9-]+$'
        cloudProvider:
          title: Target Cloud Provider
          type: string
          enum:
            - aws
            - gcp
            - azure
          default: aws

  steps:
    - id: fetch-skeleton
      name: Render Base Code and Score Spec
      action: fetch:template
      input:
        url: ./skeleton
        values:
          serviceName: ${{ parameters.serviceName }}
          cloudProvider: ${{ parameters.cloudProvider }}

    - id: publish-git
      name: Publish to Git Provider
      action: publish:github
      input:
        allowedHosts: ['github.com']
        repoUrl: 'github.com?repo=${{ parameters.serviceName }}&owner=enterprise-org'

    - id: register-catalog
      name: Register in Backstage Catalog
      action: catalog:register
      input:
        repoContentsUrl: '${{ steps["publish-git"].output.repoContentsUrl }}'
        catalogInfoPath: '/catalog-info.yaml'

Quản Trị Hệ Thống Và Tuân Thủ Chính Sách (Governance & Compliance)

Mô hình Self-service nếu thiếu quản trị sẽ dẫn đến rủi ro chi phí và lỗ hổng bảo mật. Đối với nền tảng dựa trên Crossplane và Score, chính sách phải được thực thi ở hai cấp độ:

  1. Chính sách tĩnh ở quy trình CI (Shift-Left): Kiểm tra tính hợp lệ của `score.yaml` bằng `score-k8s validate` và OPA Conftest.
  2. Admission Control tại Runtime: Áp dụng các quy tắc Kyverno hoặc OPA Gatekeeper chặt chẽ trực tiếp trên các Crossplane Resource Claim trong Kubernetes cluster.

Nguyên tắc cốt lõi: Đội ngũ Platform tuyệt đối không cấp quyền trực tiếp cho ứng dụng tương tác với các CRD gốc của Provider (ví dụ: Upbound AWS Provider CRDs). Luôn bắt buộc đi qua tầng trung gian Composite Resource Definition (XRD).

Kết Luận

Sự kết hợp giữa Backstage, Score và Crossplane tạo ra sự phân định trách nhiệm rõ ràng cho kiến trúc IDP hiện đại. Lập trình viên đạt được sự chủ động tối đa thông qua các khai báo đơn giản, trong khi các kỹ sư Platform duy trì khả năng kiểm soát toàn diện về hạ tầng, bảo mật và tối ưu chi phí trên các đám mây AWS, GCP và Azure.