Поделиться через


Руководство по развертыванию многоконтейнерного приложения в приложениях контейнеров Azure

Вы можете развернуть многоконтейнерное приложение в сервисе Azure Container Apps с помощью Visual Studio. Как правило, каждый контейнер развертывается в отдельном экземпляре приложения контейнера, но вы включаете все контейнеры приложения в одну среду приложения контейнеров, чтобы позволить им легко и безопасно взаимодействовать друг с другом. Каждое приложение-контейнер можно настроить для принятия запросов из среды контейнера или разрешения внешнего трафика. Приложения контейнеров Azure являются гибкими и настраиваемыми, что позволяет использовать множество возможных сценариев микрослужб и полный набор расширенных средств мониторинга. Если вы используете Docker Compose для управления локальными приложениями контейнеров, попробуйте перенести его в среду приложения-контейнера в Azure.

Процесс включает в себя несколько шагов с помощью Visual Studio и портала Azure. Вы также можете использовать Azure CLI для выполнения этих действий, но это выходит за рамки этого руководства. Сначала мы используем приложение, которое вы создали с помощью функции Создать приложение с несколькими контейнерами, и развертываем его с использованием процесса Publish. Visual Studio поможет вам создать первое приложение контейнера, среду приложения контейнера, а также создать реестр контейнеров для хранения образов контейнеров. Затем вы снова выполните процесс публикации с другим приложением контейнера. В процессе публикации необходимо выбрать ту же среду приложения-контейнера. Наконец, необходимо настроить кэш Redis для работы со службой кэша Redis Azure. Вы изменяете код конфигурации кэша и повторно публикуете веб-API. Затем настройте разрешения, чтобы управляемая удостоверенная личность, назначаемая системой, имела доступ к кэшу.

Предпосылки

  • Подписка Azure. Зарегистрируйтесь на бесплатную пробную версию.
  • Visual Studio с установленными рабочими нагрузками разработки Azure и ASP.NET и веб-разработки .
  • Проект https://github.com/MicrosoftDocs/vs-tutorial-samples MulticontainerSample в папке Docker . Пример решения содержит два проекта: серверную часть Web API и фронтенд ASP.NET Razor, как было создано вами в другом руководстве. Вы также можете создать два проекта с нуля, так как они являются очень простыми изменениями шаблонов по умолчанию, следуя следующему руководству. Можно пропустить шаги Docker Compose.

Предпосылки

  • Подписка Azure. Зарегистрируйтесь на бесплатную пробную версию.
  • Visual Studio или более поздней версии с установленными рабочими нагрузками разработки Azure и ASP.NET и веб-разработки .
  • Проект https://github.com/MicrosoftDocs/vs-tutorial-samples MulticontainerSample в папке Docker . Пример решения содержит два проекта: серверную часть Web API и фронтенд ASP.NET Razor, как было создано вами в другом руководстве. Вы также можете создать два проекта с нуля, так как они являются очень простыми изменениями шаблонов по умолчанию, следуя следующему руководству. Можно пропустить шаги Docker Compose.

Развертывание серверной части веб-API

  1. В обозревателе решений щелкните правой кнопкой мыши по элементу проекта веб-API и выберите Опубликовать.

  2. Выберите целевую версию Azure и выберите "Приложения контейнеров Azure".

  3. Если вы еще не вошли в систему с учетной записью, связанной с подпиской Azure, вы можете войти прямо сейчас или изменить арендатора, если это необходимо.

  4. На экране, на котором указано приложение контейнера, нажмите кнопку "Создать" , чтобы создать новое приложение контейнера.

    В процессе публикации снимок экрана показывает экран, на котором вы указываете существующее приложение-контейнер или создаете новое для веб-API.

  5. На странице "Создание приложения контейнера Azure" введите такие сведения, как группа ресурсов. На этом шаге создается новая группа ресурсов, новая среда контейнера и новый реестр контейнеров.

    Снимок экрана: экран в процессе публикации, в котором создается новое приложение контейнера.

    Для создания ресурсов может потребоваться немного времени. По завершении нажмите кнопку "Далее ", чтобы перейти к следующему шагу.

  6. На следующем шаге создается реестр контейнеров. Если вы создаете новый реестр контейнеров, вам будет предложено получить несколько сведений. Вы можете выбрать тот же регион и группу ресурсов, что и приложение контейнера.

  7. Следующий шаг просит выбрать тип сборки контейнера. Если у вас нет файла Dockerfile, выберите .NET SDK, а если есть, выберите Docker Desktop.

    Снимок экрана: выбор типа сборки контейнера с выбранным Docker Desktop.

  8. Для типа развертывания выберите "Опубликовать" (создать pubxml-файл), чтобы создать профиль публикации.

    Снимок экрана: выбор типа развертывания с выбранным параметром публикации в pubxml-файле.

  9. Нажмите кнопку "Готово ", чтобы завершить процесс публикации и создать профиль публикации. Если появится запрос о дополнительной конфигурации для доступа к опубликованному контейнеру, нажмите кнопку "Да".

    Запросить разрешение на предоставление доступа пользователю Admin.

    Вы видите страницу, показывающую активность в Azure, а закрыв её, на экране публикации теперь отображается информация о вашем приложении-контейнере, например, URL-адрес для входящего трафика в веб-API.

    Снимок экрана: экран публикации после завершения процесса публикации.

    Нажмите кнопку "Опубликовать ", чтобы опубликовать в приложении контейнера Azure. Visual Studio запрашивает создание ресурсов Azure и запускает процесс публикации для приложения контейнера WebAPI.

    Visual Studio может попытаться загрузить страницу для нового приложения контейнера, но это не должно работать на этом этапе.

