Развертывание API REST .Net 5 в Google Cloud Run с помощью Github и Google Cloud Build

Создайте новый проект ASP.NET Core Web API.

Дайте имя проекту и поместите его в корневую папку Github repo.

Выберите версию .Net.

Версия, которую вы выберете здесь, будет отражена в dockerfile, поэтому не стесняйтесь менять версию .Net, но не забудьте адаптировать свой dockerfile.

Выберите опцию webapi для запуска.

Запустите проект, сделайте GET запрос на конечную точку /weatherforecast, чтобы проверить, все ли в порядке.

Program.cs

Измените ваш Program.cs так, чтобы он выглядел следующим образом:

using System;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;

namespace webapi
{
    public class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args)
        {
            var port = Environment.GetEnvironmentVariable("PORT") ?? "8080";
            var environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Development";

            if (environment == "Development")
            {
                return Host.CreateDefaultBuilder(args)
                    .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); });
            }
            else
            {
                var url = new[]
                {
                    string.Concat("http://0.0.0.0:", port)
                };
                return Host.CreateDefaultBuilder(args)
                    .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>().UseUrls(url); });
            }
        }
    }
}
Вход в полноэкранный режим Выход из полноэкранного режима

В этом коде важно установить 0.0.0.0 IP, если программа запущена в контейнере, потому что когда мы используем Google Cloud Run, мы запускаем код внутри контейнера. В моем случае я установил его для всех окружений, кроме окружения Delopment.

Dockerfile

Создайте файл Dockerfile в корневой папке вашего репозитория. Проверьте, все ли файлы вашего проекта находятся в корневой папке, если нет, переместите их в корневую папку.

Отредактируйте ваш Dockerfile следующим кодом:

FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build-env
WORKDIR /app

COPY . ./
RUN dotnet publish -c Release -o out

FROM mcr.microsoft.com/dotnet/aspnet:5.0
WORKDIR /app
COPY --from=build-env /app/out .

ENV ASPNETCORE_ENVIRONMENT Production

ENTRYPOINT ["dotnet", "webapi.dll"]
Вход в полноэкранный режим Выйти из полноэкранного режима

Не забудьте изменить имя файла de DLL в последней строке, это имя должно полностью совпадать с именем основного .dll файла вашего проекта.
Если ваш проект имеет другую структуру папок, возможно, вам потребуется внести изменения в ваш dockerfile.

Сохраните все файлы и зафиксируйте.

Запуск в облаке GCP

Если хотите, создайте новый проект.

Найдите Cloud Run, откройте продукт Cloud Run. Создайте новый сервис.

Если вы создали новый проект или впервые используете Cloud Build, возможно, как и мне, необходимо включить Cloud Build API.

Выберите Continuously deploy new revisions from a source repository и нажмите Setup With Cluod Build.

Важно: Я подключил свой аккаунт Github ранее, поэтому не смог снять отпечатки на этом шаге, но если вы делаете это впервые, вам нужно подключить свои аккаунты Github и GCP.

Выберите свой репозиторий Github для публикации.

Перейдите ко второму шагу и отметьте опцию Dockerfile. В поле Branch сохраните стандартное значение ^main$, таким образом, каждый коммит в ветке main будет вызывать новую сборку в Cloud Build для публикации в Cloud Run. Помните, что можно перейти на другую ветку.

Заполните Service name, я просто оставил значение по умолчанию. Выберите регион, опять же я оставил значение по умолчанию.

В опции Autoscaling я выбрал ноль в качестве минимального количества экземпляров, потому что это снижает затраты, но если вы хотите уменьшить задержки и улучшить время отклика, имейте в виду, что, вероятно, вам понадобится хотя бы один экземпляр.

Как и в случае с минимальными экземплярами, для ограничения затрат я выбираю всего 1 экземпляр максимум. Если вы хотите улучшить доступность и надежность, увеличьте это число в зависимости от объема трафика.

Наконец, выберите параметры Ingress и Authentication, для этого руководства я выбрал Allow all traffic и Allow unauthenticated invocations. Но для производственных приложений следует ограничить трафик и неаутентифицированные запросы.

Необязательно: Откройте меню Container, Connections, Security и настройте емкость вашего контейнера.

Для данного развертывания нет необходимости беспокоиться об этом, и вы можете изменить это позже.

Сохраните и создайте свой сервис. Подождите.

Если все сделано, вы должны получить результат, подобный приведенному ниже изображению:

Выделенный URL предоставлен GCP и является публичным URL для доступа к вашей службе. Попробуйте получить доступ к вашей конечной точке /weatherforecast.

URL: https://democsharpgcpcloudrun-lwy2plkqfa-uc.a.run.app/weatherforecast

Заключение

С такой конфигурацией каждый новый коммит в вашей ветке main в репозитории Github будет инициировать новую сборку в Google Cloud Build, и в случае успеха сборки новая версия вашего приложения будет развернута в Google Cloud Run.

В Cloud Run есть ресурс под названием Reviews, который позволяет нам откатить версию, если новая версия сломает наш API.

Помимо того, что ведьма позволяет нам управлять трафиком между версиями, она позволяет нам развертывать приложение с помощью метода canary. К сожалению, до сих пор я не смог настроить автоматизацию canary при развертывании. Если вы знаете, как автоматизировать управление трафиком при развертывании, пожалуйста, напишите в комментариях.

Спасибо, что прочитали, и я надеюсь, что это было полезно.

Оцените статью
devanswers.ru
Добавить комментарий