Подключитесь к службе gRPC в кластере GKE из Cloud Build

Мы используем управляемый экземпляр Kubeflow Pipelines (KFP), созданный с помощью GCP AI Platform Pipelines, с управляемым экземпляром MySQL, созданным с помощью Cloud SQL. Мы также используем Cloud Build для создания и запуска наших конвейеров KFP. Мы хотели бы добавить этап Cloud Build, который после завершения выполнения конвейера KFP запускает сценарий, использующий API MLMD для запроса метаданных этого выполнения конвейера. У нас есть сценарий MLMD, который может успешно запрашивать метаданные при запуске вручную на виртуальной машине GCP. Проблема заключалась в запуске этого скрипта в Cloud Build.

Первый подход заключался в создании объекта с использованием информации о соединении MySQL, например,

      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 в качестве примера, я смог запустить сценарий в Cloud Build, который использовал sqlalchemy для подключения к MySQL через прокси. Однако метод подключения sqlalchemy к прокси-серверу кажется несовместимым с указанным выше API MLMD. Это выглядит примерно так:

      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,
)

Второй подход использует службу MLMD gRPC, развернутую с KFP. Сначала я перенаправляю службу:

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

затем создайте mlmd.metadata_store.MetadataStore используя MLMD gRPC API:

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

Опять же, это отлично работает на виртуальной машине. Однако я не уверен, как подключиться к службе gRPC из Cloud Build. Мой опыт работы с gRPC и Kubernetes ограничен, поэтому я не удивлюсь, если найдется простое решение.

Любой совет будет очень признателен!

1 ответ

Решение

По другим направлениям мне указали на эту статью , в которой содержится пример перенаправления сервиса ml-pipeline KFP в Cloud Build. Мне пришлось внести одну небольшую модификацию, которая заключалась в удалении "-n" и аргументы kubectl port-forwardкоманда. Это указывает на kubectl использовать "kubeflow"пространство имен. Однако конвейеры платформы AI GCP, похоже, создают "default" пространство имен при развертывании вашего экземпляра KFP.