Перенос приложений JBoss EAP в WildFly в Службе Azure KubernetesMigrate JBoss EAP applications to WildFly on Azure Kubernetes Service

Из этого руководства вы узнаете, что следует учитывать при переносе приложения JBoss EAP для запуска в WildFly в контейнере Службы Azure Kubernetes.This guide describes what you should be aware of when you want to migrate an existing JBoss EAP application to run on WildFly in an Azure Kubernetes Service container.

Подготовка к миграцииPre-migration

Чтобы обеспечить успешную миграцию, перед ее началом выполните шаги оценки и инвентаризации, описанные в следующих разделах.To ensure a successful migration, before you start, complete the assessment and inventory steps described in the following sections.

Проверка емкости сервераInventory server capacity

Определите характеристики оборудования текущих рабочих серверов (показатели памяти, ЦП и диска), а также среднее и пиковое количество запросов и объем потребляемых ресурсов.Document the hardware (memory, CPU, disk) of the current production server(s) as well as the average and peak request counts and resource utilization. Эти сведения понадобятся, независимо от выбранного пути миграции.You'll need this information regardless of the migration path you choose. Среди прочего это помогает определить размер виртуальных машин в пуле узлов, а также объем памяти, используемый контейнером, и общих ресурсов ЦП, требуемых для его работы.It is useful, for example, to help guide selection of the size of the VMs in your node pool, the amount of memory to be used by the container, and how many CPU shares the container would need.

Проверка всех секретовInventory all secrets

Проверьте все свойства и файлы конфигурации на рабочих серверах на наличие секретов и паролей.Check all properties and configuration files on the production server(s) for any secrets and passwords. Обязательно проверьте наличие файла jboss-web.xml в WAR-файлах.Be sure to check jboss-web.xml in your WARs. Кроме того, в приложении могут быть файлы конфигурации, содержащие пароли или учетные данные.Configuration files that contain passwords or credentials may also be found inside your application.

Мы рекомендуем хранить секреты в Azure KeyVault.Consider storing those secrets in Azure KeyVault. См. основные понятия Azure Key Vault.For more information, see Azure Key Vault basic concepts.

Проверка всех сертификатовInventory all certificates

Определите все сертификаты, используемые для общедоступных конечных точек SSL.Document all the certificates used for public SSL endpoints. Вы можете просмотреть все сертификаты на рабочих серверах, выполнив следующую команду:You can view all certificates on the production server(s) by running the following command:

keytool -list -v -keystore <path to keystore>

Проверка правильной работы поддерживаемой версии JavaValidate that the supported Java version works correctly

Для работы WildFly в Службе Azure Kubernetes требуется определенная версия Java, поэтому вам нужно убедиться, может ли приложение правильно работать с этой поддерживаемой версией.Using WildFly on Azure Kubernetes Service requires a specific version of Java, so you'll need to confirm that your application runs correctly using that supported version.

Примечание

Эта проверка особенно важна, если на текущем сервере используется неподдерживаемая версия JDK (например, Oracle JDK или IBM OpenJ9).This validation is especially important if your current server is running on an unsupported JDK (such as Oracle JDK or IBM OpenJ9).

Чтобы получить текущую версию Java, войдите на сервер в рабочей среде и выполните следующую команду:To obtain your current Java version, sign in to your production server and run the following command:

java -version

См. сведения о том, какую версию следует использовать для запуска WildFly.See Requirements for guidance on what version to use to run WildFly.

Проверка ресурсов JNDIInventory JNDI resources

Проверьте все ресурсы JNDI.Inventory all JNDI resources. Для других ресурсов, таких как брокеры сообщений JMS, может потребоваться выполнить миграцию или перенастройку.Some, such as JMS message brokers, may require migration or reconfiguration.

Определение того, используется ли репликация сеансовDetermine whether session replication is used

Если приложение использует репликацию сеансов, вам потребуется удалить из него эту зависимость.If your application relies on session replication, you'll have to change your application to remove this dependency.

В приложенииInside your application

Проверьте файлы WEB-INF/jboss-web.xml и (или) WEB-INF/web.xml.Inspect the WEB-INF/jboss-web.xml and/or WEB-INF/web.xml files.

Определение источников данныхDocument datasources

Если приложение использует какие-либо базы данных, необходимо определить следующие сведения:If your application uses any databases, you need to capture the following information:

  • имя источника данных;What is the datasource name?
  • конфигурация пула подключений;What is the connection pool configuration?
  • путь к JAR-файлу драйвера JDBC.Where can I find the JDBC driver JAR file?

См. сведения об источниках данных JBoss EAP в документации по JBoss EAP.For more information, see About JBoss EAP Datasources in the JBoss EAP documentation.

Определение того, используется ли файловая система и как именно она используетсяDetermine whether and how the file system is used

Для использования файловой системы на сервере приложений требуется перенастройка или, в редких случаях, изменение архитектуры.Any usage of the file system on the application server will require reconfiguration or, in rare cases, architectural changes. Файловая система может использоваться модулями JBoss EAP или кодом приложения.File system may be used by JBoss EAP modules or by your application code. Вы можете определить некоторые или все сценарии, описанные в следующих разделах.You may identify some or all of the scenarios described in the following sections.

