能否在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"
整体部署架构建议
- 图像处理服务:保持你现有部署脚本,添加环境变量
KEYCLOAK_AUTH_URL=https://keycloak-auth-service-<HASH>.a.run.app,在应用中通过这个URL调用Keycloak的API完成用户验证。 - Keycloak服务:使用上面修正后的脚本部署,连接同一个Cloud SQL实例(可以单独建一个Keycloak数据库,或者用同一个库的不同schema)。
- Cloud SQL:确保已经为两个Cloud Run服务配置了Cloud SQL连接权限(通过
--add-cloudsql-instances参数)。
这种架构既满足了无服务器、长期免费的需求,又保证了组件的独立性和安全性。
内容的提问来源于stack exchange,提问作者Miguel Rueda
相关产品推荐
相关产品推荐

