【AICon】AI 基础设施、LLM运维、大模型训练与推理,一场会议,全方位涵盖! >>> 了解详情
写点什么

Deploying Java EE apps to Azure: Part 3

  • 2020-03-30
  • 本文字数:7519 字

    阅读完需:约 25 分钟

Deploying Java EE apps to Azure: Part 3

This is the final blog in a series of posts that explore different options for running Java EE workloads on Azure. In this part, we will run the Java EE app on a Kubernetes cluster in Azure.



The previous parts covered how to deploy a Java EE application to an application server which is set up in a Virtual Machine on Microsoft Azureas well as a Docker container in Azure Container Instances.



The example used in the blog post is a simple three-tier application that uses Java EE 8 specifications such as JAX-RS, EJB, CDI, JPA, JSF, Bean Validation. We will use the Payara Server to deploy the application and use PostgreSQL as the relational database.


During the course of the tutorial, we will cover:


  • Postgres setup on Azure

  • Setup and configure Azure Kubernetes Service cluster and Azure Container Registry

  • Dockerize the Java EE app

  • Deploy the application to Kubernetes

  • Explore its functionality


Except for minor changes, the application used in this tutorial has been adapted from this project by Reza Rahman

Pre-requisites

You will need a Microsoft Azure account and the Azure CLI to work through the tutorial.


If you don’t have a Microsoft Azure account, go ahead and sign up for a free one!. The Azure CLI is a cross-platform command-line experience for managing Azure resources — please install it using these instructions.

First things first…

Set your Azure Subscription ID using the Azure CLI which will be used for this tutorial.


To set your Azure subscription ID


export AZURE_SUBSCRIPTION_ID=[to be filled]az account set --subscription $AZURE_SUBSCRIPTION_ID
复制代码


Create a resource group that will contain all the services (resources) which you will create as a part of this tutorial. A resource group is like a logical container that holds related resources for an Azure solution. The resource group includes those resources that you want to manage as a group.


To create a resource group


export AZURE_RESOURCE_GROUP_NAME=[to be filled]export AZURE_LOCATION=[to be filled]az group create --name $AZURE_RESOURCE_GROUP_NAME --location $AZURE_LOCATION
复制代码

Install Postgres on Azure

Azure Database for PostgreSQL is a relational database service based on the open-source Postgres database engine. It’s a fully managed database-as-a-service offering which is available in two deployment options, as a single server and as a Hyperscale (Citus) cluster


We will be using the single server option for the purposes of this tutorial


We will use the az postgres server createcommand to create a Postgres server instance on Azure. First, set up some of the server properties such as the name, admin user, etc.


export AZURE_POSTGRES_SERVER_NAME=[to be filled]export AZURE_POSTGRES_ADMIN_USER=[to be filled]export AZURE_POSTGRES_ADMIN_PASSWORD=[to be filled]export SKU=B_Gen5_1export STORAGE=5120
复制代码


For storage and SKU options, please refer to the documentation


And, then invoke the command to initiate the database instance creation:


az postgres server create --resource-group $AZURE_RESOURCE_GROUP_NAME --name $AZURE_POSTGRES_SERVER_NAME  --location $AZURE_LOCATION --admin-user $AZURE_POSTGRES_ADMIN_USER --admin-password $AZURE_POSTGRES_ADMIN_PASSWORD --storage-size $STORAGE --sku-name $SKU
复制代码


The provisioning process will take a few minutes.


To check the details of the Postgres database instance you just provisioned, invoke az postgres server show command


az postgres server show --resource-group $AZURE_RESOURCE_GROUP_NAME --name $AZURE_POSTGRES_SERVER_NAME
复制代码


You should get a JSON response. Please note down the value for the fullyQualifiedDomainName attribute as you will be using this to connect to the Postgres instance later.


It should be of the format: *[AZURE_POSTGRES_DB_NAME].postgres.database.azure.com*

Azure Kubernetes Service (AKS) setup

You need the az aks create command to stand up a Kubernetes cluster on Azure


To keep things simple, the below command creates a single node cluster. Feel free to change the specification as per your requirements