Статическое содержимое только для чтенияRead-only static content

Если ваше приложение сейчас обслуживает статическое содержимое, вам потребуется альтернативное расположение для этого статического содержимого.If your application currently serves static content, you'll need an alternate location for it. Вы можете переместить статическое содержимое в хранилище BLOB-объектов Azure и включить Azure CDN для быстрого скачивания в глобальном масштабе.You may wish to consider moving static content to Azure Blob Storage and adding Azure CDN for lightning-fast downloads globally. См. руководство по размещению статических веб-сайтов в службе хранилища Azure и по интеграции учетной записи хранения Azure с Azure CDN.For more information, see Static website hosting in Azure Storage and Quickstart: Integrate an Azure storage account with Azure CDN.

Динамически опубликованное статическое содержимоеDynamically published static content

Если приложение допускает использование статического содержимого, которое передается или создается приложением и после этого становится неизменяемым, вы можете использовать хранилище BLOB-объектов Azure и Azure CDN, как описано выше, с Функциями Azure для выполнения отправки и обновления CDN.If your application allows for static content that is uploaded/produced by your application but is immutable after its creation, you can use Azure Blob Storage and Azure CDN as described above, with an Azure Function to handle uploads and CDN refresh. Практический пример реализации см. в руководстве по отправке и предварительной загрузке статического содержимого CDN с помощью Функций Azure.We've provided a sample implementation for your use at Uploading and CDN-preloading static content with Azure Functions.

Динамическое или внутреннее содержимоеDynamic or internal content

Для использования файлов, которые часто записываются и считываются приложением (например, временные файлы данных), или статических файлов, видимых только для вашего приложения, вы можете подключить общие папки службы хранилища Azure в качестве постоянных томов.For files that are frequently written and read by your application (such as temporary data files), or static files that are visible only to your application, you can mount Azure Storage shares as persistent volumes. См. сведения о динамическом создании и использовании постоянного тома с Файлами Azure в Службе Azure Kubernetes.For more information, see Dynamically create and use a persistent volume with Azure Files in Azure Kubernetes Service.

Определение того, использует ли приложение запланированные заданияDetermine whether your application relies on scheduled jobs

Запланированные задания, такие как задачи планировщика Quartz или UNIX CronJobs, НЕЛЬЗЯ использовать с Службой Azure Kubernetes.Scheduled jobs, such as Quartz Scheduler tasks or Unix cron jobs, should NOT be used with Azure Kubernetes Service. Служба Azure Kubernetes не будет препятствовать развертыванию приложения, содержащего запланированные задачи.Azure Kubernetes Service will not prevent you from deploying an application containing scheduled tasks internally. Но если приложение масштабируется, одно запланированное задание может выполняться несколько раз в течение указанного периода.However, if your application is scaled out, the same scheduled job may run more than once per scheduled period. Это может привести к нежелательным последствиям.This situation can lead to unintended consequences.

Чтобы выполнить запланированные задания в кластере AKS, определите требуемые задания Kubernetes CronJobs.To execute scheduled jobs on your AKS cluster, define Kubernetes CronJobs as needed. См. сведения о выполнении автоматизированных задач с помощью CronJob.For more information, see Running Automated Tasks with a CronJob.

Определение того, нужно ли подключаться к локальной средеDetermine whether a connection to on-premises is needed

Если вашему приложению требуется доступ к какой-либо из локальных служб, вам необходимо подготовить одну из служб подключения Azure.If your application needs to access any of your on-premises services, you'll need to provision one of Azure's connectivity services. Дополнительные сведения см. в статье Выбор решения для подключения локальной сети к Azure.For more information, see Choose a solution for connecting an on-premises network to Azure. Кроме того, необходимо выполнить рефакторинг приложения, чтобы использовать общедоступные API-интерфейсы, предоставляемые локальными ресурсами.Alternatively, you'll need to refactor your application to use publicly available APIs that your on-premises resources expose.

Определение того, используются ли очереди или разделы Java Message Service (JMS)Determine whether Java Message Service (JMS) Queues or Topics are in use

Если приложение использует очереди или разделы JMS, их необходимо перенести на внешний сервер JMS.If your application is using JMS Queues or Topics, you'll need to migrate them to an externally hosted JMS server. Использование Служебной шины Azure и Расширенного протокола управления очередью сообщений (AMQP) — это подходящая стратегия миграции для тех, кто работает с JMS.Azure Service Bus and the Advanced Message Queuing Protocol (AMQP) can be a great migration strategy for those using JMS. Сведения см. в руководстве по использованию JMS со Служебной шиной Azure и AMQP 1.0.For more information, see Use JMS with Azure Service Bus and AMQP 1.0.

Если постоянные хранилища JMS настроены, вам нужно записать их конфигурацию и применить ее после миграции.If JMS persistent stores have been configured, you must capture their configuration and apply it after the migration.

Определение того, использует ли приложение API, зависящие от JBoss EAPDetermine whether your application uses JBoss-EAP-specific APIs

