Не удается создать службы в Google Cloud Run с API с использованием Java SDK - PullRequest
0 голосов
/ 22 апреля 2020

Я создаю клиент Cloud Run, однако не смог найти способ перечисления службы, развернутой с Cloud Run на GKE (для Anthos).

  1. Создание клиента:
      HttpTransport httpTransport = new NetHttpTransport();
      JsonFactory jsonFactory = new JacksonFactory();
      GoogleCredentials credential = GoogleCredentials.getApplicationDefault();
      credential.createScoped("https://www.googleapis.com/auth/cloud-platform");
      HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credential);
      CloudRun.Builder builder = new CloudRun.Builder(httpTransport, jsonFactory, requestInitializer);
      return builder.setApplicationName(applicationName)
                    .setRootUrl(cloudRunRootUrl)
                    .build();
    } catch (IOException e) {
      e.printStackTrace();
    }
попробуйте перечислить службы:
 services = cloudRun.namespaces().services()
          .list("namespaces/default")
          .execute()
          .getItems();

Моя служба "привет" развернута в кластере GKE по умолчанию в пространстве имен. Приведенный выше код не работает, потому что клиент всегда видит «default» как project_id и жалуется на разрешения. Если я поставлю вместо «default» значение project_id, ошибки разрешения исчезнут, но службы не будут найдены.

Я пробовал другой проект, в котором есть полностью управляемые облачные сервисы Google, тот же код возвращает результат (с .list ("namespaces /")).

Как получить доступ к сервису в GKE?

И мой следующий вопрос: как программно создавать сервисы Cloud Run на GKE?

Edit - для создания сервиса Поскольку я не мог понять, Как взаимодействовать с Cloud Run на GKE, я сделал шаг назад, чтобы попробовать полностью управляемый. Следующий код для создания службы не работает, и сообщение об ошибке просто не дает много полезного понимания, как заставить его работать?

    Service deployedService = null;
//    Map<String,String> annotations = new HashMap<>();
//    annotations.put("client.knative.dev/user-image","gcr.io/cloudrun/hello");

    ServiceSpec spec = new ServiceSpec();
    List<Container> containers = new ArrayList<>();
    containers.add(new Container().setImage("gcr.io/cloudrun/hello"));
    spec.setTemplate(new RevisionTemplate().setMetadata(new ObjectMeta().setName("hello-fully-managed-v0.1.0"))
                                           .setSpec(new RevisionSpec().setContainerConcurrency(20)
                                                                      .setContainers(containers)
                                                                      .setTimeoutSeconds(100)
                                                   )
                    );
    helloService.setApiVersion("serving.knative.dev/v1")
                .setMetadata(new ObjectMeta().setName("hello-fully-managed")
                                             .setNamespace("data-infrastructure-test-env")
//                                             .setAnnotations(annotations)
                 )
                .setSpec(spec)
                .setKind("Service");
    try {
        deployedService = cloudRun.namespaces().services()
            .create("namespaces/data-infrastructure-test-env",helloService)
            .execute();
    } catch (IOException e) {
      e.printStackTrace();
      response.add(e.toString());
      return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(response);
    }

Полученное сообщение об ошибке:

com.google.api.client.googleapis.json.GoogleJsonResponseException: 400 Bad Request
{
  "code" : 400,
  "errors" : [ {
    "domain" : "global",
    "message" : "The request has errors",
    "reason" : "badRequest"
  } ],
  "message" : "The request has errors",
  "status" : "INVALID_ARGUMENT"
}
    at com.google.api.client.googleapis.json.GoogleJsonResponseException.from(GoogleJsonResponseException.java:150)
    at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:113)

И base_url: https://europe-west1-run.googleapis.com

Ответы [ 2 ]

1 голос
/ 23 апреля 2020

Ваш вопрос довольно подробный (и о Java, в котором я не специалист), и там на самом деле слишком много вопросов (в идеале, пожалуйста, задайте только 1 вопрос здесь). Однако я постараюсь ответить на несколько вопросов, которые вы спрашивали:

