Как запланировать задачу для вызова метода gRPC? - PullRequest
3 голосов
/ 21 июня 2019

У меня работает сервер .Net в Google Kubernetes Engine.Он настроен на использование gRPC через конечные точки Google Cloud.Теперь мне нужно запланировать задачу, чтобы вызывать мой метод gRPC один раз в день.


Первое, что я попробовал, - это использовать Google Cloud Scheduler для прямого вызова методов http.Для этого у меня есть:

  • Настройка перекодировки HTTP в gRPC на моем сервере для вызова метода gRPC через http.
  • Создан и включен сертификат SSL, как описано здесь .
  • Создана учетная запись службы в IAM и консоли администратора с разрешениями Создателя токена учетной записи службы и Пользователя учетной записи службы.
  • Создана работа Cloud Scheduler с моим URL-адресом и заголовком Auth в качестве токена OIDC и созданная выше службаaccount.
  • Развернутая конфигурация конечных точек Google Cloud со следующими параметрами (не только их):
    authentication:
      providers:
      - id: google_service_account
        issuer: MY_SERVICE_ACCOUNT_EMAIL
        jwks_uri: https://www.googleapis.com/robot/v1/metadata/x509/MY_SERVICE_ACCOUNT_EMAIL
      rules:
      - selector: "*"
        requirements:
          - provider_id: google_service_account
    

После этого при запуске задания планировщика возвращается результат"Не удалось".В журналах записывается ОШИБКА со статусом НЕИЗВЕСТНО.


Вторым, что я попробовал, было использование Google Cloud Scheduler для публикации сообщения в теме Sub Pub с моим сервером в качестве подписчика.Также безуспешно, потому что я не могу подтвердить право собственности на домен Google Cloud Endpoints.Я задал вопрос по этому вопросу: Как подтвердить право собственности на URL-адрес службы конечных точек Google Cloud?


Теперь вопрос: каков наилучший способ планирования задачи, при которой будет вызываться метод gRPC, предполагающийследующая среда:

  1. .Net сервер, работающий на GKE
  2. gRPC
  3. Автоматический периодический вызов этой задачи (я могу вызвать вручную, но это бессмысленно)

Ответы [ 2 ]

0 голосов
/ 02 июля 2019

Распределенный планировщик подробнее см. sourcedcode Распределенный планировщик

Это приложение может быть запущено на разных хостах и ​​предлагает планировать выполнение произвольной команды в определенное время или периодически. Существует два способа связи с приложением: gRPC и REST. Дистанционный пульт интерфейсы указано в dsched.proto файле Соответствующий REST API также может быть найден там в виде API аннотаций. Мы также предоставляем сгенерированные файлы Swagger. Чтобы указать время выполнения задачи, мы используем нотацию, принятую cron. Запланированные задания сохраняются в файле и автоматически загружаются при запуске.

Строительство

Install gRPC
Install gRPC gateway

Для разбора операторов crontab и планирования выполнения задач мы используем библиотеку gopkg.in/robfig/cron.v2. Так что это должно быть установлено также: go get -u gopkg.in/robfig/cron.v2. Документация может быть найдена здесь

Получить пакет dsched: иди получить

-u gitlab.com/andreynech/dsched

Теперь можно запустить стандартную команду go build в dscheduler и каталоги шлюза для генерации двоичных файлов для планировщика и REST/JSON API шлюз. Также было бы полезно изучить наши Файл конфигурации CI, чтобы увидеть, как мы настроить среду здания.

Running Все функции планирования реализованы исполняемым файлом dscheduler. Так он может быть запущен при запуске системы или по требованию. Как описано в dscheduler --help, Есть два параметра командной строки:

-i string - File name to store task list (default "/var/run/dscheduler.db")
-p string - Endpoint to listen (default ":50051")

Если необходимо предложить REST/JSON API, приложение шлюза находится в каталог шлюза должен быть запущен. Он может находиться на том же хосте, что и dscheduler, но обычно это будет другой хост, который доступен через HTTP извне и так же может общаться с запущенным в dscheduler внутренняя сеть. Эта установка была также причиной разделения планировщика и шлюз в двух исполняемых файлах. шлюз в основном генерируется приложением и поддерживает несколько параметров command-line, описанных при запуске gateway --help. Важным параметром является строка -sched_endpoint, которая является конечной точкой планировщика сервис (по умолчанию "localhost: 50051"). Указывает имя хоста и порт где dscheduler прослушивает запросы.

Планирование задач (тестирование) Существует три способа управления сервером планировщика:

Использование клиента Go, реализованного в каталоге cli/ Использование клиента Python, реализованного в каталоге py_cli Использование REST/JSON API-шлюза и curl

Клиенты Go и Python имеют одинаковый набор параметров командной строки.

$ ./cli --help

Использование cli:

 -a string
        The command to execute at time specified by -c parameter
  -c string
        Statement in crontab format describes when to execute the command
  -e string
        Host:port to connect (default "localhost:50051")
  -l    List scheduled tasks
  -p    Purge all scheduled tasks
  -r int
        Remove the task with specified id from schedule
  -s    Schedule task. -c and -a arguments are required in this case
They are using gRPC protocol to talk to scheduler server. Here are several
example invocations:

$ ./cli -l list currently scheduled tasks

$ ./cli -s -c "@every 0h00m10s" -a "df" schedule df command for
execution every 10 seconds

$ ./cli -s -c "0 30 * * * *" -a "ls -l" schedule ls -l command to
run every 30 minutes

$ ./cli -r 3 remove task with ID 3

$ ./cli -p remove all scheduled tasks

Также возможно использовать curl для вызова функциональности dscheduler поверх REST/JSON API-шлюз. Предполагая, что dscheduler и шлюз приложений выполняются, вот некоторые вызовы, чтобы перечислить, добавить и удалить планирование записи с одного хоста (localhost):

curl 'http://localhost:8080/v1/scheduler/list' list currently scheduled tasks

curl -d '{"id":0, "cron":"@every 0h00m10s", "action":"ls"}' -X POST 'http://localhost:8080/v1/scheduler/add' schedule ls command for execution every 10 seconds

curl -d '{"id":0, "cron":"0 30 * * * *", "action":"ls -l"}' -X POST 'http://localhost:8080/v1/scheduler/add' schedule ls -l to run every 30 minutes

curl -d '{"id":2}' -X POST 'http://localhost:8080/v1/scheduler/remove' remove task with ID 2.

curl -X POST 'http://localhost:8080/v1/scheduler/removeall' remove all scheduled tasks

Все изменения автоматически сохраняются в файле.

Мысли об обнаружении службы планировщика В больших сценариях развертывания (например, сотни хостов) это может быть сложная задача выяснить все IP-адреса и порты, где находится планировщик служба запущена. Было бы довольно легко добавить поддержку Zeroconf (Bonjour / Avahi) технология для упрощения поиска услуг. Как альтернатива, это может быть возможно реализовать что-то похожее на службу имен CORBA где запущенные сервисы регистрируются самостоятельно, а местоположение службы именования хорошо известно. Мы решили собрать отзывы, прежде чем принять решение о конкретных внедрение службы обнаружения. Так что ваш вклад очень приветствуется!

0 голосов
/ 26 июня 2019

Итак, вы смогли сделать HTTP-вызов вручную, но не автоматически с помощью Google Cloud Scheduler, это правильно?

Если это так, проверьте, достигает ли запрос Облачный прокси-сервер конечной точки в облачной консоли Регистрация конечных точек, он может дать вам некоторые подсказки.

...