Если приложение использует API, зависящие от JBoss EAP, необходимо выполнить рефакторинг для удаления этих зависимостей.If your application uses JBoss-EAP-specific APIs, you'll need to refactor it to remove those dependencies.

Определение того, использует ли приложение компоненты Entity Bean или bean-компоненты CMP в стиле EJB 2.xDetermine whether your application uses Entity Beans or EJB 2.x-style CMP Beans

Если ваше приложение использует компоненты Entity Bean или bean-компоненты CMP в стиле EJB 2.x, необходимо выполнить рефакторинг приложения, чтобы удалить эти зависимости.If your application uses Entity Beans or EJB 2.x style CMP beans, you'll need to refactor your application to remove these dependencies.

Определение того, используется ли клиент приложения Java EEDetermine whether the Java EE Application Client feature is in use

Если у вас есть клиентские приложения, подключающиеся к серверному приложению с помощью клиента приложения Java EE, необходимо выполнить рефакторинг как клиентских приложений, так и серверного приложения для использования API HTTP.If you have client applications that connect to your (server) application using the Java EE Application Client feature, you'll need to refactor both your client applications and your (server) application to use HTTP APIs.

Определение того, содержит ли приложение код, зависящий от ОСDetermine whether your application contains OS-specific code

Если приложение содержит код, зависящий от ОС узла, вам нужно выполнить рефакторинг кода для удаления этих зависимостей.If your application contains any code with dependencies on the host OS, then you'll need to refactor it to remove those dependencies. Например, вам нужно заменить все символы / или \, используемые в путях файловой системы, на File.Separator или Paths.get.For example, you may need to replace any use of / or \ in file system paths with File.Separator or Paths.get.

Определение того, используются ли таймеры EJBDetermine whether EJB timers are in use

Если приложение использует таймеры EJB, необходимо убедиться, что код таймера EJB может активироваться каждым экземпляром WildFly независимо друг от друга.If your application uses EJB timers, you'll need to validate that the EJB timer code can be triggered by each WildFly instance independently. Эта проверка необходима, так как в сценарии развертывания Службы Kubernetes Azure каждый таймер EJB будет активироваться в собственном экземпляре WildFly.This validation is needed because, in the Azure Kubernetes Service deployment scenario, each EJB timer will be triggered on its own WildFly instance.

Определение того, используются ли соединители JCADetermine whether JCA connectors are in use

Если приложение использует соединители JCA, проверьте, можно ли использовать соединитель JCA в WildFly.If your application uses JCA connectors, validate that you can use the JCA connector on WildFly. Если же реализация JCA зависит от JBoss EAP, необходимо выполнить рефакторинг приложения, чтобы удалить эту зависимость.If the JCA implementation is tied to JBoss EAP, you must refactor your application to remove that dependency. Если вы можете использовать соединитель JCA в WildFly, для его работы нужно добавить файлы JAR в путь к классу сервера и поместить необходимые файлы конфигурации в нужное расположение в каталогах сервера WildFly.If you can use the JCA connector on WildFly, then for it to be available, you must add the JARs to the server classpath and put the necessary configuration files in the correct location in the WildFly server directories.

Определение того, используется ли JAASDetermine whether JAAS is in use

Если приложение использует JAAS, необходимо определить настройки JAAS.If your application is using JAAS, you'll need to capture how JAAS is configured. Если используется база данных, ее можно преобразовать в домен JAAS в WildFly.If it's using a database, you can convert it to a JAAS domain on WildFly. Если используется пользовательская реализация, необходимо проверить, можно ли использовать ее в WildFly.If it's a custom implementation, you'll need to validate that it can be used on WildFly.

Определение того, использует ли приложение адаптер ресурсовDetermine whether your application uses a Resource Adapter

Если приложению требуется адаптер ресурсов, он должен быть совместим с WildFly.If your application needs a Resource Adapter (RA), it needs to be compatible with WildFly. Определите, хорошо ли работает адаптер ресурсов в отдельном экземпляре WildFly, развернув его на сервере и правильно настроив.Determine whether the RA works fine on a standalone instance of WildFly by deploying it to the server and properly configuring it. Если адаптер ресурсов работает правильно, добавьте JAR в путь к классу сервера образа Docker и поместите необходимые файлы конфигурации в нужное расположение в каталогах сервера WildFly, чтобы обеспечить доступность.If the RA works properly, you'll need to add the JARs to the server classpath of the Docker image and put the necessary configuration files in the correct location in the WildFly server directories for it to be available.

Определение того, состоит ли приложение из нескольких WAR-файловDetermine whether your application is composed of multiple WARs

Если приложение состоит из нескольких WAR-файлов, их следует рассматривать как отдельные приложения, как описано в этом руководстве.If your application is composed of multiple WARs, you should treat each of those WARs as separate applications and go through this guide for each of them.

Определение того, упаковано ли приложение как EAR-файлDetermine whether your application is packaged as an EAR

Если приложение упаковано как EAR-файл, обязательно проверьте файл application.xml, определив его конфигурацию.If your application is packaged as an EAR file, be sure to examine the application.xml file and capture the configuration.

Примечание

