Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье демонстрируются следующие возможности.
- Запустите приложение Java, Java EE, Jakarta EE или MicroProfile в среде выполнения Open Liberty или IBM WebSphere Liberty.
- Создайте образ Docker приложения с
az acr build
помощью образов контейнеров Open Liberty или WebSphere Liberty. - Разверните контейнерное приложение в кластере Служба Azure Kubernetes (AKS) с помощью оператора Open Liberty или WebSphere Liberty Operator.
Open Liberty Operator упрощает развертывание приложений, работающих в кластерах Kubernetes, и управление ими. С помощью оператора Open Liberty или Оператора WebSphere Liberty вы также можете выполнять более сложные операции, такие как сбор трассировок и дампов.
В этой статье используется предложение Azure Marketplace для Open Liberty или WebSphere Liberty, чтобы ускорить переход к AKS. Предложение автоматически выделяет некоторые ресурсы Azure, включая:
- Экземпляр реестра контейнеров Azure.
- Кластер AKS.
- Экземпляр Шлюза приложений контроллера входящего трафика (AGIC).
- Оператор Open Liberty и Оператор WebSphere Liberty.
- При необходимости, образ контейнера, включающий Liberty и ваше приложение.
Если вы предпочитаете пошаговое руководство вручную для запуска Liberty в AKS, ознакомьтесь с инструкциями по ручному развертыванию Java-приложения с использованием Open Liberty или WebSphere Liberty в кластере службы Azure Kubernetes (AKS).
Эта статья предназначена, чтобы помочь вам быстро приступить к развертыванию. Прежде чем перейти в рабочую среду, ознакомьтесь с документацией IBM по настройке Liberty.
Если вы заинтересованы в предоставлении отзывов или тесной работе над вашими сценариями миграции совместно с командой разработчиков, создающей решения WebSphere на Azure, заполните этот короткий опрос по миграции WebSphere и укажите ваши контактные данные. Команда руководителей программ, архитекторов и инженеров будет быстро связаться с вами, чтобы начать тесное сотрудничество.
Предварительные условия
- Подписка Azure. Если у вас нет аккаунта Azure, создайте бесплатную учетную запись перед началом.
- Подготовьте локальный компьютер с установленной операционной системой на базе Unix, например Ubuntu, Azure Linux, macOS или подсистемой Windows для Linux.
-
Установите Azure CLI для выполнения команд Azure CLI.
- Войдите в Azure CLI с помощью
az login
команды. Чтобы выполнить аутентификацию, следуйте инструкциям в окне терминала. Сведения о других параметрах входа см. в статье "Вход в Azure с помощью Azure CLI". - Установите расширение Azure CLI при первом использовании, когда появится соответствующий запрос. Дополнительные сведения о расширениях см. в статье "Использование расширений и управление ими" с помощью Azure CLI.
- Запустите
az version
, чтобы узнать установленную версию и зависимые библиотеки. Чтобы обновить до последней версии, выполните командуaz upgrade
. Для этой статьи требуется по крайней мере версия 2.61.0 Azure CLI.
- Войдите в Azure CLI с помощью
- Установите реализацию Java Standard Edition (SE) версии 17 (например, Eclipse Open J9).
- Установите Maven 3.9.8 или более поздней версии.
- Убедитесь, что установлен Git .
- Убедитесь, что вам назначена роль
Owner
или ролиContributor
иUser Access Administrator
в подписке. Это можно проверить, выполнив действия из раздела Список назначений ролей для пользователя или группы.
Создайте развертывание Liberty на AKS с помощью портала
Следующие инструкции предназначены для создания среды выполнения Liberty в службе AKS. После выполнения этих действий у вас будет экземпляр реестра контейнеров и кластер AKS для развертывания контейнерного приложения.
Переход на портал Azure. В поле поиска в верхней части страницы введите WebSphere Liberty/Open Liberty в Kubernetes. Когда появятся предложения, выберите единственное совпадение в разделе Marketplace.
Если вы предпочитаете, вы можете перейти непосредственно к предложению.
Нажмите кнопку создания.
На панели "Основные сведения":
- Создание группы ресурсов Так как группы ресурсов должны быть уникальными в подписке, выберите уникальное имя. Простой способ использовать уникальные имена — использовать сочетание инициалогов, сегодняшней даты и некоторых идентификаторов (например,
ejb0913-java-liberty-project-rg
). Сохраните имя группы ресурсов для дальнейшего использования в этой статье. - Для региона выберите регион, который находится рядом с вами. Например, выберите "Восточная часть США 2".
- Создание группы ресурсов Так как группы ресурсов должны быть уникальными в подписке, выберите уникальное имя. Простой способ использовать уникальные имена — использовать сочетание инициалогов, сегодняшней даты и некоторых идентификаторов (например,
Выберите Далее. На панели AKS можно по желанию выбрать существующий кластер AKS и экземпляр реестра контейнеров, вместо того чтобы создавать новые. Этот выбор позволяет использовать шаблон сайдкара, как показано в Центре архитектуры Azure. Вы также можете настроить параметры размера и количества виртуальных машин в пуле узлов AKS.
В целях этой статьи просто сохраните все значения по умолчанию на этой панели.
Выберите Далее. В области балансировки нагрузки, рядом с "Подключиться к шлюзу приложений Azure?", выберите "Да". В этом разделе можно настроить следующие параметры развертывания:
Для виртуальной сети и подсети можно при необходимости настроить виртуальную сеть и подсеть, в которую развертывание помещает ресурсы. Вам не нужно изменять остальные значения, заданные по умолчанию.
Для TLS/SSL-сертификата можно указать TLS/SSL-сертификат из Шлюз приложений Azure. Оставьте значения по умолчанию, чтобы предложение сгенерировало самоподписанный сертификат.
Не переходите в рабочую среду с самозаверенным сертификатом. Дополнительные сведения о самозаверяющих сертификатах см. в статье Создание самозаверяющего открытого сертификата для проверки подлинности приложения.
Вы можете выбрать включение привязки сессий на основе файлов cookie, также известных как липкие сеансы. В этой статье используются персистентные сеансы, поэтому не забудьте выбрать эту опцию.
Выберите Далее. В области операторов и приложений эта статья использует все значения по умолчанию. Однако можно настроить следующие параметры развертывания:
- Вы можете развернуть оператор WebSphere Liberty, выбрав "Да" для параметра Поддерживается IBM?. Если оставить по умолчанию Нет, развертывается оператор Open Liberty.
- Вы можете развернуть приложение для выбранного оператора, нажав кнопку "Да " для параметра "Развернуть приложение?". Выход из значения по умолчанию No не развертывает ни одно приложение.
Чтобы проверить параметры, выберите Просмотр и создание. На панели "Рецензирование и создание", когда Создать станет доступным после прохождения проверки, выберите его.
Развертывание может занять до 20 минут. Пока вы ожидаете завершения развертывания, выполните действия, описанные в разделе "Создание экземпляра База данных SQL Azure". После завершения этого раздела вернитесь сюда и продолжайте работу.
Извлечение выбранной информации из развертывания
Если вы отошли от экрана 'Развертывание в процессе', в следующих шагах показано, как вернуться на этот экран. Если вы все еще находитесь на панели, где показано , что развертывание завершено, перейдите в только что созданную группу ресурсов и перейдите к третьему шагу.
В углу любой страницы портала нажмите кнопку меню и выберите группы ресурсов.
В поле с текстовым фильтром для любого поля введите первые несколько символов созданной ранее группы ресурсов. Если вы выполнили рекомендуемое соглашение, введите инициалы и выберите соответствующую группу ресурсов.
В списке ресурсов в группе ресурсов выберите ресурс со значением типа реестра контейнеров.
В области навигации в разделе "Параметры" выберите ключи доступа.
Сохраните в сторону значения для имени реестра и сервера входа. Значок копирования рядом с каждым полем можно использовать для копирования значения в системный буфер обмена.
Примечание.
В этой статье используется команда
az acr build
для создания и отправки образа Docker в реестр контейнеров без использованияusername
иpassword
из реестра контейнеров. Имя пользователя и пароль по-прежнему можно использовать сdocker login
иdocker push
. Использование имени пользователя и пароля менее безопасно, чем проверка подлинности без пароля.Вернитесь к группе ресурсов, в которой развернуты ресурсы.
В разделе Параметры выберите Развертывания.
Выберите самое нижнее развертывание в списке. Значение имени развертывания соответствует идентификатору издателя предложения. Он содержит строку
ibm
.На панели навигации выберите выходные данные.
Используя тот же метод копирования, что и с предыдущими значениями, сохраните значения для следующих выходных данных:
cmdToConnectToCluster
appDeploymentTemplateYaml
Если развертывание не включает приложение. То есть вы выбрали "Нет " для развертывания приложения? При развертывании предложения Marketplace. В этой статье выбрано No. Однако если выбрано "Да", сохраните значениеappDeploymentYaml
, которое включает развертывание приложения.Вставьте значение
appDeploymentTemplateYaml
илиappDeploymentYaml
в оболочку Bash и выполните команду.Вывод этой команды — YAML-файл развертывания приложения. Найдите секрет TLS для входа с ключевым словом
secretName
, например- secretName: secret785e2c
. Отложите в сторону значениеsecretName
.
Выполните следующие команды, чтобы задать переменные среды, которые были записаны на предыдущих шагах. Эти переменные среды используются далее в этой статье.
export RESOURCE_GROUP_NAME=<your-resource-group-name>
export REGISTRY_NAME=<your-registry-nam-of-container-registry>
export LOGIN_SERVER=<your-login-server-of-container-registry>
export INGRESS_TLS_SECRET=<your-ingress-tls-secret-name>
Создание экземпляра Базы данных SQL Azure
В этом разделе вы создаете одиночную базу данных Azure SQL для использования вашим приложением.
Сначала задайте переменные среды, связанные с базой данных. Замените <your-unique-sql-server-name>
уникальным именем сервера База данных SQL Azure.
export SQL_SERVER_NAME=<your-unique-sql-server-name>
export DB_NAME=demodb
Выполните следующую команду в терминале, чтобы создать одну базу данных в Azure SQL Database и назначить текущего вошедшего в систему пользователя администратором Microsoft Entra. Дополнительные сведения см. в Кратком руководстве: Создание одной базы данных — Azure SQL Database.
export ENTRA_ADMIN_NAME=$(az account show --query user.name --output tsv)
az sql server create \
--name $SQL_SERVER_NAME \
--resource-group $RESOURCE_GROUP_NAME \
--enable-ad-only-auth \
--external-admin-principal-type User \
--external-admin-name $ENTRA_ADMIN_NAME \
--external-admin-sid $(az ad signed-in-user show --query id --output tsv)
az sql db create \
--resource-group $RESOURCE_GROUP_NAME \
--server $SQL_SERVER_NAME \
--name $DB_NAME \
--edition GeneralPurpose \
--compute-model Serverless \
--family Gen5 \
--capacity 2
Затем добавьте локальный IP-адрес в правила брандмауэра сервера База данных SQL Azure, чтобы разрешить локальному компьютеру подключаться к базе данных для локального тестирования позже.
export AZ_LOCAL_IP_ADDRESS=$(curl -s https://whatismyip.akamai.com)
az sql server firewall-rule create \
--resource-group $RESOURCE_GROUP_NAME \
--server $SQL_SERVER_NAME \
--name AllowLocalIP \
--start-ip-address $AZ_LOCAL_IP_ADDRESS \
--end-ip-address $AZ_LOCAL_IP_ADDRESS
Примечание.
В этой статье отключается проверка подлинности SQL для демонстрации рекомендаций по обеспечению безопасности. Идентификатор Microsoft Entra используется для проверки подлинности подключения к серверу. Если необходимо включить проверку подлинности SQL, см. раздел az sql server create
.
Создание подключения к службе в AKS через Service Connector
В этом разделе вы создаете подключение службы между кластером AKS и базой данных SQL Azure с использованием Идентификатора рабочей нагрузки Microsoft Entra и Service Connector. Это подключение позволяет кластеру AKS получить доступ к База данных SQL Azure без использования проверки подлинности SQL.
Сначала предоставьте приложению Azure Service Connector Resource Provider разрешения на уже развернутый шлюз приложений. Этот шаг необходим для успешного создания подключения к службе между кластером AKS и База данных SQL Azure.
- Перейдите к портал Azure и перейдите к созданной ранее группе ресурсов.
- В списке ресурсов в группе ресурсов выберите ресурс со значением типа шлюза приложений.
- Выберите Управление доступом (IAM). Затем разверните «Добавить» и выберите «Добавить назначение ролей».
- На вкладке "Роль" выберите роли привилегированного администратора. Затем выберите "Участник". Выберите Далее.
- На вкладке "Участники" выберите "Выбрать участников". Затем найдите приложение Azure Service Connector Resource Provider. Выберите приложение и нажмите кнопку "Выбрать". Выберите Далее.
- Выберите Проверить и присвоить. Подождите несколько секунд, пока назначение роли завершится.
Затем выполните следующие команды, чтобы создать соединение между кластером AKS и базой данных SQL, используя Workload ID Microsoft Entra с коннектором службы. Дополнительные сведения см. в статье Создание подключения к службе в AKS с использованием Service Connector (предварительная версия).
# Register the Service Connector and Kubernetes Configuration resource providers
az provider register --namespace Microsoft.ServiceLinker --wait
az provider register --namespace Microsoft.KubernetesConfiguration --wait
# Install the Service Connector passwordless extension
az extension add --name serviceconnector-passwordless
# Retrieve the AKS cluster and Azure SQL Server resource IDs
export AKS_CLUSTER_RESOURCE_ID=$(az aks show \
--resource-group $RESOURCE_GROUP_NAME \
--name $CLUSTER_NAME \
--query id \
--output tsv)
export AZURE_SQL_SERVER_RESOURCE_ID=$(az sql server show \
--resource-group $RESOURCE_GROUP_NAME \
--name $SQL_SERVER_NAME \
--query id \
--output tsv)
# Create a user-assigned managed identity used for workload identity
export USER_ASSIGNED_IDENTITY_NAME=workload-identity-uami
az identity create \
--resource-group ${RESOURCE_GROUP_NAME} \
--name ${USER_ASSIGNED_IDENTITY_NAME}
# Retrieve the user-assigned managed identity resource ID
export UAMI_RESOURCE_ID=$(az identity show \
--resource-group ${RESOURCE_GROUP_NAME} \
--name ${USER_ASSIGNED_IDENTITY_NAME} \
--query id \
--output tsv)
# Create a service connection between your AKS cluster and your SQL database using Microsoft Entra Workload ID
az aks connection create sql \
--connection akssqlconn \
--client-type java \
--source-id $AKS_CLUSTER_RESOURCE_ID \
--target-id $AZURE_SQL_SERVER_RESOURCE_ID/databases/$DB_NAME \
--workload-identity $UAMI_RESOURCE_ID
Примечание.
Мы рекомендуем использовать Microsoft Entra Workload ID для безопасного доступа к базе данных Azure SQL без использования SQL-аутентификации. Если необходимо использовать проверку подлинности SQL, пропустить предыдущие шаги в этом разделе и использовать имя пользователя и пароль для подключения к База данных SQL Azure.
Получите учетную запись и секрет, созданные коннектором сервисов.
Чтобы выполнить проверку подлинности в базе данных Azure SQL, необходимо получить учетную запись службы и секрет, созданный служебным соединителем. Следуйте инструкциям в разделе "Обновление контейнера" руководства. Подключение приложения AKS к База данных SQL Azure. Выполните параметр "Напрямую создать развертывание" с помощью предоставленного фрагмента кода YAML и выполните следующие действия.
Из выделенных разделов в примере YAML развертывания Kubernetes значения
serviceAccountName
иsecretRef.name
скопируйте, как показано в следующем примере.serviceAccountName: <service-account-name> containers: - name: raw-linux envFrom: - secretRef: name: <secret-name>
Используйте следующие команды для определения переменных среды. Замените
<service-account-name>
и<secret-name>
значениями, скопированными на предыдущем шаге.export SERVICE_ACCOUNT_NAME=<service-account-name> export SECRET_NAME=<secret-name>
Эти значения используются в следующем разделе для развертывания приложения Liberty в кластере AKS.
Примечание.
Секрет, созданный соединителем службы, содержит AZURE_SQL_CONNECTIONSTRING
, который представляет собой строку подключения без пароля к базе данных SQL Azure. Дополнительные сведения см. в примере значения в разделе Аутентификация управляемым удостоверением, назначаемым пользователем документа 'Интеграция базы данных Azure SQL с соединителем службы'.
Теперь, когда вы настроили базу данных и кластер AKS, можно перейти к подготовке AKS к размещению приложения Open Liberty.
Настройка и развертывание примера приложения
Выполните действия, описанные в этом разделе, чтобы развернуть пример приложения в среде выполнения Liberty. Эти шаги используют Maven.
Ознакомьтесь с приложением
Клонируйте пример кода для этой статьи. Пример размещен на сайте GitHub.
В репозитории содержится несколько примеров. В этой статье используется java-app. Выполните следующие команды, чтобы получить пример:
git clone https://github.com/Azure-Samples/open-liberty-on-aks.git
cd open-liberty-on-aks
export BASE_DIR=$PWD
git checkout 20241107
Если вы увидите сообщение о нахождении в режиме "detached HEAD", вы можете его спокойно игнорировать. Сообщение просто означает, что вы проверили тег.
Ниже приведена структура файлов приложения с важными файлами и каталогами:
java-app
├─ src/main/
│ ├─ aks/
│ │ ├─ openlibertyapplication-agic-passwordless-db.yaml
│ ├─ docker/
│ │ ├─ Dockerfile
│ │ ├─ Dockerfile-wlp
│ ├─ liberty/config/
│ │ ├─ server.xml
│ ├─ java/
│ ├─ resources/
│ ├─ webapp/
├─ pom.xml
├─ pom-azure-identity.xml
Каталоги java, java и webapp содержат исходный код примера приложения. В коде объявлен и используется источник данных с именем jdbc/JavaEECafeDB
.
В каталоге aks файл openlibertyapplication-agic-passwordless-db.yaml используется для развертывания образа приложения с помощью AGIC и без пароля подключения к База данных SQL Azure. В этой статье предполагается, что вы используете этот файл.
В каталоге Docker есть два файла для создания образа приложения с помощью Open Liberty или WebSphere Liberty.
В каталоге liberty/config файл server.xml используется для настройки подключения к базе данных для кластера Open Liberty и WebSphere Liberty. Он определяет переменнуюazure.sql.connectionstring
, используемую для подключения к База данных SQL Azure.
Файл pom.xml — это файл объектной модели проекта Maven, содержащий сведения о конфигурации проекта. Файл pom-azure-identity.xml объявляет зависимость от azure-identity
. Этот файл используется для проверки подлинности в службах Azure с помощью идентификатора Microsoft Entra.
Примечание.
В этом примере используется библиотека azure-identity
для аутентификации в базу данных Azure SQL с помощью аутентификации Microsoft Entra. Если вам нужно использовать аутентификацию SQL в приложении Liberty, см. Реляционные подключения к базе данных с JDBC.
Сборка проекта
Теперь, когда вы собрали необходимые свойства, создайте приложение. Файл POM для проекта считывает множество переменных из среды. В рамках сборки Maven эти переменные используются для заполнения значений в файлах YAML, расположенных в src/main/aks. Вы можете сделать что-то подобное для приложения за пределами Maven, если вы предпочитаете.
cd $BASE_DIR/java-app
# The following variables are used for deployment file generation into the target.
export LOGIN_SERVER=${LOGIN_SERVER}
export SC_SERVICE_ACCOUNT_NAME=${SERVICE_ACCOUNT_NAME}
export SC_SECRET_NAME=${SECRET_NAME}
export INGRESS_TLS_SECRET=${INGRESS_TLS_SECRET}
mvn clean install
mvn dependency:copy-dependencies -f pom-azure-identity.xml -DoutputDirectory=target/liberty/wlp/usr/shared/resources
Тестирование проекта локально
Запустите и протестируйте проект локально перед развертыванием в Azure. Для удобства в этой статье используется liberty-maven-plugin
. Дополнительные сведения см. в статье Open Liberty «Создание веб-приложения с помощью Maven».
Примечание.
Если выбрано развертывание базы данных без сервера, убедитесь, что база данных SQL не вошла в режим приостановки. Одним из способов сделать это является вход в систему через редактор запросов базы данных, как описано в руководстве "Quickstart: Используйте редактор запросов портала Azure (предварительная версия) для запроса базы данных SQL Azure".
Запустите приложение с помощью
liberty:run
.cd $BASE_DIR/java-app # The value of environment variable AZURE_SQL_CONNECTIONSTRING is read by configuration variable `azure.sql.connectionstring` in server.xml export AZURE_SQL_CONNECTIONSTRING="jdbc:sqlserver://$SQL_SERVER_NAME.database.windows.net:1433;databaseName=$DB_NAME;authentication=ActiveDirectoryDefault" mvn liberty:run
Убедитесь, что приложение работает правильно. Вы должны увидеть сообщение, аналогичное
[INFO] [AUDIT ] CWWKZ0001I: Application javaee-cafe started in 18.235 seconds.
, в выводе команды.http://localhost:9080/
Перейдите в браузер и убедитесь, что приложение доступно и все функции работают.Нажмите клавиши CTRL+C, чтобы остановиться. Нажмите клавишу Y , если вам будет предложено завершить пакетное задание.
По завершении удалите правило брандмауэра, позволяющее локальному IP-адресу получить доступ к База данных SQL Azure с помощью следующей команды:
az sql server firewall-rule delete \
--resource-group $RESOURCE_GROUP_NAME \
--server $SQL_SERVER_NAME \
--name AllowLocalIP
Создание образа для развертывания AKS
Теперь можно выполнить az acr build
команду для сборки образа, как показано в следующем примере:
cd $BASE_DIR/java-app/target
az acr build \
--registry ${REGISTRY_NAME} \
--image javaee-cafe:v1 \
.
Команда az acr build
отправляет артефакты, указанные в Dockerfile, в экземпляр реестра контейнеров, создает образ и сохраняет его в экземпляре реестра контейнеров.
Развертывание приложения в кластере AKS
Чтобы развернуть приложение Liberty в кластере AKS, выполните следующие действия.
Подключитесь к кластеру AKS.
Вставьте значение
cmdToConnectToCluster
в оболочку и выполните команду.Примените файл развертывания, выполнив следующие команды:
cd $BASE_DIR/java-app/target # Apply deployment file kubectl apply -f openlibertyapplication-agic-passwordless-db.yaml
Дождитесь успешного перезапуска всех подов, используя следующую команду:
kubectl get pods --watch
Похожие на следующий пример выходные данные указывают, что все pods запущены:
NAME READY STATUS RESTARTS AGE javaee-cafe-cluster-agic-67cdc95bc-2j2gr 1/1 Running 0 29s javaee-cafe-cluster-agic-67cdc95bc-fgtt8 1/1 Running 0 29s javaee-cafe-cluster-agic-67cdc95bc-h47qm 1/1 Running 0 29s
Тестирование приложения
При запуске pods можно протестировать приложение, используя общедоступный IP-адрес экземпляра Application Gateway.
Выполните следующую команду, чтобы получить и отобразить общедоступный IP-адрес экземпляра Шлюза приложений, предоставляемый ресурсом ingress, созданным AGIC.
export APP_URL=https://$(kubectl get ingress | grep javaee-cafe-cluster-agic-ingress | cut -d " " -f14)/
echo $APP_URL
Скопируйте URL-адрес и откройте его в браузере, чтобы просмотреть домашнюю страницу приложения. Если веб-страница не отображается правильно или возвращает ошибку 502 Bad Gateway
, приложение по-прежнему начинается в фоновом режиме. Подождите несколько минут и повторите попытку.
Очистка ресурсов
Чтобы избежать расходов за использование Azure, необходимо удалить ненужные ресурсы. Если кластер больше не нужен, используйте az group delete
команду для удаления группы ресурсов, службы контейнеров, реестра контейнеров, базы данных и всех связанных ресурсов:
az group delete --name $RESOURCE_GROUP_NAME --yes --no-wait
Следующие шаги
Дополнительные сведения см. в следующих ссылках:
- Служба Azure Kubernetes
- Руководство. Подключение приложения AKS к База данных SQL Azure
- Интегрировать базу данных Azure SQL с Service Connector
- Подключение с помощью проверки подлинности Microsoft Entra
- Open Liberty
- Оператор Open Liberty
- Конфигурация сервера Open Liberty
- Плагин Liberty Maven
- Образы контейнеров Open Liberty
- Образы контейнеров WebSphere Liberty
Дополнительные сведения о развертывании семейства IBM WebSphere в Azure см. в статье "Что такое решения для запуска семейства продуктов WebSphere в Azure?".
Azure Kubernetes Service