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

Leave a Reply

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

About continuous learner

devops & cloud enthusiastic learner