Если нужно масштабировать каждое веб-приложение отдельно для эффективного использования ресурсов AKS, следует разбить EAR на отдельные веб-приложения.If you want to be able to scale each of your web applications independently for better use of your AKS resources you should break up the EAR into separate web applications.

Определение всех внешних процессов и управляющих программ, запущенных на рабочих серверахIdentify all outside processes and daemons running on the production servers

Если за пределами сервера приложений выполняются какие-либо процессы (например, управляющие программы мониторинга), вам нужно будет удалить их или перенести в другое расположение.If you have any processes running outside the application server, such as monitoring daemons, you'll need to eliminate them or migrate them elsewhere.

Тестирование на местеPerform in-place testing

Прежде чем создавать образы контейнеров, перенесите приложение в JDK и версии WildFly для использования в AKS.Prior to creating your container images, migrate your application to the JDK and WildFly versions that you intend to use on AKS. Тщательно протестируйте приложение, чтобы обеспечить совместимость и высокую производительность.Test the application thoroughly to ensure compatibility and performance.

МиграцияMigration

Подготовка Реестра контейнеров Azure и Службы Kubernetes AzureProvision Azure Container Registry and Azure Kubernetes Service

Используйте следующие команды, чтобы создать Реестр контейнеров и кластер Azure Kubernetes, субъект-служба которого имеет роль читателя в реестре.Use the following commands to create a container registry and an Azure Kubernetes cluster with a Service Principal that has the Reader role on the registry. Не забудьте выбрать соответствующую модель сети в соответствии с требованиями к сети кластера.Be sure to choose the appropriate network model for your cluster's networking requirements.

az group create -g $resourceGroup -l eastus
az acr create -g $resourceGroup -n $acrName --sku Standard
az aks create -g $resourceGroup -n $aksName --attach-acr $acrName --network-plugin azure

Создание образа Docker для WildFlyCreate a Docker image for WildFly

Чтобы создать Dockerfile, вам потребуется следующее:To create a Dockerfile, you'll need the following prerequisites:

  • поддерживаемый пакет JDK;A supported JDK.
  • установленная версия WildFly;An install of WildFly.
  • среда выполнения JVM;Your JVM runtime options.
  • способ передачи переменных среды (если применимо).A way to pass in environment variables (if applicable).

Затем можно выполнить действия, описанные в следующих разделах, там, где это применимо.You can then perform the steps described in the following sections, where applicable. В качестве отправной точки для работы с Dockerfile и веб-приложения можно использовать репозиторий для быстрого начала работы с контейнерами WildFly.You can use the WildFly Container Quickstart repo as a starting point for your Dockerfile and web application.

  1. Настройка хранилища ключей FlexVolumeConfigure KeyVault FlexVolume
  2. Настройка источников данныхSet up data sources
  3. Настройка ресурсов JNDISet up JNDI resources
  4. Проверка конфигурации WildFlyReview WildFly configuration

Настройка хранилища ключей FlexVolumeConfigure KeyVault FlexVolume

Создайте хранилище ключей в Azure и укажите все необходимые секреты.Create an Azure KeyVault and populate all the necessary secrets. Дополнительные сведения см. в кратком руководстве Настройка и получение секрета из Azure Key Vault с помощью Azure CLI.For more information, see Quickstart: Set and retrieve a secret from Azure Key Vault using Azure CLI. Затем настройте хранилище ключей FlexVolume, чтобы сделать эти секреты доступными для групп pod.Then, configure a KeyVault FlexVolume to make those secrets accessible to pods.

Кроме того, потребуется обновить скрипт запуска, используемый для начальной загрузки WildFly.You will also need to update the startup script used to bootstrap WildFly. Этот скрипт перед запуском сервера должен импортировать сертификаты в хранилище ключей, используемое WildFly.This script must import the certificates into the keystore used by WildFly before starting the server.

настройка источников данных;Set up data sources

Чтобы настроить WildFly для доступа к источнику данных, необходимо добавить JAR-файл драйвера JDBC в образ Docker, а затем выполнить соответствующие команды интерфейса командной строки JBoss.To configure WildFly to access a data source, you'll need to add the JDBC driver JAR to your Docker image, and then execute the appropriate JBoss CLI commands. Эти команды должны настроить источник данных при создании образа Docker.These commands must set up the data source when building your Docker image.

