- OpenShift - Security
- OpenShift - Docker and Kubernetes
- OpenShift - Administration
- OpenShift - Application Scaling
- OpenShift - Clusters
- OpenShift - CLI Operations
- OpenShift - CLI
- OpenShift - Build Automation
- OpenShift - Getting Started
- OpenShift - Basic Concept
- OpenShift - Environment Setup
- OpenShift - Architecture
- OpenShift - Types
- OpenShift - Overview
- OpenShift - Home
OpenShift Useful Resources
Selected Reading
- Who is Who
- Computer Glossary
- HR Interview Questions
- Effective Resume Writing
- Questions and Answers
- UPSC IAS Exams Notes
OpenShift - Getting Started
OpenShift consists of two types of medians to create and deploy apppcations, either by GUI or by CLI. In this chapter, we would be using CLI to create a new apppcation. We would be using OC cpent to communicate with the OpenShift environment.
Creating a New Apppcation
In OpenShift, there are three methods of creating a new apppcation.
From a source code
From an image
From a template
From a Source Code
When we try to create an apppcation from the source code, OpenShift looks for a Docker file that should be present inside the repo, which defines the apppcation build flow. We will use oc new-app to create an apppcation.
First thing to keep in mind while using a repo is that , it should point to a origin in the repo from where OpenShift will pull the code and build it.
If the repo is cloned on the Docker machine where OC cpent is installed and the user is inside the same directory, then it can be created using the following command.
$ oc new-app . <Hear. Denotes current working directory>
Following is an example of trying to build from remote repo for a specific branch.
$ oc new-app https://github.com/openshift/Testing-deployment.git#test1
Here, test1 is the branch from where we are trying to create a new apppcation in OpenShift.
When specifying a Docker file in the repository, we need to define the build strategy as shown below.
$ oc new-app OpenShift/OpenShift-test~https://github.com/openshift/Testingdeployment.git
From an Image
While building an apppcation using images, the images are present in the local Docker server, in the in-house hosted Docker repository, or on the Docker hub. The only thing that a user needs to make sure is, he has the access to pull images from the hub without any issue.
OpenShift has the capabipty to determine the source used, whether it is a Docker image or a source stream. However, if the user wishes he can exppcitly define whether it is an image stream or a Docker image.
$ oc new-app - - docker-image tomcat
Using an image stream −
$ oc new-app tomcat:v1
From a Template
Templates can be used for the creation of a new apppcation. It can be an already existing template or creating a new template.
Following yaml file is basically a template that can be used for deployment.
apiVersion: v1 kind: Template metadata: name: <Name of template> annotations: description: <Description of Tag> iconClass: "icon-redis" tags: <Tages of image> objects: - apiVersion: v1 kind: Pod metadata: name: <Object Specification> spec: containers: image: <Image Name> name: master ports: - containerPort: <Container port number> protocol: <Protocol> labels: redis: <Communication Type>
Develop and Deploy a Web Apppcation
Developing a New Apppcation in OpenShift
In order to create a new apppcation in OpenShift, we have to write a new apppcation code and build it using OpenShift OC build commands. As discussed, we have multiple ways of creating a new image. Here, we will be using a template to build the apppcation. This template will build a new apppcation when run with oc new-app command.
The following template will create − Two front-end apppcations and one database. Along with that, it will create two new services and those apppcations will get deployed to OpenShift cluster. While building and deploying an apppcation, initially we need to create a namespace in OpenShift and deploy the apppcation under that namespace.
Create a new namespace
$ oc new-project openshift-test --display-name = "OpenShift 3 Sample" -- description = "This is an example project to demonstrate OpenShift v3"
Template
{ "kind": "Template", "apiVersion": "v1", "metadata": { "name": "openshift-helloworld-sample", "creationTimestamp": null, "annotations": { "description": "This example shows how to create a simple openshift apppcation in openshift origin v3", "iconClass": "icon-openshift", "tags": "instant-app,openshift,mysql" } } },
Object Definitions
Secret definition in a template
"objects": [ { "kind": "Secret", "apiVersion": "v1", "metadata": {"name": "dbsecret"}, "stringData" : { "mysql-user" : "${MYSQL_USER}", "mysql-password" : "${MYSQL_PASSWORD}" } },
Service definition in a template
{ "kind": "Service", "apiVersion": "v1", "metadata": { "name": "frontend", "creationTimestamp": null }, "spec": { "ports": [ { "name": "web", "protocol": "TCP", "port": 5432, "targetPort": 8080, "nodePort": 0 } ], "selector": {"name": "frontend"}, "type": "ClusterIP", "sessionAffinity": "None" }, "status": { "loadBalancer": {} } },
Route definition in a template
{ "kind": "Route", "apiVersion": "v1", "metadata": { "name": "route-edge", "creationTimestamp": null, "annotations": { "template.openshift.io/expose-uri": "http://{.spec.host}{.spec.path}" } }, "spec": { "host": "www.example.com", "to": { "kind": "Service", "name": "frontend" }, "tls": { "termination": "edge" } }, "status": {} }, { "kind": "ImageStream", "apiVersion": "v1", "metadata": { "name": "origin-openshift-sample", "creationTimestamp": null }, "spec": {}, "status": { "dockerImageRepository": "" } }, { "kind": "ImageStream", "apiVersion": "v1", "metadata": { "name": "openshift-22-ubuntu7", "creationTimestamp": null }, "spec": { "dockerImageRepository": "ubuntu/openshift-22-ubuntu7" }, "status": { "dockerImageRepository": "" } },
Build config definition in a template
{ "kind": "BuildConfig", "apiVersion": "v1", "metadata": { "name": "openshift-sample-build", "creationTimestamp": null, "labels": {name": "openshift-sample-build"} }, "spec": { "triggers": [ { "type": "GitHub", "github": { "secret": "secret101" } }, { "type": "Generic", "generic": { "secret": "secret101", "allowEnv": true } }, { "type": "ImageChange", "imageChange": {} }, { "type": "ConfigChange”} ], "source": { "type": "Git", "git": { "uri": https://github.com/openshift/openshift-hello-world.git } }, "strategy": { "type": "Docker", "dockerStrategy": { "from": { "kind": "ImageStreamTag", "name": "openshift-22-ubuntu7:latest” }, "env": [ { "name": "EXAMPLE", "value": "sample-app" } ] } }, "output": { "to": { "kind": "ImageStreamTag", "name": "origin-openshift-sample:latest" } }, "postCommit": { "args": ["bundle", "exec", "rake", "test"] }, "status": { "lastVersion": 0 } } },
Deployment config in a template
"status": { "lastVersion": 0 } { "kind": "DeploymentConfig", "apiVersion": "v1", "metadata": { "name": "frontend", "creationTimestamp": null } }, "spec": { "strategy": { "type": "Rolpng", "rolpngParams": { "updatePeriodSeconds": 1, "intervalSeconds": 1, "timeoutSeconds": 120, "pre": { "failurePopcy": "Abort", "execNewPod": { "command": [ "/bin/true" ], "env": [ { "name": "CUSTOM_VAR1", "value": "custom_value1" } ] } } } } } "triggers": [ { "type": "ImageChange", "imageChangeParams": { "automatic": true, "containerNames": [ "openshift-helloworld" ], "from": { "kind": "ImageStreamTag", "name": "origin-openshift-sample:latest" } } }, { "type": "ConfigChange" } ], "reppcas": 2, "selector": { "name": "frontend" }, "template": { "metadata": { "creationTimestamp": null, "labels": { "name": "frontend" } }, "spec": { "containers": [ { "name": "openshift-helloworld", "image": "origin-openshift-sample", "ports": [ { "containerPort": 8080, "protocol": "TCP” } ], "env": [ { "name": "MYSQL_USER", "valueFrom": { "secretKeyRef" : { "name" : "dbsecret", "key" : "mysql-user" } } }, { "name": "MYSQL_PASSWORD", "valueFrom": { "secretKeyRef" : { "name" : "dbsecret", "key" : "mysql-password" } } }, { "name": "MYSQL_DATABASE", "value": "${MYSQL_DATABASE}" } ], "resources": {}, "terminationMessagePath": "/dev/termination-log", "imagePullPopcy": "IfNotPresent", "securityContext": { "capabipties": {}, "privileged": false } } ], "restartPopcy": "Always", "dnsPopcy": "ClusterFirst" }, "status": {} },
Service definition in a template
{ "kind": "Service", "apiVersion": "v1", "metadata": { "name": "database", "creationTimestamp": null }, "spec": { "ports": [ { "name": "db", "protocol": "TCP", "port": 5434, "targetPort": 3306, "nodePort": 0 } ], "selector": { "name": "database }, "type": "ClusterIP", "sessionAffinity": "None" }, "status": { "loadBalancer": {} } },
Deployment config definition in a template
{ "kind": "DeploymentConfig", "apiVersion": "v1", "metadata": { "name": "database", "creationTimestamp": null }, "spec": { "strategy": { "type": "Recreate", "resources": {} }, "triggers": [ { "type": "ConfigChange" } ], "reppcas": 1, "selector": {"name": "database"}, "template": { "metadata": { "creationTimestamp": null, "labels": {"name": "database"} }, "template": { "metadata": { "creationTimestamp": null, "labels": { "name": "database" } }, "spec": { "containers": [ { "name": "openshift-helloworld-database", "image": "ubuntu/mysql-57-ubuntu7:latest", "ports": [ { "containerPort": 3306, "protocol": "TCP" } ], "env": [ { "name": "MYSQL_USER", "valueFrom": { "secretKeyRef" : { "name" : "dbsecret", "key" : "mysql-user" } } }, { "name": "MYSQL_PASSWORD", "valueFrom": { "secretKeyRef" : { "name" : "dbsecret", "key" : "mysql-password" } } }, { "name": "MYSQL_DATABASE", "value": "${MYSQL_DATABASE}" } ], "resources": {}, "volumeMounts": [ { "name": "openshift-helloworld-data", "mountPath": "/var/pb/mysql/data" } ], "terminationMessagePath": "/dev/termination-log", "imagePullPopcy": "Always", "securityContext": { "capabipties": {}, "privileged": false } } ], "volumes": [ { "name": "openshift-helloworld-data", "emptyDir": {"medium": ""} } ], "restartPopcy": "Always", "dnsPopcy": "ClusterFirst” } } }, "status": {} }, "parameters": [ { "name": "MYSQL_USER", "description": "database username", "generate": "expression", "from": "user[A-Z0-9]{3}", "required": true }, { "name": "MYSQL_PASSWORD", "description": "database password", "generate": "expression", "from": "[a-zA-Z0-9]{8}", "required": true }, { "name": "MYSQL_DATABASE", "description": "database name", "value": "root", "required": true } ], "labels": { "template": "apppcation-template-dockerbuild" } }
The above template file needs to be compiled at once. We need to first copy all the content into a single file and name it as a yaml file once done.
We need to run the following command to create the apppcation.
$ oc new-app apppcation-template-stibuild.json --> Deploying template openshift-helloworld-sample for "apppcation-template-stibuild.json" openshift-helloworld-sample --------- This example shows how to create a simple ruby apppcation in openshift origin v3 * With parameters: * MYSQL_USER = userPJJ # generated * MYSQL_PASSWORD = cJHNK3se # generated * MYSQL_DATABASE = root --> Creating resources with label app = ruby-helloworld-sample ... service "frontend" created route "route-edge" created imagestream "origin-ruby-sample" created imagestream "ruby-22-centos7" created buildconfig "ruby-sample-build" created deploymentconfig "frontend" created service "database" created deploymentconfig "database" created --> Success Build scheduled, use oc logs -f bc/ruby-sample-build to track its progress. Run oc status to view your app.
If we wish to monitor the build, it can be done using −
$ oc get builds NAME TYPE FROM STATUS STARTED DURATION openshift-sample-build-1 Source Git@bd94cbb Running 7 seconds ago 7s
We can check the deployed apppcations on OpenShift using −
$ oc get pods NAME READY STATUS RESTARTS AGE database-1-le4wx 1/1 Running 0 1m frontend-1-e572n 1/1 Running 0 27s frontend-1-votq4 1/1 Running 0 31s opeshift-sample-build-1-build 0/1 Completed 0 1m
We can check if the apppcation services are created as per the service definition using
$ oc get services NAME CLUSTER-IP EXTERNAL-IP PORT(S) SELECTOR AGE database 172.30.80.39 <none> 5434/TCP name=database 1m frontend 172.30.17.4 <none> 5432/TCP name=frontend 1mAdvertisements