Во-первых, Cloud Run (управляемый и в GKE) реализует API-интерфейс Knative Serving. Я объяснил это на https://ahmet.im/blog/cloud-run-is-a-knative/ На самом деле, Cloud Run на GKE - это просто компоненты Knative с открытым исходным кодом, установленные в вашем кластере.

И мой следующий вопрос: как программно создавать сервисы Cloud Run на GKE?

У вас будет очень трудное время (если вообще возможно) с использованием клиентских библиотек Cloud Run API (например, new CloudRun выше), поскольку они предназначены для конечных точек *.googleapis.com.

Часть Knative API в «Cloud Run on GKE» на самом деле является просто конечной точкой главного API Kubernetes (GKE) (которая выполняется на IP-адресе с Сертификат TLS, которому не доверяют root CA, но вы можете найти сертификат CA в вызове API GKE GetCluster для проверки сертификата.) TLS - это часть того, почему так сложно использовать клиентские библиотеки API.

Knative API - это просто объекты Kubernetes. Таким образом, ваш лучший выбор - один из них:

  • См. Клиент Kubernetes java (https://github.com/kubernetes-client/java) фактически разрешает динамические c объекты. (Реализация Go делает) и попытайтесь использовать это для создания Knative CRD.
  • Используйте kubectl apply.
  • Обратитесь за помощью к репозиторию открытого исходного кода Knative Serving (они должны предоставлять клиентские библиотеки, может быть, они уже там, я не уверен)

Для программирования Cloud Run (управляемый) с помощью клиентских библиотек API необходимо явно переопределить конечную точку API для регион например us-central1-run.googleapis.com. (Это описано в справочной документации по API REST каждого вызова API.)

Я написал подробное сообщение в блоге (с примером кода в Go) о том, как создавать / обновлять службы в Cloud Run (управляемые) используя Knative Serving API здесь: https://ahmet.im/blog/gcloud-run-deploy/

Если вы хотите увидеть, как работает gcloud run deploy и какие API он вызывает, вы можете передать опцию --log-http, чтобы выполнить запрос / трафик ответа c.

Что касается полученной ошибки, то кажется, что сообщение об ошибке бесполезно, но оно может приходить откуда угодно (поскольку вы пытаетесь имитировать Knative API в клиентских библиотеках GCP). Я рекомендую прочитать мои сообщения в блоге и образец кода подробно.


ОБНОВЛЕНИЯ: Наша команда инженеров смотрит на проблему, кажется, что в настоящее время есть ошибка, не добавляющая "детали" поле до ошибки. Это работает над.

В вашем случае мы видим следующие ошибки из запросов:

field: "spec.template.spec"
  description: "Missing template spec."

Означает, что вы не правильно заполняете поле spe c, как я показал в моем сообщение в блоге и пример кода.

field: "metadata.name"
  description: "The revision name must be prefixed by the name of the enclosing Service or Configuration with a trailing -"

Убедитесь, что указанное имя соответствует шаблонам, указанным в документации API. Попробуйте создать это имя вручную, возможно, в пользовательском интерфейсе или в CLI gcloud.

field: "api_version"
  description: "Unsupported API version \'serving.knative.dev/v1\'. Expected \'serving.knative.dev/v1alpha1\'"

Не используйте API v1alpha1, используйте непосредственно v1.

Мы попытаемся получить подробную информацию об ошибке сообщение, однако кажется, что вам нужно изучить пример кода, который я привел в моем блоге более подробно: https://github.com/GoogleCloudPlatform/cloud-run-button/blob/a52c7fbaae33a3e06c112206c7227a0ef9649647/cmd/cloudshell_open/deploy.go#L26 -L112

0 голосов
/ 24 апреля 2020

Java SDK автоматически генерируется из-за того, что API Cloud Run (полностью управляемый) опубликован c. Он не поддерживает Cloud Run для Anthos.

...