无法在搭载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命令中的实例ID
px-mike-project-hje:us-central1:pg-database是否完全正确,无拼写或区域错误。
- 确认
确认目标数据库已创建
app-config中ensureExists: false意味着Backstage不会自动创建数据库,需提前在CloudSQL中手动创建名为pg-database的数据库,否则连接请求会失败,最终耗尽连接池。
内容的提问来源于stack exchange,提问作者Michael Foster
相关产品推荐
相关产品推荐

