How to install oc?
OpenShift: How to Install OpenShift CLI oc
How do I enter?
oc login https:
oc login --token=sha256~LLnTlPcjcNjWsQRqnSyTn99LSvxwQdm47gaiEdZJa20 --server=https:
curl -H "Authorization: Bearer sha256~LLnTlPcjcNjWsQRqnSyTn99LSvxwQdm47gaiEdZJa20" "https://api.XXXXXXXXXXXXXX.centralindia.aroapp.io:6443/apis/user.openshift.io/v1/users/~Code language: JavaScript (javascript)
Login to Openshift using the Web Console and CLI use ok
crc console --credentials
eval $(crc oc-env)
oc login -u kubeadmin -p <password> --insecure-skip-tls-verify
Code language: JavaScript (javascript)
Copy admin URL and kubeadmin credentials → open in browser.

rajesh@DM-GYK3HC26H7 ~ % oc login --token=sha256~gJiOSTShZqkioiWgi2IXWA9zf_5vgutfdhwP0tOUEj8 --server=https:
Logged into " as "kubeadmin" using the token provided.
You have access to 65 projects, the list has been suppressed. You can list all projects with 'oc projects'
Using project "default".
rajesh@DM-GYK3HC26H7 ~ % curl -H "Authorization: Bearer sha256~gJiOSTShZqkioiWgi2IXWA9zf_5vgutfdhwP0tOUEj8" "
curl: (60) SSL certificate problem: self signed certificate in certificate chain
More details here: https:
curl failed to verify the legitimacy of the server and therefore could not
establish a secure connection to it. To learn more about this situation and
how to fix it, please visit the web page mentioned above.
rajesh@DM-GYK3HC26H7 ~ % curl -k -H "Authorization: Bearer sha256~gJiOSTShZqkioiWgi2IXWA9zf_5vgutfdhwP0tOUEj8" "
{
"kind": "User",
"apiVersion": "user.openshift.io/v1",
"metadata":
"name": "kubeadmin",
"uid": "d85326ad-0202-4285-bfd1-bb370c668bc6",
"resourceVersion": "25096",
"creationTimestamp": "2026-05-14T11:10:41Z",
"managedFields": [
"manager": "oauth-server",
"operation": "Update",
"apiVersion": "user.openshift.io/v1",
"time": "2026-05-14T11:10:41Z",
"fieldsType": "FieldsV1",
"fieldsV1":
"f:identities":
]
,
"identities": [
"developer:kubeadmin"
],
"groups": [
"system:authenticated",
"system:authenticated:oauth"
]
}% rajesh@DM-GYK3HC26H7 ~ % Code language: PHP (php)
World Class Step-by-Step Lab Guide Once OpenShift Local is Running
Audience: Beginners learning OpenShift, Kubernetes, containers, deployment, services, routes, builds, jobs, storage, ConfigMaps, and Secrets.
Platform: Local OpenShift on macOS.
Assumption: OpenShift Local is installed and started.
In this lab, you will use two OpenShift projects:
lab-web -> Web apps, Deployment, Service, Route, ConfigMap, Secret, PVC
lab-batch -> Jobs and CronJobs
This helps students understand project transitions clearly.
Core learning flow:
Project
-> Application
-> Deployment
-> Pod
-> Service
-> Route
-> Browser / curl access
Extended learning flow:
Build from Git
-> BuildConfig
-> Build
-> ImageStream
-> Deployment
-> Service
-> Route
Code language: JavaScript (javascript)
Saving and configuration flow:
PersistentVolume
-> PersistentVolumeClaim
-> Pod mount
ConfigMap
-> Environment variable / mounted file
Secret
-> Sensitive environment variable / mounted file
Batch workload flow:
Job
-> Pod
-> Completed task
CronJob
-> Job
-> Pod
-> Repeated scheduled task
Run:
crc status
Expect:
CRC VM: Running
OpenShift: Running
If OpenShift appears Startingwait until it happens Running.
Run:
eval $(crc oc-env)
Code language: JavaScript (javascript)
Inspect:
oc version
You will see the OpenShift client version.
Run:
crc console --credentials
Code language: JavaScript (javascript)
You will see users like:
kubeadmin
developer
For most beginner labs, use:
Username: developer
Password: developer
Code language: HTTP (http)
Run:
oc login -u developer -p developer https:
Code language: JavaScript (javascript)
Inspect:
oc whoami
Expect:
developer
Check the cluster API:
oc cluster-info
In OpenShift, a project is a Kubernetes namespace with additional OpenShift features.
Project list:
oc projects
Check current projects:
oc project
Create first project:
oc new-project lab-web
Code language: JavaScript (javascript)
Create a second project:
oc new-project lab-batch
Code language: JavaScript (javascript)
Switching back to the web project:
oc project lab-web
Inspect:
oc project
Expect:
Using project "lab-web"
Code language: JavaScript (javascript)
Switch to lab-batch:
oc project lab-batch
Check resources:
oc get all
Code language: JavaScript (javascript)
Switch to lab-web:
oc project lab-web
Check resources:
oc get all
Code language: JavaScript (javascript)
Important rules:
Resources created in lab-web are not visible in lab-batch unless you use -A or specify the namespace.
Code language: PHP (php)
Useful cross-project commands:
oc get pods -A
oc get svc -A
oc get route -A
Code language: JavaScript (javascript)
Switch to lab-web:
oc project lab-web
List of ImageStreams available at openshift namespace:
oc get imagestreams -n openshift
Code language: JavaScript (javascript)
Find HTTPD:
oc get imagestreams -n openshift | grep httpd
Code language: JavaScript (javascript)
Check ImageStream HTTPD:
oc describe imagestream httpd -n openshift
Simple meaning:
ImageStream is an OpenShift object that tracks container image versions/tags.
Implement HTTPD from OpenShift ImageStream:
oc new-app --name=my-httpd --image-stream=openshift/httpd
Code language: JavaScript (javascript)
Check the created resources:
oc get all
Code language: JavaScript (javascript)
You will see:
deployment.apps/my-httpd
replicaset.apps/my-httpd-xxxxx
pod/my-httpd-xxxxx
service/my-httpd
Check pods:
oc get pods
Code language: JavaScript (javascript)
Expect:
my-httpd-xxxxx 1/1 Running
Run:
oc get deployment
oc get replicaset
oc get pods
oc get svc
Code language: JavaScript (javascript)
Explanation:
Deployment -> Desired application state
ReplicaSet -> Maintains number of pod replicas
Pod -> Runs the container
Service -> Stable internal network endpoint for pods
Explain the Implementation:
oc describe deployment my-httpd
Describe the Service:
oc describe svc my-httpd
Check the Service endpoint:
oc get endpoints my-httpd
Code language: JavaScript (javascript)
Expect:
my-httpd 10.x.x.x:8080
Code language: CSS (css)
If an endpoint appears <none>The service is not connected to a running pod.
Services are internal. To access the application from a browser or curl, create a Route.
Run:
oc expose svc/my-httpd
Check Route:
oc get route my-httpd
Code language: JavaScript (javascript)
Expect:
NAME HOST/PORT
my-httpd my-httpd-lab-web.apps-crc.testing
Get just the URL:
oc get route my-httpd -o jsonpath='
Code language: PHP (php)
Access using curl:
curl http:
Code language: JavaScript (javascript)
Or open in browser:
http:
Code language: JavaScript (javascript)
If you see:
Application is not available
Run:
oc project
oc get pods
oc get svc
oc get route
oc get endpoints my-httpd
Code language: JavaScript (javascript)
Check if there is a route:
oc get route -A | grep my-httpd
Code language: JavaScript (javascript)
Check if the app is in another project:
oc get all -A | grep my-httpd
Code language: JavaScript (javascript)
Common causes:
Wrong project
Wrong route hostname
Pod not running
Service has no endpoint
Route points to wrong service
Application still starting
Useful debugging commands:
oc describe route my-httpd
oc describe svc my-httpd
oc describe deployment my-httpd
oc logs deployment/my-httpd
Now apply the same application in another project to understand isolation.
Switch to lab-batch:
oc project lab-batch
Implement HTTPD:
oc new-app --name=my-httpd --image-stream=openshift/httpd
Code language: JavaScript (javascript)
Expose:
oc expose svc/my-httpd
Check route:
oc get route my-httpd
Code language: JavaScript (javascript)
You will see different hostnames:
my-httpd-lab-batch.apps-crc.testing
Code language: CSS (css)
Now compare both routes:
oc get route -A | grep my-httpd
Code language: JavaScript (javascript)
Expect:
lab-web my-httpd my-httpd-lab-web.apps-crc.testing
lab-batch my-httpd my-httpd-lab-batch.apps-crc.testing
Code language: CSS (css)
Access both:
curl http:
curl http:
Code language: JavaScript (javascript)
Key learnings:
Same app name can exist in different projects.
Each project gets its own namespace and route hostname.
Keep lab-web for other laboratories.
Switch to lab-batch:
oc project lab-batch
Delete HTTPD resources:
oc delete all -l app=my-httpd
oc delete route my-httpd
Code language: JavaScript (javascript)
Inspect:
oc get all
oc get route
Code language: JavaScript (javascript)
Switch back:
oc project lab-web
Check the current pod:
oc get pods
Code language: JavaScript (javascript)
Scale to 3 replicas:
oc scale deployment/my-httpd --replicas=3
Check pods:
oc get pods -o wide
Code language: JavaScript (javascript)
Check implementation:
oc get deployment my-httpd
Code language: JavaScript (javascript)
Scale back to 1:
oc scale deployment/my-httpd --replicas=1
Inspect:
oc get pods
Code language: JavaScript (javascript)
Learning:
Deployment controls how many pod replicas should run.
View logs from Deployment:
oc logs deployment/my-httpd
Get pod name:
oc get pods
Code language: JavaScript (javascript)
Open a shell inside the pod:
oc rsh deployment/my-httpd
Inside the container, run:
pwd
ls
whoami
exit
Code language: PHP (php)
Alternative command:
oc exec deployment/my-httpd -- whoami
This is useful when Route doesn’t work or when testing private services.
Run:
oc port-forward svc/my-httpd 18080:8080
Open another terminal and test:
curl http:
Code language: JavaScript (javascript)
Stop port-forward using:
Ctrl + C
Run:
oc status
It provides a human-friendly summary of current projects.
Also run:
oc get all
Code language: JavaScript (javascript)
This provides a Kubernetes/OpenShift resource view.
Add labels to Deployment:
oc label deployment/my-httpd app-type=webserver
Check labels:
oc get deployment my-httpd --show-labels
Code language: JavaScript (javascript)
Find resources by label:
oc get deployment -l app-type=webserver
Code language: JavaScript (javascript)
Check the pod label:
oc get pods --show-labels
Code language: JavaScript (javascript)
Learning:
Labels are key-value metadata used for selection, grouping, and automation.
Set CPU and memory requests/limits:
oc set resources deployment/my-httpd \
--requests=cpu=100m,memory=128Mi \
--limits=cpu=500m,memory=256Mi
Code language: JavaScript (javascript)
Inspect:
oc describe deployment my-httpd
Check launch:
oc rollout status deployment/my-httpd
Learning:
Requests reserve minimum resources.
Limits cap maximum resources.
Make visible changes:
oc set env deployment/my-httpd TRAINING_VERSION=v1
Code language: JavaScript (javascript)
Check launch:
oc rollout status deployment/my-httpd
Check launch history:
oc rollout history deployment/my-httpd
Make other changes:
oc set env deployment/my-httpd TRAINING_VERSION=v2
Code language: JavaScript (javascript)
Check environment:
oc set env deployment/my-httpd --list
Code language: JavaScript (javascript)
Return:
oc rollout undo deployment/my-httpd
Check again:
oc rollout status deployment/my-httpd
oc set env deployment/my-httpd --list
Code language: JavaScript (javascript)
Learning:
OpenShift/Kubernetes Deployments support rolling updates and rollback.
Export YAML Deployment:
oc get deployment my-httpd -o yaml > my-httpd-deployment.yaml
Code language: JavaScript (javascript)
View file:
cat my-httpd-deployment.yaml
Code language: CSS (css)
YAML Export Service:
oc get svc my-httpd -o yaml > my-httpd-service.yaml
Code language: JavaScript (javascript)
YAML Route Export:
oc get route my-httpd -o yaml > my-httpd-route.yaml
Code language: JavaScript (javascript)
Learning:
CLI commands create resources.
YAML defines resources declaratively.
Don’t blindly redeploy exported YAML without clearing fields like:
status
resourceVersion
uid
managedFields
creationTimestamp
Create ConfigMap:
oc create configmap app-config \
--from-literal=APP_MODE=training \
--from-literal=WELCOME_MESSAGE="Hello from ConfigMap"
Code language: JavaScript (javascript)
Check ConfigMap:
oc get configmap
oc describe configmap app-config
Code language: JavaScript (javascript)
Enter the ConfigMap value as an environment variable:
oc set env deployment/my-httpd --from=configmap/app-config
Code language: JavaScript (javascript)
Inspect:
oc set env deployment/my-httpd --list
Code language: JavaScript (javascript)
Check inside the pod:
oc exec deployment/my-httpd -- env | grep APP_MODE
oc exec deployment/my-httpd -- env | grep WELCOME_MESSAGE
Learning:
ConfigMap stores non-sensitive configuration.
Create HTML file:
cat > index.html <<'EOF'
<html>
<body>
<h1>Hello from OpenShift Local</h1>
<p>This page is coming from a ConfigMap mounted into the HTTPD container.</p>
</body>
</html>
EOF
Code language: PHP (php)
Create a ConfigMap from files:
oc create configmap httpd-index --from-file=index.html
Code language: JavaScript (javascript)
Inspect:
oc describe configmap httpd-index
Install ConfigMap into the HTTPD document root:
oc set volume deployment/my-httpd \
--add \
--name=httpd-index-volume \
--type=configmap \
--configmap-name=httpd-index \
--mount-path=/var/www/html/index.html \
--sub-path=index.html
Code language: JavaScript (javascript)
Wait for launch:
oc rollout status deployment/my-httpd
Access route:
curl http:
Code language: JavaScript (javascript)
Learning:
ConfigMaps can be consumed as environment variables or mounted as files.
Code language: JavaScript (javascript)
Notes:
When using subPath, ConfigMap updates may not automatically appear in the running pod.
For beginner labs, restart the pod or rollout the deployment after updating.
Create a Secret:
oc create secret generic app-secret \
--from-literal=DB_USER=student \
--from-literal=DB_PASSWORD='redhat123'
Code language: JavaScript (javascript)
Check Secret:
oc get secret
oc describe secret app-secret
Code language: JavaScript (javascript)
Do not print actual production secrets. This is just a laboratory.
Inject Secret as environment variable:
oc set env deployment/my-httpd --from=secret/app-secret --prefix=SECRET_
Code language: JavaScript (javascript)
Inspect:
oc set env deployment/my-httpd --list
Code language: JavaScript (javascript)
Check inside the pod:
oc exec deployment/my-httpd -- env | grep SECRET_DB_USER
Learning:
Secret stores sensitive configuration such as passwords, tokens, and keys.
Code language: JavaScript (javascript)
Important:
Secrets are not magic. Use RBAC, encryption at rest, and external secret managers for production-grade security.
Code language: PHP (php)
This lab requires internet access from the OpenShift Local VM.
Stay in lab-web:
oc project lab-web
Deploy from Git using Source-to-Image:
oc new-app https:
Code language: JavaScript (javascript)
Check the resulting object:
oc get all
oc get buildconfig
oc get builds
oc get imagestream
Code language: JavaScript (javascript)
Follow the build log:
oc logs -f bc/nodejs-ex
If the build log command doesn’t work, a list is generated:
oc get builds
Code language: JavaScript (javascript)
Then run:
oc logs -f build/nodejs-ex-1
Expose apps:
oc expose svc/nodejs-ex
Check route:
oc get route nodejs-ex
Code language: JavaScript (javascript)
Access:
curl http:
Code language: JavaScript (javascript)
Learning:
Git repository
-> BuildConfig
-> Build
-> ImageStream
-> Deployment
-> Service
-> Route
Start a new build:
oc start-build nodejs-ex
Follow making:
oc start-build nodejs-ex --follow
Check build:
oc get builds
Code language: JavaScript (javascript)
Check implementation:
oc get deployment
Code language: JavaScript (javascript)
Check pods:
oc get pods
Code language: JavaScript (javascript)
Learning:
BuildConfig defines how source code becomes a runnable image.
Switch to batch project:
oc project lab-batch
Create Job:
oc create job hello-job \
--image=registry.access.redhat.com/ubi9/ubi-minimal \
-- /bin/sh -c 'date; echo "Hello from OpenShift Job"; sleep 5; echo "Job completed"'
Code language: JavaScript (javascript)
Check Jobs:
oc get jobs
Code language: JavaScript (javascript)
Check pods:
oc get pods
Code language: JavaScript (javascript)
View logs:
oc logs job/hello-job
Describe the Job:
oc describe job hello-job
Learning:
Job runs a task to completion.
It is suitable for one-time batch tasks.
Clean:
oc delete job hello-job
Code language: JavaScript (javascript)
Create a CronJob that runs every minute:
oc create cronjob hello-cron \
--image=registry.access.redhat.com/ubi9/ubi-minimal \
--schedule='*/1 * * * *' \
-- /bin/sh -c 'date; echo "Hello from OpenShift CronJob"'
Code language: JavaScript (javascript)
Check CronJob:
oc get cronjob
Code language: JavaScript (javascript)
Wait a moment, then check Jobs:
oc get jobs
Code language: JavaScript (javascript)
Check pods:
oc get pods
Code language: JavaScript (javascript)
View logs from recent job pods:
oc logs $(oc get pods --sort-by=.metadata.creationTimestamp -o name | tail -1)
Code language: JavaScript (javascript)
Suspend CronJob:
oc patch cronjob hello-cron -p '"spec":"suspend":true'
Code language: JavaScript (javascript)
Inspect:
oc get cronjob hello-cron
Code language: JavaScript (javascript)
Resume CronJob:
oc patch cronjob hello-cron -p '"spec":"suspend":false'
Code language: JavaScript (javascript)
Delete CronJob:
oc delete cronjob hello-cron
Code language: JavaScript (javascript)
Delete the old Job if it still exists:
oc delete jobs --all
Code language: JavaScript (javascript)
Learning:
CronJob creates Jobs on a schedule.
Use it for scheduled tasks such as reports, cleanup, and backups.
Code language: JavaScript (javascript)
Switch to lab-web:
oc project lab-web
Check Storage Class:
oc get storageclass
Code language: JavaScript (javascript)
You’ll usually see the default storage class in OpenShift Local.
If there is no default StorageClass, your PVC may remain Pending.
Make PVC:
cat > pvc.yaml <<'EOF'
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: data-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
EOF
Code language: JavaScript (javascript)
Apply:
oc apply -f pvc.yaml
Code language: CSS (css)
Inspect:
oc get pvc
Code language: JavaScript (javascript)
Expect:
data-pvc Bound
If still Delayed:
oc describe pvc data-pvc
oc get storageclass
Code language: JavaScript (javascript)
If your StorageClass has a specific name, update the PVC like this:
storageClassName: <your-storage-class-name>
Code language: HTML, XML (xml)
Create a Deployment that writes data into the PVC:
cat > pvc-demo.yaml <<'EOF'
apiVersion: apps/v1
kind: Deployment
metadata:
name: pvc-demo
spec:
replicas: 1
selector:
matchLabels:
app: pvc-demo
template:
metadata:
labels:
app: pvc-demo
spec:
containers:
- name: writer
image: registry.access.redhat.com/ubi9/ubi-minimal
command:
- /bin/sh
- -c
args:
- while true; do date >> /data/visits.log; sleep 10; done
volumeMounts:
- name: data
mountPath: /data
volumes:
- name: data
persistentVolumeClaim:
claimName: data-pvc
EOF
Code language: PHP (php)
Apply:
oc apply -f pvc-demo.yaml
Code language: CSS (css)
Inspect:
oc get pods
oc get pvc
Code language: JavaScript (javascript)
Read files from pod:
POD=$(oc get pod -l app=pvc-demo -o jsonpath='.items[0].metadata.name')
oc exec $POD -- tail -5 /data/visits.log
Code language: PHP (php)
Delete pods:
oc delete pod $POD
Code language: JavaScript (javascript)
Wait for new pods:
oc get pods -w
Code language: JavaScript (javascript)
Stop watching by:
Ctrl + C
Check the data again:
NEWPOD=$(oc get pod -l app=pvc-demo -o jsonpath='.items[0].metadata.name')
oc exec $NEWPOD -- tail -5 /data/visits.log
Code language: PHP (php)
Learning:
Pod was deleted, but data survived because it was stored in PVC.
Check PVC:
oc get pvc
Code language: JavaScript (javascript)
Check PV:
oc get pv
Code language: JavaScript (javascript)
Explain PVC:
oc describe pvc data-pvc
Simple meaning:
PV = Storage available in the cluster
PVC = Request for storage from a project/application
Pod = Uses PVC as a volume
Code language: JavaScript (javascript)
This lab teaches the difference between oc new-app and manual object creation.
Switch to lab-web:
oc project lab-web
Create a Deployment manually:
cat > manual-httpd.yaml <<'EOF'
apiVersion: apps/v1
kind: Deployment
metadata:
name: manual-httpd
spec:
replicas: 1
selector:
matchLabels:
app: manual-httpd
template:
metadata:
labels:
app: manual-httpd
spec:
containers:
- name: httpd
image: image-registry.openshift-image-registry.svc:5000/openshift/httpd:latest
ports:
- containerPort: 8080
EOF
Code language: JavaScript (javascript)
Apply:
oc apply -f manual-httpd.yaml
Code language: CSS (css)
If the image tag is internal latest not there, check available tags:
oc describe imagestream httpd -n openshift
Then replace latest with available tags such as:
2.4-ubi9
Code language: CSS (css)
Check pods:
oc get pods -l app=manual-httpd
Code language: JavaScript (javascript)
Create Service:
oc expose deployment/manual-httpd --port=8080 --target-port=8080
Check Services:
oc get svc manual-httpd
oc get endpoints manual-httpd
Code language: JavaScript (javascript)
Create Route:
oc expose svc/manual-httpd
Check Route:
oc get route manual-httpd
Code language: JavaScript (javascript)
Access:
curl http:
Code language: JavaScript (javascript)
Learning:
oc new-app creates several objects automatically.
Manual YAML helps you understand each object clearly.
Code language: JavaScript (javascript)
Add readiness check:
oc set probe deployment/my-httpd \
--readiness \
--get-url=
Code language: JavaScript (javascript)
Add liveness check:
oc set probe deployment/my-httpd \
--liveness \
--get-url=
Code language: JavaScript (javascript)
Check launch:
oc rollout status deployment/my-httpd
Describe pods:
oc describe pod $(oc get pod -l deployment=my-httpd -o jsonpath='.items[0].metadata.name')
Code language: PHP (php)
Learning:
Readiness probe decides whether pod should receive traffic.
Liveness probe decides whether pod should be restarted.
View events:
oc get events --sort-by=.lastTimestamp
Code language: JavaScript (javascript)
Watch pod:
oc get pods -w
Code language: JavaScript (javascript)
Describe the failed pod:
oc describe pod <pod-name>
Code language: HTML, XML (xml)
View logs:
oc logs <pod-name>
Code language: HTML, XML (xml)
Previous container log:
oc logs <pod-name> --previous
Code language: HTML, XML (xml)
Check all resources:
oc get all
Code language: JavaScript (javascript)
General troubleshooting chain:
Route
-> Service
-> Endpoints
-> Pod
-> Container logs
-> Events
Order:
oc get route
oc get svc
oc get endpoints
oc get pods
oc logs deployment/my-httpd
oc get events --sort-by=.lastTimestamp
Code language: JavaScript (javascript)
Open console:
crc console
Code language: JavaScript (javascript)
Or show credentials:
crc console --credentials
Code language: JavaScript (javascript)
In console:
1. Login as developer
2. Switch to Developer perspective
3. Select lab-web project
4. Go to Topology
5. Click my-httpd
6. Check Route, Pods, Logs, Events
7. Switch to lab-batch
8. Check Jobs and CronJobs
Code language: PHP (php)
Learning:
CLI gives speed.
Web console gives visual understanding.
Use both.
Code language: JavaScript (javascript)
Check what you can do:
oc auth can-i create pods
oc auth can-i create deployments
oc auth can-i create routes
oc auth can-i get secrets
Code language: JavaScript (javascript)
Check who can see the pod:
oc policy who-can get pods
Code language: JavaScript (javascript)
Check current users:
oc whoami
Learning:
RBAC controls who can perform actions on resources.
Find API resources:
oc api-resources
Find route resources:
oc api-resources | grep route
Find job resources:
oc api-resources | grep job
Describe resources:
oc explain deployment
oc explain deployment.spec
oc explain service
oc explain route
oc explain cronjob
Code language: CSS (css)
Current projects only:
oc get pods
oc get svc
oc get route
Code language: JavaScript (javascript)
All projects:
oc get pods -A
oc get svc -A
oc get route -A
Code language: JavaScript (javascript)
Find all HTTPD resources:
oc get all -A | grep httpd
Code language: JavaScript (javascript)
Find all routes:
oc get route -A
Code language: JavaScript (javascript)
Learning:
Most beginner confusion comes from being in the wrong project.
Always run oc project when confused.
Code language: JavaScript (javascript)
At this point, you have practiced:
Project creation and switching
Application deployment
Deployment
ReplicaSet
Pod
Service
Route
Expose
Scaling
Logs
Pod shell
Port forward
Labels
Resource requests and limits
Rollout and rollback
YAML export/apply
ConfigMap
Secret
Build from Git
BuildConfig
ImageStream
Job
CronJob
PVC
PV
Web Console
RBAC basics
Troubleshooting
Cleanup
Code language: JavaScript (javascript)
Switch to lab-web:
oc project lab-web
Delete HTTPD app:
oc delete all -l app=my-httpd
oc delete route my-httpd
Code language: JavaScript (javascript)
Delete Node.js app:
oc delete all -l app=nodejs-ex
oc delete route nodejs-ex
Code language: JavaScript (javascript)
Remove PVC demo:
oc delete deployment pvc-demo
oc delete pvc data-pvc
Code language: JavaScript (javascript)
Delete manual apps:
oc delete deployment manual-httpd
oc delete svc manual-httpd
oc delete route manual-httpd
Code language: JavaScript (javascript)
Delete ConfigMap and Secret:
oc delete configmap app-config httpd-index
oc delete secret app-secret
Code language: JavaScript (javascript)
Switch to lab-batch:
oc project lab-batch
Delete batch resources:
oc delete jobs --all
oc delete cronjobs --all
Code language: JavaScript (javascript)
Delete both lab projects:
oc delete project lab-web
oc delete project lab-batch
Code language: JavaScript (javascript)
Inspect:
oc projects
crc status
eval $(crc oc-env)
crc console --credentials
oc login -u developer -p developer https:
oc new-project lab-web
oc new-project lab-batch
oc project lab-web
oc get imagestreams -n openshift
oc new-app --name=my-httpd --image-stream=openshift/httpd
oc get all
oc expose svc/my-httpd
oc get route my-httpd
curl http:
oc scale deployment/my-httpd --replicas=3
oc get pods
oc scale deployment/my-httpd --replicas=1
oc logs deployment/my-httpd
oc rsh deployment/my-httpd
oc create configmap app-config --from-literal=APP_MODE=training
oc set env deployment/my-httpd --from=configmap/app-config
oc create secret generic app-secret --from-literal=DB_PASSWORD='redhat123'
oc set env deployment/my-httpd --from=secret/app-secret --prefix=SECRET_
oc new-app https:
oc logs -f bc/nodejs-ex
oc expose svc/nodejs-ex
curl http:
oc project lab-batch
oc create job hello-job --image=registry.access.redhat.com/ubi9/ubi-minimal -- /bin/sh -c 'date; echo hello'
oc logs job/hello-job
oc create cronjob hello-cron --image=registry.access.redhat.com/ubi9/ubi-minimal --schedule='*/1 * * * *' -- /bin/sh -c 'date; echo cron'
oc get cronjob
oc get jobs
oc project lab-web
oc get storageclass
oc apply -f pvc.yaml
oc get pvc
oc apply -f pvc-demo.yaml
oc get pods -A
oc get route -A
oc get all -A | grep httpd
oc delete project lab-web lab-batch
Code language: PHP (php)
Project
contains application resources
ImageStream
tracks image versions
Deployment
defines desired application state
ReplicaSet
maintains replicas
Pod
runs container
Service
gives stable internal access
Route
gives external browser access
BuildConfig
defines how source code becomes an image
Job
runs one-time task
CronJob
runs scheduled task
PVC
requests persistent storage
ConfigMap
stores non-sensitive config
Secret
stores sensitive config
Use this sequence in class:
1. Login and CLI setup
2. Projects and switching
3. HTTPD app from ImageStream
4. Service and Route
5. Troubleshooting route/service/pod
6. Deploy same app in second project
7. Scaling and logs
8. ConfigMap
9. Secret
10. Build from Git
11. Jobs
12. CronJobs
13. PVC/PV
14. YAML and rollout
15. Cleanup
Code language: JavaScript (javascript)
Do not create too many projects without naming discipline.
Always check oc project.
Always use oc get route -A if you cannot find your URL.
A Service is internal.
A Route is external.
A Pod can die and come back.
A Deployment keeps the app alive.
A PVC keeps data beyond pod restart.
A Job finishes.
A CronJob repeats.
A ConfigMap is not for passwords.
A Secret is for sensitive data, but production secret security needs RBAC and encryption.
Code language: PHP (php)
When it’s gone, run:
oc project
oc get all
oc get route
oc get endpoints
oc get events --sort-by=.lastTimestamp
Code language: JavaScript (javascript)
When project confusion occurs, run:
oc get all -A | grep <app-name>
oc get route -A | grep <app-name>
Code language: HTML, XML (xml)
When the app doesn’t open, run:
oc get route
oc describe route <route-name>
oc get svc
oc describe svc <service-name>
oc get endpoints <service-name>
oc get pods
oc logs deployment/<deployment-name>
Code language: HTML, XML (xml)
After completing this lab, students should feel comfortable with:
OpenShift Local daily workflow
oc CLI basics
Project switching
Application deployment
Service and Route access
Build from source
Deployment lifecycle
Config and Secret injection
Batch and scheduled jobs
Persistent storage basics
Troubleshooting
Cleanup
Code language: JavaScript (javascript)
Here’s the right foundation before moving on:
Helm
Kustomize
Operators
OpenShift Pipelines
GitOps
Monitoring
Ingress/TLS
RBAC deep dive
NetworkPolicy
Stateful applications
Production OpenShift architecture
Find a Trusted Heart Hospital
Compare heart hospitals by city and service — all in one place.
Explore the Hospital
PakarPBN
A Private Blog Network (PBN) is a collection of websites that are controlled by a single individual or organization and used primarily to build backlinks to a “money site” in order to influence its ranking in search engines such as Google. The core idea behind a PBN is based on the importance of backlinks in Google’s ranking algorithm. Since Google views backlinks as signals of authority and trust, some website owners attempt to artificially create these signals through a controlled network of sites.
In a typical PBN setup, the owner acquires expired or aged domains that already have existing authority, backlinks, and history. These domains are rebuilt with new content and hosted separately, often using different IP addresses, hosting providers, themes, and ownership details to make them appear unrelated. Within the content published on these sites, links are strategically placed that point to the main website the owner wants to rank higher. By doing this, the owner attempts to pass link equity (also known as “link juice”) from the PBN sites to the target website.
The purpose of a PBN is to give the impression that the target website is naturally earning links from multiple independent sources. If done effectively, this can temporarily improve keyword rankings, increase organic visibility, and drive more traffic from search results.
Comments are closed, but trackbacks and pingbacks are open.