Journey of Openmrs-core from code to K8s
-
Environments:
- Azure Kubernetes Services (AKS)
- Elastic Kubernetes Service (EKS)
-
Steps:
- Understanding how openmrs works
- Creating Dockerfile(s) for Openmrs and its components
- Creating K8s clusters
- Creating K8s Specs for Deployment
OpenMRS-Core Architecture
Dockerfile Creation
- Openmrs Core:
FROM maven:3-jdk-8 as mvn
LABEL author='Khaja'
RUN git clone https://github.com/openmrs/openmrs-core.git && cd openmrs-core && mvn clean package
FROM tomcat:8
LABEL author='Khaja'
COPY --from=mvn /openmrs-core/webapp/target/openmrs.war /usr/local/tomcat/webapps/openmrs.war
EXPOSE 8080
CMD ["catalina.sh", "run"]
- Now build the image and push the docker image to docker hub
docker image build -t shaikkhajaibrahim/openmrs-core:2.4.0 .
docker push shaikkhajaibrahim/openmrs-core:2.4.0
- How to run openmrscore on docker
docker container run --name openmrs -d -p 8080:8080 shaikkhajaibrahim/openmrs-core:2.4.0
# http:<ip>:8080/openmrs
- How to run mysql image on docker
docker container run --name mysql -e 'MYSQL_ROOT_PASSWORD=password' -e 'MYSQL_DATABASE=openmrs' -e 'MYSQL_USER=directdevops' -e 'MYSQL_PASSWORD=directdevops' -d mysql:5.6
Setting up AKS k8s Cluster
- Refer Here for setting up AKS from azure cli
K8s Specifications
- Pod specification for Openmrscore
---
apiVersion: v1
kind: Pod
metadata:
name: openmrscore
labels:
app: openmrscore
ver: 2.4.0
spec:
containers:
- name: openmrscore
image: shaikkhajaibrahim/openmrs-core:2.4.0
ports:
- containerPort: 8080
protocol: TCP
- Pod specification for mysql
---
apiVersion: v1
kind: Pod
metadata:
name: mysql
labels:
app: db
ver: 5.6
spec:
containers:
- name: mysql
image: mysql:5.6
ports:
- containerPort: 3306
protocol: TCP
env:
- name: MYSQL_ROOT_PASSWORD
value: password
- name: MYSQL_DATABASE
value: openmrs
- name: MYSQL_USER
value: directdevops
- name: MYSQL_PASSWORD
value: directdevops
- Replication Controller for openmrs will look like
---
apiVersion: v1
kind: ReplicationController
metadata:
name: openmrs-rc
labels:
app: openmrs
ver: 2.4.0
spec:
replicas: 3
selector:
app: openmrscore
ver: 2.4.0
template:
metadata:
labels:
app: openmrscore
ver: 2.4.0
spec:
containers:
- name: openmrscore
image: shaikkhajaibrahim/openmrs-core:2.4.0
ports:
- containerPort: 8080
protocol: TCP
- Deployment of the Openmrs will look like
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: openmrs-deploy
spec:
minReadySeconds: 10
replicas: 3
selector:
matchLabels:
app: openmrscore
ver: 2.4.0
strategy:
rollingUpdate:
maxSurge: 35%
maxUnavailable: 30%
type: RollingUpdate
template:
metadata:
labels:
app: openmrscore
ver: 2.4.0
spec:
containers:
- name: openmrscore
image: shaikkhajaibrahim/openmrs-core:2.4.0
ports:
- containerPort: 8080
protocol: TCP
- While Writing mysql, we need to persist data in the case of azure refer here
- Deployment for mysql in azure
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: azure-managed-disk
spec:
accessModes:
- ReadWriteOnce
storageClassName: default
resources:
requests:
storage: 1Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql-deploy
spec:
minReadySeconds: 10
replicas: 1
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:5.6
ports:
- containerPort: 3306
protocol: TCP
volumeMounts:
- mountPath: /var/lib/mysql
name: mysqlvolume
env:
- name: MYSQL_DATABASE
value: 'openmrs'
- name: MYSQL_USER
value: 'directdevops'
- name: MYSQL_PASSWORD
value: 'directdevops'
- name: MYSQL_ROOT_PASSWORD
value: 'password'
volumes:
- name: mysqlvolume
persistentVolumeClaim:
claimName: azure-managed-disk
How to enable communications between pods
- Refer for k8s spec yaml files.
- Create Service with loadbalancer for openmrs
---
apiVersion: v1
kind: Service
metadata:
name: openmrssvc
spec:
selector:
app: openmrscore
ver: 2.4.0
type: LoadBalancer
ports:
- port: 8080
- Create a Service with Cluster Ip for mysql
---
apiVersion: v1
kind: Service
metadata:
name: mysqlsvc
spec:
selector:
app: mysql
type: ClusterIP
ports:
- port: 3306
- Apply the services to the k8s cluster
kubectl apply -f openmrs-svc.yml
kubectl apply -f mysql-svc.yml