Recently Amazon announced general availability of their new service Amazon Elastic Container Service for Kubernetes (Amazon EKS). This is a managed service to deploy, manage and scale containerized applications using K8s on AWS. I decided to get my hands dirty with it and deployed a Docker container with Oracle XE Database to a K8s cluster on Amazon EKS. In this post I am going to describe what I did to make that happen.
1. Create Oracle XE Docker image.
First of all we need a Docker image with Oracle XE database:
1.1 Clone Oracle GitHub repository to build docker images:
1.2 Download Oracle XE binaries from OTN
1.3 Copy the downloaded stuff to ../oracle-docker-images/OracleDatabase/SingleInstance/dockerfiles/11.2.0.2 folder
1.4 Build the Docker image
Ok, so having done that, we have Oracle XE Docker image stored in Docker Hub repository.
2. Create K8s cluster on Amazon EKS.
Assuming that you have already AWS account, take your favorite tambourine (you will need it) and create a K8s cluster following this guide Getting Started with Amazon EKS (a good example of how complicated you can make a "getting started guide").
Once you are able to see your working nodes in Ready status, you're good to move forward
In AWS console go to your EC2 Dashboard and look at the Load Balancers tab:
Click on Create Load Balancer, select Network Load Balancer:
change the listener port to 1521
and specify in Availability Zones the VPC that you have just created for the K8s cluster:
The scheme should be internet-facing.
4. Deploy Oracle XE Docker container to the K8s cluster.
4.1 Create a yaml file with the following content:
5. Check how it works
5.1. Get a list of pods and check the logs:
Note, that the container while starting generated a password for sys and system users. You can find this password in the log:
5.2 Get external IP address of the service:
5.3 Connect to the DB:
1. Create Oracle XE Docker image.
First of all we need a Docker image with Oracle XE database:
1.1 Clone Oracle GitHub repository to build docker images:
git clone https://github.com/oracle/docker-images.git oracle-docker-imagesIt will create oracle-docker-images folder.
1.2 Download Oracle XE binaries from OTN
1.3 Copy the downloaded stuff to ../oracle-docker-images/OracleDatabase/SingleInstance/dockerfiles/11.2.0.2 folder
1.4 Build the Docker image
./buildDockerImage.sh -v 11.2.0.2 -x -I1.5 Check the new image
docker images oracle/database:11.2.0.2-xe1.6. Rename the image so you can push it to Docker Hub. E.g.:
docker tag oracle/database:11.2.0.2-xe eugeneflexagon/database:11.2.0.2-xe
Ok, so having done that, we have Oracle XE Docker image stored in Docker Hub repository.
2. Create K8s cluster on Amazon EKS.
Assuming that you have already AWS account, take your favorite tambourine (you will need it) and create a K8s cluster following this guide Getting Started with Amazon EKS (a good example of how complicated you can make a "getting started guide").
Once you are able to see your working nodes in Ready status, you're good to move forward
kubectl get nodes --watch3. Configure Load Balancer
In AWS console go to your EC2 Dashboard and look at the Load Balancers tab:
Click on Create Load Balancer, select Network Load Balancer:
change the listener port to 1521
and specify in Availability Zones the VPC that you have just created for the K8s cluster:
The scheme should be internet-facing.
4. Deploy Oracle XE Docker container to the K8s cluster.
4.1 Create a yaml file with the following content:
apiVersion: extensions/v1beta1 kind: Deployment metadata: name: oraclexe labels: run: oraclexe spec: replicas: 1 strategy: rollingUpdate: maxSurge: 1 maxUnavailable: 1 type: RollingUpdate template: metadata: labels: run: oraclexe spec: volumes: - name: dshm emptyDir: medium: Memory containers: - image: eugeneflexagon/database:11.2.0.2-xe volumeMounts: - mountPath: /dev/shm name: dshm imagePullPolicy: Always name: oraclexe ports: - containerPort: 1521 protocol: TCP imagePullSecrets: - name: wrelease restartPolicy: Always --- apiVersion: v1 kind: Service metadata: name: oraclexe-svc spec: selector: run: oraclexe ports: - port: 1521 targetPort: 1521 type: LoadBalancer4.2 Deploy it:
kubectl apply -f oraclexe-deployment.yaml
5. Check how it works
5.1. Get a list of pods and check the logs:
kubectl get pods kubectl logs -f POD_NAMEOnce you see in the logs DATABASE IS READY TO USE! the database container is up and running.
Note, that the container while starting generated a password for sys and system users. You can find this password in the log:
5.2 Get external IP address of the service:
kubectl get svcWait until the address in EXTERNAL-IP column turns from PENDING into something meaningful:
5.3 Connect to the DB:
That's it!