Đăng vào

Cài đặt và thiết lập Backstage trên Kubernetes với Argo CD

Gần đây, trong quá trình làm việc mình bắt đầu tham gia vào việc phát triển Internal Developer Portal (IDP), là một nền tảng tập trung giúp đơn giản hóa quy trình phát triển phần mềm trong nội bộ tổ chức, cung cấp cho developer các công cụ, tài nguyên và thông tin cần thiết để xây dựng, triển khai và vận hành ứng dụng một cách hiệu quả.

Với quan điểm tận dụng những giải pháp mã nguồn mở, nằm trong các dự án của CNCF minh đã chọn Backstage để xây dựng IDP phục vụ công việc cho dự án.

Sau đây mình sẽ giới thiệu cách deploy nó trên Kuberetes bằng Argo CD

Giới thiệu

Backstage là một nền tảng developer portal mã nguồn mở được phát triển bởi Spotify, giúp các tổ chức quản lý, xây dựng và vận hành hệ sinh thái phần mềm một cách hiệu quả. Backstage cung cấp một cổng thông tin tập trung để phát triển, quản lý và tài liệu hóa các dịch vụ, thư viện, API và tài nguyên công nghệ khác.

Backstage cung cấp sẵn một GitHub repository chứa toàn bộ source code demo, bây giờ mình sẽ dùng nó để deploy. Source code The Backstage demo deployment

Build docker image cho Backstage

Chúng ta clone source code ở trên và build docker image, để cho tiện, mình đẩy lên DockerHub với repo tên nvtienanh/backstage

git clone https://github.com/backstage/demo
cd demo
docker image build . -t nvtienanh/backstage --build-arg ENVIRONMENT_CONFIG=production
docker push nvtienanh/backstage

Deploy Backstage

Việc deploy Backstage đòi hỏi cần sử dụng Postgres databse, trong nhiều bài viết trước mình đã có giới thiệu về CloudNative-PG dùng để triển khai Postgres trên Kubernetes. Xem thêm tại đây: Sử dụng ArgoCD triển khai giải pháp database trên Kubernetes với CloudNative-PG

Dưới đây sẽ là Argo CD đùng để tạo database cho Backstage

Backstage Postgres database

backstage-db.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: backstage-db
  namespace: argocd
  finalizers:
    - resources-finalizer.argocd.argoproj.io
  labels:
    name: postgresql
spec:
  project: default
  syncPolicy:
    automated:
      prune: true 
      selfHeal: true 
      allowEmpty: false
    syncOptions:
      - Validate=false
      - CreateNamespace=true
      - PrunePropagationPolicy=foreground
      - PruneLast=true
      - RespectIgnoreDifferences=true
      - Replace=true
  sources:
    - chart: cluster
      repoURL: https://cloudnative-pg.github.io/charts
      targetRevision: 0.*
      helm:
        releaseName: backstage-db
        passCredentials: false
        parameters:
          - name: "fullnameOverride"
            value: "pgsql"
          - name: "version.postgresql"
            value: "16"
            forceString: true
          - name: "cluster.instances"
            value: "1"
          - name: "cluster.storage.storageClass"
            value: "nfs-csi"
          - name: "cluster.walStorage.storageClass"
            value: "nfs-csi"
          - name: "cluster.walStorage.enabled"
            value: "true"
          - name: "cluster.monitoring.enabled"
            value: "true"
          - name: "cluster.roles[0].name"
            value: "backstage"
          - name: "cluster.roles[0].superuser"
            value: "true"
          - name: "cluster.roles[0].login"
            value: "true"
          - name: "cluster.initdb.database"
            value: "backstage"
          - name: "cluster.initdb.owner"
            value: "backstage"
          - name: "cluster.initdb.secret.name"
            value: "db-admin-creds"
          # Disale Backup in development
          - name: "backups.enabled"
            value: "false"
    - repoURL: https://github.com/nvtienanh/argocd-applications
      targetRevision: HEAD
      path: backstage/manifests/db
  destination:
    server: https://kubernetes.default.svc
    namespace: backstage
  revisionHistoryLimit: 3

Backstage applications

backstage-app.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: backstage-app
  namespace: argocd
  finalizers:
    - resources-finalizer.argocd.argoproj.io
  labels:
    name: backstage
spec:
  project: default
  syncPolicy:
    automated:
      prune: true 
      selfHeal: true 
      allowEmpty: false
    syncOptions:
      - Validate=false 
      - CreateNamespace=true 
      - PrunePropagationPolicy=foreground 
      - PruneLast=true 
      - RespectIgnoreDifferences=true 
  sources:
    - chart: backstage
      repoURL: https://backstage.github.io/charts
      targetRevision: 2.*
      helm:
        releaseName: backstage
        passCredentials: false
        parameters:
        # Ingress
          - name: "ingress.enabled"
            value: "true"
          - name: "ingress.className"
            value: "nginx"
          - name: "ingress.annotations.cert-manager\\.io/cluster-issuer"
            value: "letsencrypt-prod"
          - name: "ingress.host"
            value: "idp.nvtienanh.info"
          - name: "ingress.tls.enabled"
            value: "true"
          - name: "ingress.tls.secretName"
            value: "backstage-tls"
        # Backstage
          - name: "backstage.revisionHistoryLimit"
            value: "3"
          - name: "backstage.image.registry"
            value: "docker.io"
          - name: "backstage.image.repository"
            value: "nvtienanh/backstage"
          - name: "backstage.image.tag"
            value: "latest"
          - name: "backstage.extraEnvVarsSecrets[0]"
            value: "backstage-db-creds"
          - name: "backstage.extraEnvVarsSecrets[1]"
            value: "app-secrets"
          - name: "backstage.extraAppConfig[0].configMapRef"
            value: "app-config"
          - name: "backstage.extraAppConfig[0].filename"
            value: "main.yaml"
    - repoURL: https://github.com/codemauvn/gitops
      targetRevision: HEAD
      path: deploys/backstage/manifests/app
  destination:
    server: https://kubernetes.default.svc
    namespace: backstage
  revisionHistoryLimit: 3

Sau khi apply các file yaml, trên giao diện của Argo CD

Còn đây là, kết quả là Backstage đã lên như vậy

Kết luận

  • Hiện tại mình chưa thêm phần SSO vào nên user mặc định là guest, tức là ai cũng có quyền truy cập. Săp tới mình sẽ hướng dẫn tích hợp SSO bằng EntraID trong bài viết khác
  • Toàn bộ file YAML có thể tìm lại đây: https://github.com/nvtienanh/argocd-applications

Chúc thành công,

ANH NGUYỄN