This demo will show how to make application server administration, clustering, auto-scaling, auto-discovery and load-balancing work with Kubernetes deployments.
- You will need to have Maven installed.
- You need to have a Kubernetes cluster with kubectl installed and configured to use your cluster. We used the Azure Kubernetes Service but you can use any Kubernetes capable platform including running Kubernetes locally.
- You need to have Docker CLI installed and you must be signed into your Docker Hub account. To create a Docker Hub account go to https://hub.docker.com.
- You will need to install Helm.
We will be using the fully managed PostgreSQL offering in Azure for this demo. If you have not set it up yet, please do so now.
- You will need an Azure subscription. If you don't have one, you can get one for free for one year here.
- Go to the Azure portal.
- Select 'Create a resource'. In the search box, enter and select 'Azure Database for PostgreSQL'. Hit create. Select a single server.
- Specify the Server name to be jakartaee-cafe-db-
<your suffix>
(the suffix could be your first name such as "reza"). Create a new resource group named jakartaee-cafe-group-<your suffix>
(the suffix could be your first name such as "reza"). Specify the login name to be postgres. Specify the password to be Secret123!. Hit 'Create'. It will take a moment for the database to deploy and be ready for use. - In the portal, go to 'All resources'. Find and click on jakartaee-cafe-db-
<your suffix>
. Open the connection security panel. Enable access to Azure services, disable SSL connection enforcement and then hit Save.
Once you are done exploring the demo, you should delete the jakartaee-cafe-group-<your suffix>
resource group. You can do this by going to the portal, going to resource groups, finding and clicking on jakartaee-cafe-group-<your suffix>
and hitting delete. This is especially important if you are not using a free subscription! If you do keep these resources around (for example to begin your own prototype), you should in the least use your own passwords and make the corresponding changes in the demo code.
- You will need an Azure subscription. If you don't have one, you can get one for free for one year here.
- You will need to create a Kubernetes cluster. Go to the Azure portal. Hit Create a resource -> Containers -> Kubernetes Service. Select the resource group to be jakartaee-cafe-group-
<your suffix>
(the suffix could be your first name such as "reza"). Specify the cluster name as jakartaee-cafe-cluster-<your suffix>
(the suffix could be your first name such as "reza"). Hit Review + create. Hit Create.
-
You will now need to setup kubectl. Here are instructions on how to do that.
-
Next you will install the Azure CLI. Here are instructions on how to do that.
-
Please delete the ~/.kube directory for good measure.
-
You will then connect kubectl to the Kubernetes cluster you created. To do so, run the following command:
az aks get-credentials --resource-group jakartaee-cafe-group-<your suffix> --name jakartaee-cafe-cluster-<your suffix>
If you get an error about an already existing resource, you may need to delete the ~/.kube directory.
-
Make sure to update Helm:
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx helm repo update
-
Create a namespace for your ingress resources by running the following command:
kubectl create namespace ingress-nginx
-
Use Helm to deploy an NGINX ingress controller:
helm install ingress-nginx ingress-nginx/ingress-nginx --namespace ingress-nginx --set controller.replicaCount=2 --set controller.nodeSelector."kubernetes\.io/os"=linux --set defaultBackend.nodeSelector."kubernetes\.io/os"=linux --set controller.admissionWebhooks.patch.nodeSelector."kubernetes\.io/os"=linux --set controller.service.annotations."service\.beta\.kubernetes\.io/azure-load-balancer-health-probe-request-path"=/healthz
-
Note down the external IP address of the Ingress controller/load-balancer when it becomes available (enter CTRL-C when done):
kubectl --namespace ingress-nginx get services --watch
-
Browse to where you have this repository code in your file system. Go into the jakartaee/jakartaee-cafe directory. Do a full build of the jakartaee-cafe application via Maven:
mvn clean package
-
You will now need to copy the newly built war file to where we will build the Docker image next. You will find the war file under jakartaee/jakartaee-cafe/target. Copy the war file to clustering/.
-
Go back to the clustering/ directory. You should explore the Dockerfile in this directory used to build the Docker image. It starts from the
websphere-liberty
image, adds thejakartaee-cafe.war
from the current directory in to thedropins
directory, copies the PostgreSqQL driverpostgresql-42.6.0.jar
into theshared/resources
directory and replaces the defaultServer configuration fileserver.xml
. -
You should note the
server.xml
. We have added an admin role to access the adminstrative console with. We have also enabled a database session store across the cluster. -
Open a terminal. Navigate to where you have this repository code in your file system. Navigate to the clustering/ directory.
-
Log in to Docker Hub using the docker login command:
docker login
-
Build a Docker image and push the image to Docker Hub:
docker build -t <your Docker Hub account>/jakartaee-cafe:v1 . docker push <your Docker Hub account>/jakartaee-cafe:v1
-
Replace the
<your Docker Hub account>
value with your account name and<your suffix>
value with what you used previously in thejakartaee-cafe.yml
file, then deploy the application:kubectl create -f jakartaee-cafe.yml
-
Once all the pods are ready and running, the application will be accessible at
http://<Ingress External IP Address>/jakartaee-cafe
:kubectl get pods --watch
-
You can now also log into the administrative console using the credentials in the server.xml and administer the application by accessing
https://<Ingress External IP Address>/adminCenter
. -
Scale your application:
kubectl scale deployment jakartaee-cafe --replicas=3
- Delete the Jakartaee EE deployment:
kubectl delete -f jakartaee-cafe.yml
- Delete the ingress controller namespace:
kubectl delete namespace ingress-nginx