【问题标题】:Connect to a gRPC service on a GKE cluster from Cloud Build从 Cloud Build 连接到 GKE 集群上的 gRPC 服务
【发布时间】:2021-05-20 14:55:42
【问题描述】:

我们使用了一个托管的 Kubeflow Pipelines (KFP) 实例,该实例是通过 GCP 的 AI Platform Pipelines 创建的,以及一个托管的 MySQL 实例,该实例是通过 Cloud SQL 创建的。我们还使用 Cloud Build 来构建和运行我们的 KFP 管道。我们想添加一个 Cloud Build 步骤,在 KFP 管道运行完成后,运行一个脚本,该脚本使用 MLMD API 来查询该管道运行的元数据。我们有一个 MLMD 脚本,可以在 GCP VM 上手动运行时成功查询元数据。问题是让该脚本在 Cloud Build 中运行。

第一种方法是使用 MySQL 连接信息创建 mlmd.metadata_store.MetadataStore 对象,例如,

connection_config = metadata_store_pb2.ConnectionConfig()
connection_config.mysql.host = [IP address]
connection_config.mysql.port = 3306
connection_config.mysql.database = "kubeflow_experiments_metadata_metadata"
connection_config.mysql.user = [user]
connection_config.mysql.password = [password]
store = mlmd.metadata_store.MetadataStore(connection_config)

这在虚拟机上运行良好。但是,似乎需要 Cloud SQL 代理才能在 Cloud Build 中运行。以Cloud Functions codelab 为例,我能够在 Cloud Build 中运行一个脚本,该脚本使用 sqlalchemy 通过代理连接到 MySQL。但是,将 sqlalchemy 与代理连接的方法似乎与上述 MLMD API 不兼容。它看起来像这样:

driver_name = "mysql+pymysql"
query_string = dict({"unix_socket": "/cloudsql/{}".format(connection_name)})
db = sqlalchemy.create_engine(
    sqlalchemy.engine.url.URL(drivername=driver_name, username=[user], password=[password], database="kubeflow_experiments_metadata_metadata", query=query_string),
    pool_size=5,
    max_overflow=2,
    pool_timeout=30,
    pool_recycle=1800,
)

第二种方法使用与 KFP 一起部署的 MLMD gRPC 服务。首先,我转发服务:

kubectl port-forward svc/metadata-grpc-service 8080:8080

然后使用 MLMD gRPC API 创建mlmd.metadata_store.MetadataStore

connection_config = metadata_store_pb2.MetadataStoreClientConfig(
    host="127.0.0.1",
    port=8080,
)
store = mlmd.metadata_store.MetadataStore(connection_config)

同样,这在 VM 上运行良好。但是,我不确定如何从 Cloud Build 连接到 gRPC 服务。我在 gRPC 和 Kubernetes 方面的经验有限,所以如果有一个简单的解决方案,我不会感到惊讶。

任何建议将不胜感激!

【问题讨论】:

  • 你能扩展一下这个说法吗?:“然而,连接sqlalchemy和proxy的方法,似乎和上面的MLMD API不兼容。”
  • 当然。我上面引用的 Cloud Functions 代码实验室似乎将 Cloud SQL 代理配置为侦听 /cloudsql 目录中的 Unix 端口。这个套接字是 sqlalchemy 代码通过代理连接到 MySQL 的方式。然而,用于连接 MySQL 的 MLMD API 似乎只接受 IP 地址和端口。希望对您有所帮助。
  • 您可能想知道 Cloud SQL 代理也支持侦听 TCP 套接字:cloud.google.com/sql/docs/mysql/connect-admin-proxy#tcp-sockets 对于 Cloud Build,您可以使用类似这样的东西来运行代理:stackoverflow.com/a/58441728/9414803跨度>
  • 酷,感谢您的提示!为了在 Cloud Build 中运行 sqlalchemy 脚本,我使用了 this image 来安装和配置 Cloud SQL 代理。 This line 使用 Unix 套接字运行代理,所以看起来这个图像不能与 TCP 套接字一起使用。 gRPC 解决方案目前有效,但我可能会回到这个并看看您指出的 TCP 套接字方法。再次感谢!

标签: grpc google-cloud-sql google-cloud-build kubeflow-pipelines google-cloud-ai-platform-pipelines


【解决方案1】:

通过其他途径,我被指向了这个article,其中包含如何在 Cloud Build 中移植 KFP 的 ml-pipeline 服务的示例。我必须做一个小的修改,即删除kubectl port-forward 命令的"-n""kubeflow" 参数。这指定kubectl 使用"kubeflow" 命名空间。但是,GCP 的 AI Platform Pipelines 在部署您的 KFP 实例时似乎会创建一个 "default" 命名空间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-14
    • 2021-10-27
    • 1970-01-01
    • 2021-09-20
    • 2021-05-05
    • 2020-11-24
    • 1970-01-01
    相关资源
    最近更新 更多