OpenShift and Kubernetes
Overview
You write YAML files that describe what you'd like to have.
You apply those YAML files to Kubernetes.
Kubernetes stores your data in a database called etcd - this stores the desired state of your application.
The Kubernetes control plane looks at etcd, looks at the nodes, then makes the nodes match the desired state.

Project Setup
Create the config directory
cd into the project you created in the docker lesson and make a k8s folder:
cd ~/static-site
mkdir k8s
code .
Create the OpenShift Project
Make sure you are logged into the cluster, either with icc or via Copy Login Command.
Then run the following command, replacing <NAME> with your name, all lowercase, no spaces:
oc new-project <NAME>
For example oc new-project john-smith
Kubernetes Objects
Kubernetes organizes objects by namespace. In OpenShift, namespaces are called Projects.
There are 4 Kubernetes objects you need to know about to make an application available to the internet:
- Deployments - specify which image you want to run, and how many pods to create
- Pods - run containers
- Services - expose your containers to traffic inside the cluster
- Routes - expose your services to traffic from outside the cluster

Deployments
The most basic Kubernetes object you'll work with is a Deployment, which tells Kubernetes:
- which image you would like to run
- how many replicas (instances) you would like to run
Create the file
- Create a file named
k8s/deployment.yaml - Paste the following YAML into the file
- Replace the word
<USERNAME>with your quay.io username
apiVersion: apps/v1
kind: Deployment
metadata:
name: static-site
labels:
app: static-site
spec:
replicas: 1
selector:
matchLabels:
app: static-site
template:
metadata:
labels:
app: static-site
spec:
containers:
- name: static-site
image: quay.io/<USERNAME>/static-site:v1
ports:
- containerPort: 8080
Apply the file
oc apply -f k8s/deployment.yaml
Verify the deployment works
oc get deploy
You should see the following:
NAME READY UP-TO-DATE AVAILABLE AGE
static-site 1/1 1 1 24s
What just happened?
When you applied the file, Kubernetes stored your config in etcd (the "YAML database").
The control plane saw that you wanted 1 replica of static-site:v1 running. It looked at the nodes and couldn't find any.
So the scheduler picked a node, and ran one instance of static-site:v1.
Pods
A Deployment creates Pods. You can see pods by running:
oc get pods
Services
Services allow pods within a Kubernetes cluster to access the pods from your deployment.
Create the file
Create a file named k8s/service.yaml
Paste the following YAML into it:
apiVersion: v1
kind: Service
metadata:
name: static-site
spec:
selector:
app: static-site
ports:
- protocol: TCP
port: 80
targetPort: 8080
Apply the file
oc apply -f k8s/service.yaml
Verify
oc get svc
You should see something like this (the IP will be different):
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
static-site ClusterIP 172.21.141.7 <none> 80/TCP 2m6s
Routes
Routes are an OpenShift concept. They serve a similar purpose to Kubernetes Ingresses.
Create the file
Create a file named k8s/route.yaml and paste the following contents:
apiVersion: route.openshift.io/v1
kind: Route
metadata:
name: static-site
spec:
to:
kind: Service
name: static-site
Apply the file
oc apply -f k8s/route.yaml
Verify
oc get routes
This will print something like this:
NAME HOST/PORT PATH SERVICES PORT TERMINATION WILDCARD
static-site static-site-...appdomain.cloud static-site <all> edge None
Copy the HOST/PORT and open it in a browser. You should be able to see your site! 🎉
Additional Challenges
Deploy a new version:
- Make a change to
index.html - Rebuild and push a new version of your docker image to quay.io (for example
v3) - Change
k8s/deployment.yamlto point to this new version and apply it
Scale the app:
- Make a change to
k8s/deployment.yamlto increase the number of replicas - Apply the file
- Use
octo list the pods to make sure they are all there - Repeat the process, but reduce the replicas
UI
Inspect the app in the UI
Cleanup
Run the following command to delete your project, replacing <NAME> with your project name:
oc project default
oc delete project <NAME>