export AKS_CLUSTER_NAME=[to be filled]az aks create --resource-group $AZURE_RESOURCE_GROUP --name $AKS_CLUSTER_NAME --node-count 1 --node-vm-size Standard_B2s --node-osdisk-size 30 --generate-ssh-keys
复制代码


Get the AKS cluster credentials using az aks get-credentials - as a result, kubectl will now point to your new cluster. You can confirm the same


az aks get-credentials --resource-group $AZURE_RESOURCE_GROUP --name $AKS_CLUSTER_NAMEkubectl get nodes
复制代码


If you are interested in learning Kubernetes and Containers using Azure, simply create a *free*account and get going! A good starting point is to use the quickstarts, tutorials and code samples in the documentation to familiarize yourself with the service. I also highly recommend checking out the 50 days Kubernetes Learning Path. Advanced users might want to refer to Kubernetes best practices or the watch some of the videos for demos, top features and technical sessions.

Allow AKS to access the Postgres database

The Postgres database is not accessible to external services by default. We can use the az postgres server firewall-rule create command to create a firewall rule to explicitly allow Azure services to access the Postgres instance. This will allow the JavaEE application deployed in AKS to communicate with Postgres.


export FIREWALL_RULE_NAME=AllowJavaEECafeAppOnAKSaz postgres server firewall-rule create --resource-group $AZURE_RESOURCE_GROUP_NAME --server-name $AZURE_POSTGRES_SERVER_NAME --start-ip-address=0.0.0.0 --end-ip-address=0.0.0.0 --name $FIREWALL_RULE_NAME
复制代码


Note: This setting allows network connections from all IPs within the Azure network. For production use, try to configure the most restrictive firewall rules possible

Setup Azure Container Registry

Azure Container Registry is a managed, private Docker registry service to store and manage your private Docker container images (it based on the open-source Docker Registry 2.0). You can use Azure container registries with your existing container development and deployment pipelines, or use Azure Container Registry Tasks to build container images in Azure. You can either build on-demand, or fully automate builds with triggers such as source code commits and base image updates.


Let’s create a registry to store the Docker image for the JavaEE application. We will use the az acr createcommand


export ACR_NAME=[to-be-filled]az acr create --resource-group $AZURE_RESOURCE_GROUP_NAME --name $ACR_NAME --sku Basic --admin-enabled true
复制代码


We are using the *Basic* SKU. Valid value are: *Basic*, *Classic*, *Premium*, *Standard*


You can log in to the registry once it’s created and check the login server


az acr login --name $ACR_NAMEaz acr show --name $ACR_NAME --query loginServer --output table
复制代码


You will use the ACR login server name soon. Its value follows the format: *[ACR_NAME].azurecr.io*

Configure Azure Container Registry to work with Azure Kubernetes Service

To access images stored in Azure Container Registry, you must grant the Azure Kubernetes Service service principal the correct rights to pull images from ACR.


Get the appId of the service principal which is associated with your AKS cluster


AKS_SERVICE_PRINCIPAL_APPID=$(az aks show --name $AKS_CLUSTER_NAME --resource-group $AZURE_RESOURCE_GROUP --query servicePrincipalProfile.clientId -o tsv)
复制代码


Find the resource ID for Azure Container Registry


ACR_RESOURCE_ID=$(az acr show --resource-group $AZURE_RESOURCE_GROUP --name $ACR_NAME --query "id" --output tsv)
复制代码


Grant acrpull permissions to AKS service principal


az role assignment create --assignee $AKS_SERVICE_PRINCIPAL_APPID --scope $ACR_RESOURCE_ID --role acrpull
复制代码


Our AKS cluster along with ACR is ready to use!

Setup and prepare application image

Clone the git repository


git clone https://github.com/abhirockzz/javaee-on-azure-kubernetescd javaee-on-azure-kubernetes
复制代码