Следующие шаги содержат инструкции для PostgreSQL, MySQL и SQL Server.The following steps provide instructions for PostgreSQL, MySQL and SQL Server.

  1. Загрузите драйвер JDBC для PostgreSQL, MySQL или SQL Server.Download the JDBC driver for PostgreSQL, MySQL, or SQL Server.

    Распакуйте загруженный архив, чтобы получить JAR-файл драйвера.Unpack the downloaded archive to get the driver .jar file.

  2. Создайте файл (например, с именем module.xml), и добавьте следующую разметку.Create a file with a name like module.xml and add the following markup. Замените заполнитель <module name> (включая угловые скобки) на org.postgres для PostgreSQL, на com.mysql для MySQL или на com.microsoft для SQL Server.Replace the <module name> placeholder (including the angle brackets) with org.postgres for PostgreSQL, com.mysql for MySQL, or com.microsoft for SQL Server. Замените <JDBC .jar file path> именем JAR-файла из предыдущего шага, включая полный путь к расположению, в которое будет помещен файл в образе Docker, например в /opt/database.Replace <JDBC .jar file path> with the name of the .jar file from the previous step, including the full path to the location you will place the file in your Docker image, for example in /opt/database.

    <?xml version="1.0" ?>
    <module xmlns="urn:jboss:module:1.1" name="<module name>">
        <resources>
           <resource-root path="<JDBC .jar file path>" />
        </resources>
        <dependencies>
            <module name="javax.api"/>
            <module name="javax.transaction.api"/>
        </dependencies>
    </module>
    
  3. Создайте файл (например, с именем datasource-commands.cli), и добавьте следующий код.Create a file with a name like datasource-commands.cli and add the following code. Замените <JDBC .jar file path> значением, использованным на предыдущем шаге.Replace <JDBC .jar file path> with the value you used in the previous step. Замените <module file path> именем файла и путем из предыдущего шага, например /opt/database/module.xml.Replace <module file path> with the file name and path from the previous step, for example /opt/database/module.xml.

    PostgreSQLPostgreSQL

    batch
    module add --name=org.postgres --resources=<JDBC .jar file path> --module-xml=<module file path>
    /subsystem=datasources/jdbc-driver=postgres:add(driver-name=postgres,driver-module-name=org.postgres,driver-class-name=org.postgresql.Driver,driver-xa-datasource-class-name=org.postgresql.xa.PGXADataSource)
    data-source add --name=postgresDS --driver-name=postgres --jndi-name=java:jboss/datasources/postgresDS --connection-url=$DATABASE_CONNECTION_URL --user-name=$DATABASE_SERVER_ADMIN_FULL_NAME --password=$DATABASE_SERVER_ADMIN_PASSWORD --use-ccm=true --max-pool-size=5 --blocking-timeout-wait-millis=5000 --enabled=true --driver-class=org.postgresql.Driver --exception-sorter-class-name=org.jboss.jca.adapters.jdbc.extensions.postgres.PostgreSQLExceptionSorter --jta=true --use-java-context=true --valid-connection-checker-class-name=org.jboss.jca.adapters.jdbc.extensions.postgres.PostgreSQLValidConnectionChecker
    reload
    run batch
    shutdown
    

    MySQLMySQL

    batch
    module add --name=com.mysql --resources=<JDBC .jar file path> --module-xml=<module file path>
    /subsystem=datasources/jdbc-driver=mysql:add(driver-name=mysql,driver-module-name=com.mysql,driver-class-name=com.mysql.cj.jdbc.Driver)
    data-source add --name=mysqlDS --jndi-name=java:jboss/datasources/mysqlDS --connection-url=$DATABASE_CONNECTION_URL --driver-name=mysql --user-name=$DATABASE_SERVER_ADMIN_FULL_NAME --password=$DATABASE_SERVER_ADMIN_PASSWORD --use-ccm=true --max-pool-size=5 --blocking-timeout-wait-millis=5000 --enabled=true --driver-class=com.mysql.cj.jdbc.Driver --jta=true --use-java-context=true --exception-sorter-class-name=com.mysql.cj.jdbc.integration.jboss.ExtendedMysqlExceptionSorter
    reload
    run batch
    shutdown
    

    SQL ServerSQL Server

    batch
    module add --name=com.microsoft --resources=<JDBC .jar file path> --module-xml=<module file path>
    /subsystem=datasources/jdbc-driver=sqlserver:add(driver-name=sqlserver,driver-module-name=com.microsoft,driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver,driver-datasource-class-name=com.microsoft.sqlserver.jdbc.SQLServerDataSource)
    data-source add --name=sqlDS --jndi-name=java:jboss/datasources/sqlDS --driver-name=sqlserver --connection-url=$DATABASE_CONNECTION_URL --validate-on-match=true --background-validation=false --valid-connection-checker-class-name=org.jboss.jca.adapters.jdbc.extensions.mssql.MSSQLValidConnectionChecker --exception-sorter-class-name=org.jboss.jca.adapters.jdbc.extensions.mssql.MSSQLExceptionSorter
    reload
    run batch
    shutdown
    
  4. Обновите конфигурацию источника данных JTA для приложения:Update the the JTA datasource configuration for your application:

    Откройте файл src/main/resources/META-INF/persistence.xml для приложения и найдите элемент <jta-data-source>.Open the src/main/resources/META-INF/persistence.xml file for your app and find the <jta-data-source> element. Замените его содержимое, как показано ниже:Replace its contents as shown here:

    PostgreSQLPostgreSQL

    <jta-data-source>java:jboss/datasources/postgresDS</jta-data-source>
    

    MySQLMySQL

    <jta-data-source>java:jboss/datasources/mysqlDS</jta-data-source>
    

    SQL ServerSQL Server

    <jta-data-source>java:jboss/datasources/postgresDS</jta-data-source>
    
  5. Добавьте следующий код в Dockerfile, чтобы при сборке образа Docker создавался источник данных.Add the following to your Dockerfile so the data source is created when you build your Docker image

    RUN /bin/bash -c '<WILDFLY_INSTALL_PATH>/bin/standalone.sh --start-mode admin-only &' && \
    sleep 30 && \
    <WILDFLY_INSTALL_PATH>/bin/jboss-cli.sh -c --file=/opt/database/datasource-commands.cli && \
    sleep 30
    
  6. Определите используемые адреса DATABASE_CONNECTION_URL, так как они отличаются для каждого сервера базы данных и отличаются от указанных на портале Azure.Determine the DATABASE_CONNECTION_URL to use as they are different for each database server, and different than the values on the Azure portal. Указанные здесь форматы URL-адресов являются обязательными при использовании WildFly:The URL formats shown here are required for use by WildFly:

    PostgreSQLPostgreSQL

    jdbc:postgresql://<database server name>:5432/<database name>?ssl=true
    

    MySQLMySQL

    jdbc:mysql://<database server name>:3306/<database name>?ssl=true\&useLegacyDatetimeCode=false\&serverTimezone=GMT
    

    SQL ServerSQL Server

    jdbc:sqlserver://<database server name>:1433;database=<database name>;user=<admin name>;password=<admin password>;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;
    
  7. При создании развертывания YAML на более позднем этапе потребуется передать с соответствующими значениями следующие переменные среды: DATABASE_CONNECTION_URL, DATABASE_SERVER_ADMIN_FULL_NAME и DATABASE_SERVER_ADMIN_PASSWORD.When creating your deployment YAML at a later stage you will need to pass the following environment variables, DATABASE_CONNECTION_URL, DATABASE_SERVER_ADMIN_FULL_NAME and DATABASE_SERVER_ADMIN_PASSWORD with the appropriate values.

