从 Cloud Build 连接到 GKE 集群上的 gRPC 服务

Connect to a gRPC service on a GKE cluster from Cloud Build

我们使用托管 Kubeflow Pipelines (KFP) 实例,使用 GCP 的 AI Platform Pipelines 创建,托管 MySQL 实例使用 Cloud SQL 创建。我们还使用 Cloud Build 来构建和 运行 我们的 KFP 管道。我们想添加一个云构建步骤,在 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)

这 运行 在 VM 上没问题。但是,似乎需要 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 的经验有限,所以如果有一个简单的解决方案,我不会感到惊讶。

如有任何建议,我们将不胜感激!

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