Теперь, когда вы опубликовали один раз, вы создали профиль публикации (.pubxml файл), поэтому вам не нужно повторять эти действия при следующей публикации. Просто нажмите кнопку "Опубликовать " на этом экране, если вы не хотите начать работу или изменить любой из указанных ресурсов Azure.

Позже вы будете использовать портал Azure для внесения дополнительных изменений конфигурации для Ingress и поддержки Azure Redis Cache, но сначала в следующем разделе вы опубликуете интерфейс веб-сайта.

Развертывание фронтенда

  1. Измените файл кода фронтенда в Index.cshtml.cs, чтобы ссылаться на новый URL для контейнерного приложения Web API. Это имя, отображаемое в разделе "Имя ресурса " на экране публикации веб-API. Для обмена данными между контейнерами можно напрямую использовать HTTP с именем приложения-контейнера, не указывая полное доменное имя (FQDN) и номер порта. В методе OnGet замените существующую строку, устанавливающую RequestUri так, чтобы она ссылалась на имя приложения контейнера веб-API, как показано в следующем коде.

     request.RequestUri = new Uri("http://<mywebapi-container-app-name>/Counter");
    
    
  2. В Обозревателе решений щелкните правой кнопкой мыши на узле проекта Webfrontend и выберите «Опубликовать». На следующем экране нажмите кнопку "Создать" , чтобы создать новое приложение контейнера.

  3. На экране создания приложения контейнера Azure выберите ту же группу ресурсов и ту же среду контейнеров, созданную при публикации проекта веб-API.

    Снимок экрана: экран в процессе публикации, в котором указывается существующий контейнер или создается новый для веб-интерфейсов.

  4. Важно! Выберите тот же реестр контейнеров, который вы создали ранее.

    Снимок экрана: экран в процессе публикации, в котором вы создаете приложение контейнера webfrontend, обязательно выберите тот же реестр контейнеров, что и вы создали ранее.

  5. Выберите те же параметры, что и для веб-API для других шагов. Тип сборки контейнера — Docker Desktop, а тип развертывания — Publish (создает pubxml-файл).

  6. Нажмите кнопку "Готово ", чтобы завершить процесс публикации и создать профиль публикации. Вы увидите страницу, показывающую действие в Azure и закрывая ее, экран публикации теперь содержит сведения о приложении-контейнере, например URL-адрес для входящего трафика в приложение Webfrontend.

Просмотр и настройка приложений-контейнеров на портале Azure

  1. Войдите на портал Azure.
  2. Найдите приложения контейнеров и найдите только что созданные.
  3. Выберите Ingress и настройте следующие параметры:
    1. На экране Ingress установите входящий трафик на Ограничено средой контейнерных приложений. Это означает, что только веб-интерфейс может отправлять запросы. Даже Visual Studio не сможет получить доступ к этой службе, например при завершении процесса публикации, и Visual Studio пытается загрузить страницу, вы получите ошибку в браузере вместо доступа к службе. Это ожидается.

    2. Проверьте порт входящего трафика (он должен быть 8080). Вы используете HTTP для вызова веб-API, и вы можете напрямую ссылаться на приложение-контейнер по имени в URI запроса. Полное доменное имя (FQDN), созданное с помощью Azure Container Apps, использует URL-адрес HTTPS (как показано на экране Публикация в Visual Studio), но внутренний трафик может обойти его.

    3. Для Webfrontend Ingress можно принять значения по умолчанию. Целевой порт — 8080, потому что компонент Ingress безопасно обрабатывает все запросы, используя полное доменное имя и HTTPS (или перенаправляет HTTP на HTTPS), и отправляет их на веб-интерфейс через HTTP на порту контейнера 8080.

Создание кэша Redis Для Azure

