DevOps Classroom 16/Feb/2020- K8s Start to End

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

Preview

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

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
Published
Categorized as Uncategorized Tagged ,

By continuous learner

devops & cloud enthusiastic learner

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Please turn AdBlock off
Social Media Icons Powered by Acurax Web Design Company

Discover more from Direct DevOps from Quality Thought

Subscribe now to keep reading and get access to the full archive.

Continue reading

Visit Us On FacebookVisit Us On LinkedinVisit Us On Youtube