Дополнительные сведения о настройке подключения к базе данных с помощью WildFly см. в статьях для PostgreSQL, MySQL или SQL Server.For more info on configuring database connectivity with WildFly, see PostgreSQL, MySQL, or SQL Server.

Настройка ресурсов JNDISet up JNDI resources

Чтобы настроить каждый ресурс JNDI для WildFly, обычно необходимо выполнить следующие действия.To set up each JNDI resource you need to configure on WildFly, you will generally use the following steps:

  1. Загрузите необходимые JAR-файлы и скопируйте их в образ Docker.Download the necessary JAR files and copy them into the Docker image.
  2. Создайте файл WildFly module.xml, ссылающийся на эти JAR-файлы.Create a WildFly module.xml file referencing those JAR files.
  3. Создайте конфигурацию, необходимую для определенного ресурса JNDI.Create any configuration needed by the specific JNDI resource.
  4. Создайте скрипт командной строки JBoss, который будет использоваться во время сборки Docker для регистрации ресурса JNDI.Create JBoss CLI script to be used during Docker build to register the JNDI resource.
  5. Добавьте все это в Dockerfile.Add everything to Dockerfile.
  6. Передайте соответствующие переменные среды в развертывание YAML.Pass the appropriate environment variables in your deployment YAML.

В приведенном ниже примере показаны шаги, необходимые для создания ресурса JNDI для подключения JMS к служебной шине Azure.The example below shows the steps needed to create the JNDI resource for JMS connectivity to Azure Service Bus.

  1. Загрузите поставщик JMS для Apache QpidDownload the Apache Qpid JMS provider

    Распакуйте загруженный архив, чтобы получить JAR-файлы.Unpack the downloaded archive to get the .jar files.

  2. Создайте файл (например, с именем module.xml), и добавьте следующую разметку в /opt/servicebus.Create a file with a name like module.xml and add the following markup in /opt/servicebus. Убедитесь, что номера версий JAR-файлов совпадают с именами JAR-файлов в предыдущем шаге.Make sure the version numbers of the JAR files align with the names of the JAR files of the previous step.

    <?xml version="1.0" ?>
    <module xmlns="urn:jboss:module:1.1" name="org.jboss.genericjms.provider">
     <resources>
      <resource-root path="proton-j-0.31.0.jar"/>
      <resource-root path="qpid-jms-client-0.40.0.jar"/>
      <resource-root path="slf4j-log4j12-1.7.25.jar"/>
      <resource-root path="slf4j-api-1.7.25.jar"/>
      <resource-root path="log4j-1.2.17.jar"/>
      <resource-root path="netty-buffer-4.1.32.Final.jar" />
      <resource-root path="netty-codec-4.1.32.Final.jar" />
      <resource-root path="netty-codec-http-4.1.32.Final.jar" />
      <resource-root path="netty-common-4.1.32.Final.jar" />
      <resource-root path="netty-handler-4.1.32.Final.jar" />
      <resource-root path="netty-resolver-4.1.32.Final.jar" />
      <resource-root path="netty-transport-4.1.32.Final.jar" />
      <resource-root path="netty-transport-native-epoll-4.1.32.Final-linux-x86_64.jar" />
      <resource-root path="netty-transport-native-kqueue-4.1.32.Final-osx-x86_64.jar" />
      <resource-root path="netty-transport-native-unix-common-4.1.32.Final.jar" />
      <resource-root path="qpid-jms-discovery-0.40.0.jar" />
     </resources>
     <dependencies>
      <module name="javax.api"/>
      <module name="javax.jms.api"/>
     </dependencies>
    </module>
    
  3. Создайте файл jndi.properties в /opt/servicebus.Create a jndi.properties file in /opt/servicebus.

    connectionfactory.${MDB_CONNECTION_FACTORY}=amqps://${DEFAULT_SBNAMESPACE}.servicebus.windows.net?amqp.idleTimeout=120000&jms.username=${SB_SAS_POLICY}&jms.password=${SB_SAS_KEY}
    queue.${MDB_QUEUE}=${SB_QUEUE}
    topic.${MDB_TOPIC}=${SB_TOPIC}
    
  4. Создайте файл (например, с именем servicebus-commands.cli), и добавьте следующий код.Create a file with a name like servicebus-commands.cli and add the following code.

    batch
    /subsystem=ee:write-attribute(name=annotation-property-replacement,value=true)
    /system-property=property.mymdb.queue:add(value=myqueue)
    /system-property=property.connection.factory:add(value=java:global/remoteJMS/SBF)
    /subsystem=ee:list-add(name=global-modules, value={"name" => "org.jboss.genericjms.provider", "slot" =>"main"}
    /subsystem=naming/binding="java:global/remoteJMS":add(binding-type=external-context,module=org.jboss.genericjms.provider,class=javax.naming.InitialContext,environment=[java.naming.factory.initial=org.apache.qpid.jms.jndi.JmsInitialContextFactory,org.jboss.as.naming.lookup.by.string=true,java.naming.provider.url=/opt/servicebus/jndi.properties])
    /subsystem=resource-adapters/resource-adapter=generic-ra:add(module=org.jboss.genericjms,transaction-support=XATransaction)
    /subsystem=resource-adapters/resource-adapter=generic-ra/connection-definitions=sbf-cd:add(class-name=org.jboss.resource.adapter.jms.JmsManagedConnectionFactory, jndi-name=java:/jms/${MDB_CONNECTION_FACTORY})
    /subsystem=resource-adapters/resource-adapter=generic-ra/connection-definitions=sbf-cd/config-properties=ConnectionFactory:add(value=${MDB_CONNECTION_FACTORY})
    /subsystem=resource-adapters/resource-adapter=generic-ra/connection-definitions=sbf-cd/config-properties=JndiParameters:add(value="java.naming.factory.initial=org.apache.qpid.jms.jndi.JmsInitialContextFactory;java.naming.provider.url=/opt/servicebus/jndi.properties")
    /subsystem=resource-adapters/resource-adapter=generic-ra/connection-definitions=sbf-cd:write-attribute(name=security-application,value=true)
    /subsystem=ejb3:write-attribute(name=default-resource-adapter-name, value=generic-ra)
    run-batch
    reload
    shutdown
    
  5. Добавьте следующий код в Dockerfile, чтобы при сборке образа Docker создавался источник JNDI.Add the following to your Dockerfile so the JNDI resource is created when you build your Docker image

    RUN /bin/bash -c '<WILDFLY_INSTALL_PATH>/bin/standalone.sh --start-mode admin-only &' && \
    sleep 30 && \
    <WILDFLY_INSTALL_PATH>/bin/jboss-cli.sh -c --file=/opt/servicebus/servicebus-commands.cli && \
    sleep 30
    
  6. При создании развертывания YAML на более позднем этапе потребуется передать с соответствующими значениями следующие переменные среды: MDB_CONNECTION_FACTORY, DEFAULT_SBNAMESPACE, SB_SAS_POLICY, SB_SAS_KEY, MDB_QUEUE, SB_QUEUE, MDB_TOPIC и SB_TOPIC.When creating your deployment YAML at a later stage you will need to pass the following environment variables, MDB_CONNECTION_FACTORY, DEFAULT_SBNAMESPACE and SB_SAS_POLICY, SB_SAS_KEY, MDB_QUEUE, SB_QUEUE, MDB_TOPIC and SB_TOPIC with the appropriate values.

Проверка конфигурации WildFlyReview WildFly configuration

Ознакомьтесь с руководством по администрированию WildFly, чтобы узнать о дополнительных шагах, выполняемых перед миграцией, не описанных в предыдущем руководстве.Review the WildFly Admin Guide to cover any additional pre-migration steps not covered by the previous guidance.

Сборка и передача образа Docker в Реестр контейнеров AzureBuild and push the Docker image to Azure Container Registry

После создания Dockerfile необходимо создать образ Docker и опубликовать его в Реестре контейнеров Azure.After you've created the Dockerfile, you'll need to build the Docker image and publish it to your Azure container registry.

Если вы использовали наш репозиторий GitHub для быстрого начала работы с контейнерами WildFly, процесс создания образа и его передачи в реестр контейнеров Azure будет аналогичен вызову следующих трех команд.If you used our WildFly Container Quickstart GitHub repo, the process of building and pushing your image to your Azure container registry would be the equivalent of invoking the following three commands.

В этих примерах переменная среды MY_ACR содержит имя Реестра контейнеров Azure, а переменная MY_APP_NAME содержит имя веб-приложения, используемого в Реестре контейнеров Azure.In these examples, the MY_ACR environment variable holds the name of your Azure container registry and the MY_APP_NAME variable holds the name of the web application you want to use on your Azure container registry.

Создание WAR-файла:Build the WAR file:

mvn package

Войдите в Реестр контейнеров Azure:Log into your Azure container registry:

az acr login -n ${MY_ACR}

Сборка и передача образа:Build and push the image:

az acr build -t ${MY_ACR}.azurecr.io/${MY_APP_NAME} -f src/main/docker/Dockerfile .

Кроме того, с помощью Docker CLI можно сначала создать и протестировать образ локально, как показано в следующих командах.Alternatively, you can use Docker CLI to first build and test the image locally, as shown in the following commands. Такой подход упрощает тестирование и дополнительную настройку образа перед первым развертыванием в ACR.This approach can simplify testing and refining the image before initial deployment to ACR. Однако для этого необходимо установить Docker CLI и убедиться, что управляющая программа Docker запущена.However, it requires you to install the Docker CLI and ensure the Docker daemon is running.

Сборка образа:Build the image:

docker build -t ${MY_ACR}.azurecr.io/${MY_APP_NAME}

Локальный запуск образа:Run the image locally:

docker run -it -p 8080:8080 ${MY_ACR}.azurecr.io/${MY_APP_NAME}

Теперь вы можете получить доступ к приложению по адресу http://localhost:8080.Your can now access your application at http://localhost:8080.

Войдите в Реестр контейнеров Azure:Log into your Azure container registry:

az acr login -n ${MY_ACR}

Передача образа в Реестр контейнеров Azure:Push the image to your Azure container registry:

docker push ${MY_ACR}.azurecr.io/${MY_APP_NAME}

Более подробные сведения о создании и хранении образов контейнеров в Azure см. в модуле Создание и хранение образов контейнеров с помощью службы "Реестр контейнеров Azure".For more in-depth information on building and storing container images in Azure, see the Learn module Build and store container images with Azure Container Registry.

Подготовка общедоступного IP-адресаProvision a public IP address

Если ваше приложение должно быть доступным за пределами внутренней или виртуальной сети, требуется общедоступный статический IP-адрес.If your application is to be accessible from outside your internal or virtual network(s), you'll need a public static IP address. Этот IP-адрес следует подготовить в группе ресурсов узла кластера, как показано в следующем примере:You should provision this IP address inside your cluster's node resource group, as shown in the following example:

nodeResourceGroup=$(az aks show -g $resourceGroup -n $aksName --query 'nodeResourceGroup' -o tsv)
publicIp=$(az network public-ip create -g $nodeResourceGroup -n applicationIp --sku Standard --allocation-method Static --query 'publicIp.ipAddress' -o tsv)
echo "Your public IP address is ${publicIp}."

Развертывание в AKSDeploy to AKS

Создайте и примените файлы YAML Kubernetes.Create and apply your Kubernetes YAML file(s). Дополнительные сведения см. в кратком руководстве Разверните кластер Службы Azure Kubernetes с помощью Azure CLI.For more information, see Quickstart: Deploy an Azure Kubernetes Service cluster using the Azure CLI. Если вы создаете внешний балансировщик нагрузки для приложения и контроллера входящего трафика, обязательно укажите IP-адрес (см. предыдущий раздел) в качестве LoadBalancerIP.If you're creating an external load balancer (whether for your application or for an ingress controller), be sure to provide the IP address provisioned in the previous section as the LoadBalancerIP.

Включите внешние параметры в качестве переменных среды.Include externalized parameters as environment variables. См. сведения об определении переменных среды для контейнера.For more information, see Define Environment Variables for a Container. Не включайте секреты (например, пароли, ключи API и строки подключения JDBC).Don't include secrets (such as passwords, API keys, and JDBC connection strings). Они описаны в следующих разделах.These are covered in the following section.

Не забудьте включить параметры памяти и ЦП при создании YAML развертывания, чтобы контейнеры имели правильный размер.Be sure to include memory and CPU settings when creating your deployment YAML so your containers are properly sized.

Настройка постоянного хранилищаConfigure persistent storage

Если для работы приложения требуется энергонезависимое хранилище, настройте один или несколько постоянных томов.If your application requires non-volatile storage, configure one or more Persistent Volumes.

Перенос запланированных заданийMigrate scheduled jobs

Чтобы выполнить запланированные задания в кластере AKS, определите требуемые задания Kubernetes CronJobs.To execute scheduled jobs on your AKS cluster, define Kubernetes CronJobs as needed. См. сведения о выполнении автоматизированных задач с помощью CronJob.For more information, see Running Automated Tasks with a CronJob.

Действия после миграцииPost-migration

После переноса приложения в Azure Kubernetes Service нужно убедиться, что оно работает правильно.Now that you've migrated your application to Azure Kubernetes Service, you should verify that it works as you expect. Выполнив проверку, можете применить некоторые рекомендации, которые помогут сделать ваше приложение более удобным для использования в облаке.After you've done that, we have some recommendations for you that can make your application more cloud-native.

РекомендацииRecommendations