Выполните следующие действия, чтобы создать кэш Redis Azure в той же группе ресурсов, что и приложения контейнеров.

  1. На портале Azure откройте созданное ранее приложение контейнера веб-API. Откройте экран соединителя службы и нажмите кнопку "Создать". Откроется раздел "Создание подключения ".

  2. На экране "Создание подключения " введите тип службы в качестве кэша для Redis и нажмите кнопку "Создать" , чтобы создать новый кэш Redis.

    Снимок экрана: экран соединителя службы в приложении контейнера веб-API.

  3. Выберите кэш или следуйте ссылке "Создать" , чтобы создать кэш. При создании нового кэша может потребоваться вернуться в приложение контейнера и соединитель службы и повторить предыдущие шаги, чтобы создать подключение.

  4. Для базы данных выберите "0", чтобы создать первую нумерованную базу данных для этого кэша.

  5. Перейдите на вкладку "Проверка подлинности ". Выберите управляемое удостоверение, назначаемое системой. Примите все остальные значения по умолчанию и нажмите кнопку "Создать". Это создает подключение к кэшу.

  6. Вернитесь в раздел соединителя службы приложения-контейнера веб-API, обновите, чтобы увидеть только что подключенный кэш (если он еще не отображается) и установите флажок рядом с кэшем. Выберите "Проверить" , чтобы проверить состояние подключения. Узел кэша можно развернуть, чтобы просмотреть значения переменных среды для этого кэша Azure. Для работы с этим руководством вам потребуется только AZURE_REDIS_HOST, но вы можете использовать другие элементы в реальном коде или для более полной настройки. Используйте приведенные здесь значения, чтобы задать переменные среды в Dockerfile, как описано в следующем разделе, чтобы веб-API смог подключиться к кэшу.

Дополнительные сведения см. в кратком руководстве по созданию подключения к службе для приложений контейнеров Azure на портале Azure.

Настройка ролей для управляемой идентификации

На портале Azure вы используете Управление доступом (IAM) в кэше Redis для предоставления доступа Участника к управляемому удостоверению, назначенному системой в приложении-контейнере.

  1. На портале Azure откройте страницу кэша Redis Azure и выберите "Управление доступом" (IAM).
  2. Выберите пункт Добавить>Добавить назначение ролей. Откроется страница добавления назначения ролей.
  3. Выберите вкладку «Участники» и выберите управляемое удостоверение.
  4. Выберите участников. Откроется страница "Выбор участников" и выберите управляемое удостоверение, назначаемое системой.
  5. Выберите приложение-контейнер, а затем приложение-контейнер для веб-API.
  6. На вкладке "Роль" выберите "Участник кэша Redis".
  7. Выберите Рецензирование и назначение. Система обрабатывает запрос.
  8. Откройте назначения ролей , чтобы просмотреть управляемое удостоверение, назначаемое системой, под ролью участника кэша Redis .

Следующий шаг — изменить конфигурацию кэша в клиенте веб-API, чтобы использовать DefaultAzureCredentialэтот метод. Это рекомендуемый способ проверки подлинности при использовании управляемого удостоверения, назначаемого системой. Чтобы получить доступ к ресурсам через эту форму управления удостоверениями, от пользователя, обращающегося к приложению извне, не требуется иметь определённые назначения ролей на уровне пользователя. Дополнительные сведения см. в разделе Интеграция Azure Redis Cache — управляемое удостоверение, назначенное системой.

Измените проект веб-API, чтобы ссылаться на службу Azure Redis Cache.

Перед публикацией проекта веб-API для запуска в Azure обновите его, чтобы ссылаться на кэш Redis Azure и использовать управляемое удостоверение для безопасного доступа к нему. Для этого можно изменить код конфигурации кэша в Program.cs.

Для Azure Redis Cache вы устанавливаете переменную среды AZURE_REDIS_HOST с информацией о подключении, а затем считываете её в коде запуска, чтобы подключиться к Azure Redis Cache и настроить кэш.

