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

能否在Cloud Run服务中运行两个容器?部署含Keycloak验证与Postgres的深度学习图像处理应用遇配置问题求助

解决Cloud Run上Keycloak部署问题及多容器疑问

我之前帮团队部署过类似的GCP Cloud Run + Keycloak + Postgres架构,刚好能给你一些实际经验:

首先明确:Cloud Run不支持单服务多容器

目前Cloud Run的设计是每个服务只能运行单个容器,没办法在同一个Cloud Run服务里同时跑你的图像处理应用和Keycloak。如果要同时运行这两个组件,最佳实践是拆分成两个独立的Cloud Run服务:

  • 一个服务跑你的深度学习图像处理应用
  • 另一个服务跑Keycloak认证服务

这种拆分也符合微服务架构,两个服务可以独立更新、扩容,而且都能利用Cloud Run的免费额度,完全满足你长期免费运行的需求。

Keycloak在Cloud Run上无法运行的常见原因及解决方案

你给出的Keycloak配置有几个不符合Cloud Run环境的点,我帮你逐一修正:

1. 端口配置错误

Cloud Run会动态分配端口,并通过$PORT环境变量告知容器,你的Keycloak配置固定监听8443,导致无法接收Cloud Run转发的请求。需要修改为监听$PORT:

  • 新增环境变量KC_HTTP_PORT=$PORT
  • 或者在启动命令中指定--http-port $PORT

2. Cloud SQL数据库连接方式错误

你直接用DB_ADDR指定IP的方式在Cloud Run里不可行(默认容器无法直接访问Cloud SQL的公网IP,且不安全),正确的做法是用Cloud Run内置的Cloud SQL连接,通过Unix套接字访问:

  • 删除DB_ADDR配置
  • 添加JDBC参数指定Cloud SQL Socket Factory:
    JDBC_PARAMS="socketFactory=com.google.cloud.sql.postgres.SocketFactory&cloudSqlInstance=$INSTANCE_CONNECTION_NAME"
    
  • 确保Keycloak镜像包含Cloud SQL Socket Factory依赖(如果官方镜像没有,需要自己构建镜像添加,或者使用GCP提供的镜像)

3. Keycloak主机名配置错误

Cloud Run的请求是通过负载均衡转发的,Keycloak默认会严格校验主机名,导致拒绝请求。需要关闭严格主机名校验:

  • 添加环境变量KC_HOSTNAME_STRICT=false和KC_HOSTNAME_STRICT_HTTPS=false
  • 同时启用HTTP(Cloud Run会帮你处理外部HTTPS到容器HTTP的转发):KC_HTTP_ENABLED=true

修正后的Keycloak Cloud Run部署命令

结合你的场景,我整理了可直接使用的部署脚本:

# 部署Keycloak到Cloud Run
gcloud run deploy keycloak-auth-service \
  --image quay.io/keycloak/keycloak:latest \
  --platform=managed \
  --region=${REGION} \
  --add-cloudsql-instances $INSTANCE_CONNECTION_NAME \
  --set-env-vars \
    DB_VENDOR=postgres, \
    DB_DATABASE=<KEYCLOAK_DB_NAME>, \
    DB_SCHEMA=public, \
    DB_USER=$DB_USER, \
    DB_PASSWORD=$DB_PASS, \
    JDBC_PARAMS="socketFactory=com.google.cloud.sql.postgres.SocketFactory&cloudSqlInstance=$INSTANCE_CONNECTION_NAME", \
    KC_HTTP_PORT=$PORT, \
    KC_HOSTNAME_STRICT=false, \
    KC_HOSTNAME_STRICT_HTTPS=false, \
    KC_HTTP_ENABLED=true, \
    KEYCLOAK_ADMIN=admin, \
    KEYCLOAK_ADMIN_PASSWORD=admin
# 可选:限制访问,只允许你的图像处理服务调用Keycloak
# --no-allow-unauthenticated \
# --add-iam-policy-binding "serviceAccount:<YOUR_IMAGE_PROCESSING_SERVICE_ACCOUNT>@<PROJECT_ID>.iam.gserviceaccount.com=roles/run.invoker"

整体部署架构建议

  1. 图像处理服务:保持你现有部署脚本,添加环境变量KEYCLOAK_AUTH_URL=https://keycloak-auth-service-<HASH>.a.run.app,在应用中通过这个URL调用Keycloak的API完成用户验证。
  2. Keycloak服务:使用上面修正后的脚本部署,连接同一个Cloud SQL实例(可以单独建一个Keycloak数据库,或者用同一个库的不同schema)。
  3. Cloud SQL:确保已经为两个Cloud Run服务配置了Cloud SQL连接权限(通过--add-cloudsql-instances参数)。

这种架构既满足了无服务器、长期免费的需求,又保证了组件的独立性和安全性。

内容的提问来源于stack exchange,提问作者Miguel Rueda

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 14:13:16