You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法在搭载CloudSQL PostgreSQL的GKE集群部署Backstage

问题描述

尝试在GKE集群部署Backstage,使用CloudSQL PostgreSQL数据库,已配置Cloud SQL Proxy作为sidecar,但后端启动失败,报错如下:

{"level":"info","message":"Performing database migration","plugin":"catalog","service":"backstage","type":"plugin"}
Backend failed to start up KnexTimeoutError: Knex: Timeout acquiring a connection. The pool is probably full. Are you missing a .transacting(trx) call?
    at Client_PG.acquireConnection (/app/node_modules/knex/lib/client.js:307:26)
    at async Runner.ensureConnection (/app/node_modules/knex/lib/execution/runner.js:287:28)
    at async Runner.run (/app/node_modules/knex/lib/execution/runner.js:30:19)
    at async listCompleted (/app/node_modules/knex/lib/migrations/migrate/migration-list-resolver.js:12:3)
    at async Promise.all (index 1)
    at async Migrator.latest (/app/node_modules/knex/lib/migrations/migrate/Migrator.js:63:29)
    at async applyDatabaseMigrations (/app/node_modules/@backstage/plugin-catalog-backend/dist/index.cjs.js:2020:3)
    at async CatalogBuilder.build (/app/node_modules/@backstage/plugin-catalog-backend/dist/index.cjs.js:4095:7)
    at async createPlugin$4 (/app/packages/backend/dist/index.cjs.js:84:40)
    at async main (/app/packages/backend/dist/index.cjs.js:276:29) {
  sql: undefined,
  bindings: undefined
}

当前Deployment配置:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: backstage-deployment
  namespace: backstage
spec:
  replicas: 1
  selector:
    matchLabels:
      app: backstage
  template:
    metadata:
      labels:
        app: backstage
    spec:
      serviceAccountName: backstage-sa
      containers:
        - name: backstage
          image: us-central1-docker.pkg.dev/px-mike-project-hje/backstage/backstage
          imagePullPolicy: Always
          ports:
            - name: backstage
              containerPort: 7007
          env:
          - name: POSTGRES_USER
            valueFrom:
              secretKeyRef:
                name: pg-db-ref
                key: username
          - name: POSTGRES_PASSWORD
            valueFrom:
              secretKeyRef:
                name: pg-db-ref
                key: password
          - name: POSTGRES_HOST
            valueFrom:
              secretKeyRef:
                name: pg-db-ref
                key: endpoint

        - name: cloud-sql-proxy
          image: gcr.io/cloudsql-docker/gce-proxy:1.28.0
          command:
            - "/cloud_sql_proxy"
            - "-ip_address_types=PRIVATE"
            - "-log_debug_stdout"
            - "-instances=px-mike-project-hje:us-central1:pg-database=tcp:5432"
          securityContext:
            runAsNonRoot: true
          resources:
            requests:
              memory: "2Gi"
              cpu: "1"

数据库app-config配置:

database:
    client: pg
    connection:
      host: ${POSTGRES_HOST}
      port: 5432
      user: ${POSTGRES_USER}
      password: ${POSTGRES_PASSWORD}
    database: pg-database
    ensureExists: false
    pluginDivisionMode: schema
    knexConfig:
      pool:
        min: 15
        max: 30
        acquireTimeoutMillis: 60000
        idleTimeoutMillis: 60000
      acquireConnectionTimeout: 10000
    plugin: 
      # catalog:
        # connection:
        #   database: pg-database
      auth:
        client: better-sqlite3
        connection: ':memory:'

本地运行该Docker镜像正常,但集群部署启动失败。

解决步骤
  • 修正数据库连接Host
    Cloud SQL Proxy作为sidecar与Backstage容器同属一个Pod,Backstage需连接localhost而非CloudSQL的外部/私有Endpoint。修改Deployment中的环境变量配置:

    - name: POSTGRES_HOST
      value: "localhost" # 替换原从secret获取endpoint的配置
    

    本地运行时直接连接CloudSQL端点可行,但集群中sidecar代理的是本地端口,必须指向localhost。

  • 调小Knex连接池大小
    当前连接池min:15、max:30的配置远超多数CloudSQL实例的默认连接上限(例如db-t1-small实例最多支持25个连接),导致连接池无法获取新连接而超时。修改app-config中的knex配置:

    knexConfig:
      pool:
        min: 2
        max: 5
        acquireTimeoutMillis: 60000
        idleTimeoutMillis: 60000
    
  • 验证Cloud SQL Proxy权限与实例配置

    • 确认backstage-sa服务账号已被授予Cloud SQL Client角色,拥有目标CloudSQL实例的访问权限。
    • 检查Proxy命令中的实例IDpx-mike-project-hje:us-central1:pg-database是否完全正确,无拼写或区域错误。
  • 确认目标数据库已创建
    app-config中ensureExists: false意味着Backstage不会自动创建数据库,需提前在CloudSQL中手动创建名为pg-database的数据库,否则连接请求会失败,最终耗尽连接池。

内容的提问来源于stack exchange,提问作者Michael Foster

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 23:55:20