Вы используете Azure.Identity, чтобы получить DefaultAzureCredential, который осуществляет безопасную проверку подлинности с помощью управляемого удостоверения.

  1. В Visual Studio в проекте веб-API добавьте ссылку на пакеты Azure Identity NuGet и Microsoft.Azure.StackExchange.Redis.

  2. Добавьте директивы "using" для недавно добавленных пакетов.

    using Azure.Identity;
    using Microsoft.Azure.StackExchange.Redis;
    
  3. Обновите код конфигурации для кэша Redis. Удалите старый код и замените его следующим кодом. Вы можете просмотреть комментарии позже и раскомментировать любой необязательный код, чтобы соответствовать собственным более сложным сценариям.

     // Check the environment variable for the Redis cache host name
     var cacheHostName = Environment.GetEnvironmentVariable("AZURE_REDIS_HOST");
     if (string.IsNullOrEmpty(cacheHostName))
     {
         throw new InvalidOperationException("The environment variable 'AZURE_REDIS_HOST' is not set.");
     }
    
     var configurationOptions = ConfigurationOptions.Parse($"{cacheHostName}:6380");
    
     // For system-assigned identity.
     // In the Azure portal, we need to set up Redis service to grant Contributor access to the system-assigned identity
     // for the container app that hosts this Web API service.
     await configurationOptions.ConfigureForAzureWithTokenCredentialAsync(new DefaultAzureCredential());
    
     var connectionMultiplexer = await ConnectionMultiplexer.ConnectAsync(configurationOptions);
    
     builder.Services.AddStackExchangeRedisCache(options =>
     {
         options.ConfigurationOptions = configurationOptions;
         options.InstanceName = "SampleInstance";
     });
    
     // Uncomment the following line if you need to use the ConnectionMultiplexer directly
     // (for example, for advanced Redis operations like Pub/Sub or working with Redis data structures).
     // builder.Services.AddSingleton<IConnectionMultiplexer>(sp =>
     //     ConnectionMultiplexer.Connect(configurationOptions));
    
    

    Метод проверки подлинности, заданный ранее при создании подключения к кэшу, является назначаемым системой управляемым удостоверением, поэтому код здесь согласован с этим выбором. Если вы хотите использовать другие методы проверки подлинности, необходимо внести изменения в код здесь. См. интеграция с кэшем Azure Redis - управляемое удостоверение, назначенное системой.

    Создайте проект веб-API, чтобы убедиться, что ошибки отсутствуют.

  4. Если у вас есть Dockerfile, обновите базовую стадию Dockerfile, чтобы определить переменную среды AZURE_REDIS_HOST. Хост можно получить на портале Azure при создании кэша Azure Redis или в разделе Соединитель службы на странице контейнерного приложения веб-API в портале (см. предыдущий раздел).

    ENV AZURE_REDIS_HOST mycache.redis.cache.windows.net
    

    (Необязательно) Можно определить другие параметры конфигурации в переменных среды, AZURE_REDIS_PORT например 6380. Для простоты это значение жестко закодировано вместо использования переменной среды. Возможно, вы также хотите установить ASPNETCORE_ENVIRONMENT на Development.

    Если вы используете тип сборки контейнера пакета SDK для .NET (без Dockerfile), можно задать переменную среды в launchSettings.json в разделе profiles > http.

     "http": {
       "commandName": "Project",
       "dotnetRunMessages": true,
       "launchBrowser": true,
       "launchUrl": "swagger",
       "applicationUrl": "http://localhost:5107",
       "environmentVariables": {
         "ASPNETCORE_ENVIRONMENT": "Development",
         "AZURE_REDIS_HOST": "cache11.redis.cache.windows.net"
       }
     }
    
  5. Вы готовы опубликовать и проверить эти изменения. Нажмите кнопку "Опубликовать " на экране публикации . Visual Studio попытается загрузить страницу, но это завершается ошибкой, так как приложение контейнера веб-API недоступно для запросов за пределами среды приложения контейнера.

Прежде чем запустить приложение с кэшем Azure Redis, необходимо настроить управляемое удостоверение с правильными разрешениями для доступа к кэшу.

Тестирование приложения

Вернитесь на экран Publish в проекте Webfrontend и щелкните по ссылке Webfrontend URL. При обновлении страницы должно появиться приложение webfrontend с счетчиком, который обновляется.

Подсказка

Приложения контейнеров Azure стремятся максимально повысить время работы служб. Если что-то идет не так с одной из служб, так что она не проходит проверку работоспособности, Azure Container Apps не будут устанавливать её в качестве активной версии и использовать её для обработки запросов. В результате во время процесса разработки и тестирования иногда можно обнаружить, что последние изменения, внесенные вами, не отражаются на динамическом сайте. На портале Azure выберите редакции и реплики , чтобы просмотреть состояние последней опубликованной редакции. После этого вы можете открыть журналы, чтобы устранить проблему.

Поздравляю! Вы успешно опубликовали многоконтайнерное приложение в приложениях контейнеров Azure и проверили обмен данными между контейнерами и использование кэша Redis в приложении.

Очистите ресурсы

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

Дальнейшие шаги

  • Дополнительные сведения о приложениях контейнеров Azure.
  • Узнайте о .NET Aspire, технологии, помогающие более легко разрабатывать сложные контейнерные приложения и службы, которые интегрируются с различными ресурсами в Azure. .NET Aspire поддерживает оркестрацию времени разработки, стандартизованную интеграцию с массивом служб, а также поддержку инструментов с шаблонами проектов Visual Studio.
  • Интерфейс командной строки Azure (CLI) можно также использовать для работы с приложениями-контейнерами. Установите Azure CLI и приступите к работе с приложениями контейнеров Azure с помощью команд Azure CLI, выполнив команду Deploy Azure Container Apps с помощью команды az containerapp up.