You need to enter the Postgres connectivity information to the ``attribute of the section inweb.xml`.


You can find the *web.xml* file under *javaee-on-azure-iaas/src/main/webapp/WEB-INF*


The format is as follows:


jdbc:postgresql://[POSTGRES_FQDN]:5432/postgres?user=[AZURE_POSTGRES_ADMIN_USER]@[AZURE_POSTGRES_SERVER_NAME]&password=[AZURE_POSTGRES_ADMIN_PASSWORD]&sslmode=require
复制代码


Here are the list placeholders which form a part of the JDBC URL:


  • POSTGRES_FQDN with value of fullyQualifiedDomainName

  • AZURE_POSTGRES_ADMIN_USER with admin user name used to provision PG

  • AZURE_POSTGRES_SERVER_NAME with server name used to provision PG

  • AZURE_POSTGRES_ADMIN_PASSWORD with admin password used to provision PG


Set the required values


export POSTGRES_FQDN=[to be filled]export AZURE_POSTGRES_ADMIN_USER=[to be filled]export AZURE_POSTGRES_SERVER_NAME=[to be filled]export AZURE_POSTGRES_ADMIN_PASSWORD=[to be filled]
复制代码


Simply use these commands to replace


export FILE_NAME=javaee-on-azure-iaas/src/main/webapp/WEB-INF/web.xmlsed -i 's/POSTGRES_FQDN/'"$POSTGRES_FQDN"'/g' $FILE_NAMEsed -i 's/AZURE_POSTGRES_SERVER_NAME/'"$AZURE_POSTGRES_SERVER_NAME"'/g' $FILE_NAMEsed -i 's/AZURE_POSTGRES_ADMIN_USER/'"$AZURE_POSTGRES_ADMIN_USER"'/g' $FILE_NAMEsed -i 's/AZURE_POSTGRES_ADMIN_PASSWORD/'"$AZURE_POSTGRES_ADMIN_PASSWORD"'/g' $FILE_NAME
复制代码


Here is an e.g. of what the `` section will look like:


<data-source>        <name>java:global/JavaEECafeDB</name>        <class-name>org.postgresql.ds.PGPoolingDataSource</class-name>        <url>jdbc:postgresql://foobar-pg.postgres.database.azure.com:5432/postgres?user=foobar@foobar-pg&amp;password=foobarbaz&amp;sslmode=require</url>    </data-source>
复制代码


The application is now configured. Let’s build it!


mvn clean install
复制代码


You should have the WAR file available. To confirm


ls -lrt target | grep javaee-cafe.war
复制代码

Build and push the image to Azure Container Registry

Our application artifact (WAR file) is ready. We can now build the Docker image and push it out to Azure Container Registry. Here is a quick look at the Dockerfile used for this


FROM payara/server-fullCOPY target/javaee-cafe.war $DEPLOY_DIRRUN wget https://jdbc.postgresql.org/download/postgresql-42.2.8.jarRUN cp /opt/payara/postgresql-42.2.8.jar ${PAYARA_DIR}/glassfish/domains/${DOMAIN_NAME}/lib && rm /opt/payara/postgresql-42.2.8.jarEXPOSE 8080
复制代码


It builds on top of the base image for payara/server-full, copies the WARfile to a folder from where it can be automatically detected and deployed, downloads the Postgres JDBC driver and places it in the appropriate location for the Payara application server. That’s it!


export DOCKER_IMAGE=javaee-cafedocker build -t $DOCKER_IMAGE .docker tag $DOCKER_IMAGE $ACR_NAME.azurecr.io/$DOCKER_IMAGE
复制代码


To push the image


docker push $ACR_NAME.azurecr.io/$DOCKER_IMAGE
复制代码


For e.g., if the ACR_NAME (name of the Azure Container Registry) is javaeecafe-acr, the resulting Docker image will be javaeecafe-acr.azurecr.io/javaee-cafe


Use az acr repository list command to check the image.


az acr repository list --name $ACR_NAME --output table
复制代码

Deploy the application to Azure Kubernetes Service

Before deploying the application, please update the Kubernetes manifest file javaee-cafe.yaml with the name of the Docker image. To be specific, update the spec.containers.image with the name of the Azure Container Registry which you specified above


It is assumed that the name of the Docker image is *javaee-azure*, if not please update that as well


spec:  containers:    - name: javaee-cafe      image: <replace_me>.azurecr.io/javaee-azure
复制代码


For e.g.


spec:  containers:    - name: javaee-cafe      image: javaeecafe-acr.azurecr.io/javaee-azure
复制代码


To deploy the application


kubectl apply -f javaee-cafe.yml
复制代码


This should spin up a Pod. Wait for it to transition to Running state.


kubectl get pods -l=app=javaee-cafe -w
复制代码


Once the Pod is Running, confirm that the application has been deployed successfully


kubectl logs -f <replace_with_pod_name>
复制代码


The application deployment should be in progress and finally, you should see the logs similar to the one below (with the Successfully autodeployedmessage)


[AutoDeploy] Successfully autodeployed : /foo/bar/payara5/glassfish/domains/domain1/autodeploy/javaee-cafe.war.]]
复制代码

Explore the application

We use a LoadBalancer Service type to ensure that our Java EE app is accessible outside of the cluster. The creation of a Kubernetes LoadBalancer``Service in Azure does exactly what it’s supposed to i.e. provision an Azure Load Balancer behind the scenes.


apiVersion: v1kind: Servicemetadata:  name: javaee-cafespec:  type: LoadBalancer  ports:    - port: 80      targetPort: 8080  selector:    app: javaee-cafe
复制代码


We can get the load balancer IP by using


kubectl get svc javaee-cafe

复制代码


where *javaee-cafe* is the name of the *Service*


The value of the EXTERNAL-IP is the load balancer IP and will be used to access the application

Access the JSF front end

Use your browser to access http://[LOAD_BALANCER_IP]/javaee-cafe. You can use the UI to create, delete and see coffees.


Use the REST API

The application also exposes a REST API for creating, deleting and listing coffees.


export JAVAEE_AKS_REST=http://[LOAD_BALANCER_IP]/javaee-cafe/rest/coffees
复制代码


e.g.


export JAVAEE_AKS_REST=http://23.101.24.139/javaee-cafe/rest/coffees
复制代码


Create coffees


curl -X POST $JAVAEE_AKS_REST -d '{"name":"cappuccino","price":"10"}' -H "Content-Type: application/json"curl -X POST $JAVAEE_AKS_REST -d '{"name":"caffe-latte","price":"15"}' -H "Content-Type: application/json"
复制代码


Get all coffees


curl -H "Accept: application/json" $JAVAEE_AKS_REST
复制代码


You should see a JSON response listing both the coffee options you just added


Get a coffee by ID


curl -H "Accept: application/json" $JAVAEE_AKS_REST/1
复制代码


Delete a coffee by ID


curl -X DELETE $JAVAEE_AKS_REST/1curl -H "Accept: application/json" $JAVAEE_AKS_REST
复制代码


Notice that cappuccino is now deleted

Scale

Right now, we have one instance of our application since we had set spec.replicas to 1 in the Kubernetes manifest. We can scale our application horizontally and Kubernetes will ensure that it spins up and maintains the required number of Pods. To add another instance


kubectl scale deployment javaee-cafe --replicas=2
复制代码


To confirm that another Pod has been spun up:


kubectl get pods -l=app=javaee-cafe -w
复制代码


You can continue accessing the application in the same manner and now the requests will be transparently load balanced amongst your app instances by the Load Balancer.

Clean up resources

Once you are done exploring the application, you can delete the resources. Since we used a resource group, it’s as easy as executing a single command.


Please be aware that this will delete all the resources in the group which includes the ones you created as part of the tutorial as well as any other service instances you might have if you used an already existing resource group


az group delete --name $AZURE_RESOURCE_GROUP_NAME
复制代码

Summary

You learned how to leverage Docker containers to package your Java EE application and deploy it to a Kubernetes cluster in Azure along with a managed database offering for long term persistence.


That brings us to the end of this series exploring some of the common ways of deploying Java EE workloads to Azure. I hope you found it useful!


原文链接https://medium.com/microsoftazure/deploying-java-ee-apps-to-azure-part-3-772e717bc4d1


2020-03-30 19:14430

评论

发布
暂无评论
发现更多内容

如何基于G6进行双树流转绘制? | 京东云技术团队

京东科技开发者

双数组trie树 CRM系统 企业号 6 月 PK 榜 复杂树

玩转服务器之数据传输篇:如何快速搭建FTP文件共享服务器

京东科技开发者

数据传输 云服务器 ftp服务 企业号 6 月 PK 榜

ShareSDK iOS端合规指南

MobTech袤博科技

开源赋能 普惠未来|TKEStack诚邀您参与2023开放原子全球开源峰会

开放原子开源基金会

开源 开放原子开源基金会 开放原子全球开源峰会

M2M场景之客户端凭证模式|OIDC & OAuth2.0 认证协议最佳实践系列 【4】

Authing

OAuth 2.0 Oauth OIDC

Git分支教程:详解分支创建、合并、删除等操作

小万哥

git Linux 程序员 C/C++ 后端开发

开源赋能 普惠未来|UBSICE诚邀您参与2023开放原子全球开源峰会

开放原子开源基金会

大数据 开源 开放原子

GPT现状终于有人讲清楚了!OpenAI大牛最新演讲爆火,还得是马斯克钦点的天才

Openlab_cosmoplat

开源 AI ChatGPT

龙蜥白皮书精选:开源 RISC-V 技术支持软硬件全栈平台

OpenAnolis小助手

开源 操作系统 risc-v 龙蜥社区 龙蜥sig

UniFi USW-Flex 室内-室外 POE 交换机

HoneyMoose

深度学习进阶篇[9]:对抗生成网络GANs综述、代表变体模型、训练策略、GAN在计算机视觉应用和常见数据集介绍,以及前沿问题解决

汀丶人工智能

人工智能 深度学习 计算机视觉 GAN 生成对抗网络

编写Java代码时应该避免的6个坑

越长大越悲伤

Java

从0到1搭建自己的脚手架(java后端) | 京东云技术团队

京东科技开发者

Java 后端 脚手架 Java脚手架 企业号 6 月 PK 榜

开源赋能 普惠未来|中软国际寄语2023开放原子全球开源峰会

开放原子开源基金会

开源 开放原子开源基金会 开放原子全球开源峰会 开放原子

PS图像无损放大插件 Blow Up 3最新激活版

真大的脸盆

Mac Mac 软件 图片无损放大 无损放大插件

ChunJun FTP Connector 功能扩展解读

袋鼠云数栈

开源 企业号 6 月 PK 榜

2天时间3个面试,百度进了3面!

王中阳Go

golang 职场 面经 求职面试 提高效率

玖章算术NineData荣获信通院“生成式人工智能技术和应用优秀案例”奖

NineData

人工智能 信通院 SQL开发 NineData 生成式AI

六一新玩法!AI涂鸦秒变精美艺术画

华为云开发者联盟

人工智能 华为云 华为云开发者联盟 企业号 6 月 PK 榜

PWA结合小程序:为用户带来原生应用体验

Onegun

小程序 PWA

软件测试/测试开发丨学习笔记之Allure2测试报告

测试人

程序员 软件测试 自动化测试 测试开发 Allure

深度学习进阶篇[8]:对抗神经网络GAN基本概念简介、纳什均衡、生成器判别器、解码编码器详解以及GAN应用场景

汀丶人工智能

人工智能 深度学习 GAN 博弈论 生成对抗网络

标签系列:标签的两大行业应用实践

Taylor

CDP 精细化运营 标签体系 DMP 精准营销

开源赋能 普惠未来|ZTDBP诚邀您参与2023开放原子全球开源峰会

开放原子开源基金会

开源 开放原子全球开源峰会 开放原子

设计模式详解之策略模式

阿里技术

设计模式 策略模式

Tomcat 安装与启动

Andy

OpenMLDB v0.8 新功能:离线引擎数据源支持 Amazon S3

第四范式开发者社区

人工智能 机器学习 数据库 开源 特征

RustChinaConf 2023官网上线,精彩议题早知道

Mike Tang

华秋硬创 | 全国科技工作者日,致敬每一位科技创新者!

华秋电子

XMind2023思维导图软件 完美永久激活版 支持M1/M2

魔仙苹果mac堡

XMind下载 XMind思维导图 XMind2023新功能 XMind永久激活版

分而治之--浅谈分库分表及实践之路 | 京东云技术团队

京东科技开发者

数据库 后端 分库分表 SaaS 平台 企业号 6 月 PK 榜

Deploying Java EE apps to Azure: Part 3_文化 & 方法_Azure 中文精选_InfoQ精选文章