OpenShift = Docker + Kubernetes. OpenShift is an orchestration PaaS provided by Red Hat. It is infrastructure-agnostic; you could run it on top of EC2, for example: imagine deploying Docker containers to EC2 instances.
What do we need to run Magnolia? Tomcat, MySQL, Magnolia WAR file. What if I want to add or remove a public instance to a Magnolia install, say in a High Availability scenario? I will need some orchestration machine - this is where OpenShift comes in.
OpenShift uses ActiveMQ to communicate between the orchestration machine ('Broker') and the Nodes.
Cartridge
A Cartridge is an OpenShift extension. Think library include. We might build a Cartridge to a DB platform like MySQL. We install Cartridges into Gears to provide functionality to our apps.
Gear
A Gear is a Container. We organize N > 1 Gears into a Pod.
Pod
A Pod is the atomic unit for OpenShift. It is the smallest manageable unit. Pods live on Virtual Machines. Virtual Machines are also known as 'Nodes'.
Cluster
A Cluster is a collection of Virtual Machines.
Links
- There's a basic Ansible Role for installing OpenShift here.
- The OpenShift docu are either weak or outdated in most cases, and the authors of OpenShift tend to answer online questions with "You're using the product wrong", rather than be helpful, so, good documentation is hard to find. Here's a couple useful links - surprise, surprise - not from the OpenShift docu:
- https://docs.ansible.com/ansible-container/openshift/containers.html
- http://www.javamonamour.org/2017/12/oc-cluster-up-how-to-enable-admin.html
Other
First working cluster was built like so:
Screenshots
Now that everything is set up and you can log in to the web console, let's do some configuration:
oc login 139.162.131.60:8443 --username=system --password=admin --insecure-skip-tls-verify
You should see something like:
[bandersen@li1397-60 ~]$ oc login 139.162.131.60:8443 --username=system --password=admin --insecure-skip-tls-verify Login successful. You don't have any projects. You can try to create a new project, by running oc new-project <projectname> Welcome! See 'oc help' to get started. [bandersen@li1397-60 ~]$
An OpenShift 'project' is like a Kubernetes 'namespace', but with extra herbs and spices thrown in.
Most tutorials will tell you to do it this way, but I have never gotten it to work:
oc login -u system:admin
Usually, you'll get an error like so:
[bandersen@li1397-60 ~]$ oc login -u system:admin Server [https://localhost:8443]: The server uses a certificate signed by an unknown authority. You can bypass the certificate check, but any data you send to the server could be intercepted by others. Use insecure connections? (y/n): y Authentication required for https://localhost:8443 (openshift) Username: system:admin Password: error: username system:admin is invalid for basic auth [bandersen@li1397-60 ~]$
The best way is actually to follow the advice here.
Running Magnolia on OpenShift
Two ways: as a standalone WAR file, or using Docker.
as a standalone WAR
wget https://files.magnolia-cms.com/5.6/magnolia-enterprise-pro-demo-webapp-5.6.war -O magnoliaauthor.war
The name is important here. The name we use in the next command has to follow these rules:
Must be an a lower case alphanumeric (a-z, and 0-9) string with a maximum length of 58 characters, where the first character is a letter (a-z), and the '-' character is allowed anywhere except the first or last character.
oc new-app wildfly:latest~. --name magnoliaauthor
You should get some output like:
[bandersen@li1397-60 ~]$ oc new-app wildfly:latest~. --name magnoliaauthor --> Found image fdd5894 (4 weeks old) in image stream "openshift/wildfly" under tag "latest" for "wildfly:latest" WildFly 10.1.0.Final -------------------- Platform for building and running JEE applications on WildFly 10.1.0.Final Tags: builder, wildfly, wildfly10 * A source build using binary input will be created * The resulting image will be pushed to image stream "magnoliaauthor:latest" * A binary build was created, use 'start-build --from-dir' to trigger a new build * This image will be deployed in deployment config "magnoliaauthor" * Port 8080/tcp will be load balanced by service "magnoliaauthor" * Other containers can access this service through the hostname "magnoliaauthor" --> Creating resources ... imagestream "magnoliaauthor" created buildconfig "magnoliaauthor" created deploymentconfig "magnoliaauthor" created service "magnoliaauthor" created --> Success Build scheduled, use 'oc logs -f bc/magnoliaauthor' to track its progress. Application is not exposed. You can expose services to the outside world by executing one or more of the commands below: 'oc expose svc/magnoliaauthor' Run 'oc status' to view your app. [bandersen@li1397-60 ~]$
Now we build it and then we can go see it:
[bandersen@li1397-60 ~]$ oc start-build magnoliaauthor --from-file=magnoliaauthor.war Uploading file "magnoliaauthor.war" as binary input for the build ... build "magnoliaauthor-2" started [bandersen@li1397-60 ~]$ oc get routes NAME HOST/PORT PATH SERVICES PORT TERMINATION WILDCARD magnoliaauthor magnoliaauthor-default.139.162.131.60.nip.io magnoliaauthor 8080-tcp None
So if we go to http://magnoliaauthor-default.139.162.131.60.nip.io/magnoliaauthor, we should see Magnolia 5.6 running on WildFly.
using Docker
You could use something from Docker Hub, or from a local Docker image, like so:
Troubleshooting
If for some reason your app is not running, you can check the logs, by pod name: