{"id":49104,"date":"2026-06-26T14:07:47","date_gmt":"2026-06-26T14:07:47","guid":{"rendered":"https:\/\/www.devopsschool.com\/blog\/?p=49104"},"modified":"2026-06-26T14:07:48","modified_gmt":"2026-06-26T14:07:48","slug":"openshift-local-crc-basic-learning-workflow","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/openshift-local-crc-basic-learning-workflow\/","title":{"rendered":"OpenShift Tutorial \u2013 Deploy and Access Your First Applications using OpenShift Local"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">How to install oc?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/www.devopsschool.com\/blog\/openshift-how-to-install-openshift-cli-oc\/\">OpenShift: How to Install OpenShift CLI&nbsp;oc<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">How to login?<\/h2>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc login https:<span class=\"hljs-comment\">\/\/api.XXXXXXXXXXXXXX.centralindia.aroapp.io:6443 --username=kubeadmin --password=EgzIY-DJPw2-3NXke-HNYmJ<\/span>\n\noc login --token=sha256~LLnTlPcjcNjWsQRqnSyTn99LSvxwQdm47gaiEdZJa20 --server=https:<span class=\"hljs-comment\">\/\/api.XXXXXXXXXXXXXX.centralindia.aroapp.io:6443<\/span>\n\ncurl -H <span class=\"hljs-string\">\"Authorization: Bearer sha256~LLnTlPcjcNjWsQRqnSyTn99LSvxwQdm47gaiEdZJa20\"<\/span> <span class=\"hljs-string\">\"https:\/\/api.XXXXXXXXXXXXXX.centralindia.aroapp.io:6443\/apis\/user.openshift.io\/v1\/users\/~<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"448\" src=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2025\/04\/image-35-1024x448.png\" alt=\"\" class=\"wp-image-49289\" srcset=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2025\/04\/image-35-1024x448.png 1024w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2025\/04\/image-35-300x131.png 300w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2025\/04\/image-35-768x336.png 768w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2025\/04\/image-35.png 1089w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Login to the Openshift using Web Console and CLI<\/strong> using oc<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">crc <span class=\"hljs-built_in\">console<\/span> --credentials\n<span class=\"hljs-built_in\">eval<\/span> $(crc oc-env)\noc login -u kubeadmin -p &lt;password&gt; --insecure-skip-tls-verify\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Copy the admin URL and <code>kubeadmin<\/code> credentials \u2192 open in browser.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2025\/04\/image-37-scaled.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"393\" src=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2025\/04\/image-37-1024x393.png\" alt=\"\" class=\"wp-image-77164\" srcset=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2025\/04\/image-37-1024x393.png 1024w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2025\/04\/image-37-300x115.png 300w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2025\/04\/image-37-768x295.png 768w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2025\/04\/image-37-1536x589.png 1536w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2025\/04\/image-37-2048x786.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">rajesh@DM-GYK3HC26H7 ~ % oc login --token=sha256~gJiOSTShZqkioiWgi2IXWA9zf_5vgutfdhwP0tOUEj8 --server=https:<span class=\"hljs-comment\">\/\/api.crc.testing:6443<\/span>\nLogged into <span class=\"hljs-string\">\"https:\/\/api.crc.testing:6443\"<\/span> <span class=\"hljs-keyword\">as<\/span> <span class=\"hljs-string\">\"kubeadmin\"<\/span> using the token provided.\n\nYou have access to <span class=\"hljs-number\">65<\/span> projects, the <span class=\"hljs-keyword\">list<\/span> has been suppressed. You can <span class=\"hljs-keyword\">list<\/span> all projects with <span class=\"hljs-string\">'oc projects'<\/span>\n\nUsing project <span class=\"hljs-string\">\"default\"<\/span>.\nrajesh@DM-GYK3HC26H7 ~ % curl -H <span class=\"hljs-string\">\"Authorization: Bearer sha256~gJiOSTShZqkioiWgi2IXWA9zf_5vgutfdhwP0tOUEj8\"<\/span> <span class=\"hljs-string\">\"https:\/\/api.crc.testing:6443\/apis\/user.openshift.io\/v1\/users\/~\"<\/span>\ncurl: (<span class=\"hljs-number\">60<\/span>) SSL certificate problem: <span class=\"hljs-keyword\">self<\/span> signed certificate in certificate chain\nMore details here: https:<span class=\"hljs-comment\">\/\/curl.se\/docs\/sslcerts.html<\/span>\n\ncurl failed to verify the legitimacy of the server <span class=\"hljs-keyword\">and<\/span> therefore could not\nestablish a secure connection to it. To learn more about this situation <span class=\"hljs-keyword\">and<\/span>\nhow to fix it, please visit the web page mentioned above.\nrajesh@DM-GYK3HC26H7 ~ % curl -k -H <span class=\"hljs-string\">\"Authorization: Bearer sha256~gJiOSTShZqkioiWgi2IXWA9zf_5vgutfdhwP0tOUEj8\"<\/span> <span class=\"hljs-string\">\"https:\/\/api.crc.testing:6443\/apis\/user.openshift.io\/v1\/users\/~\"<\/span>\n{\n  <span class=\"hljs-string\">\"kind\"<\/span>: <span class=\"hljs-string\">\"User\"<\/span>,\n  <span class=\"hljs-string\">\"apiVersion\"<\/span>: <span class=\"hljs-string\">\"user.openshift.io\/v1\"<\/span>,\n  <span class=\"hljs-string\">\"metadata\"<\/span>: {\n    <span class=\"hljs-string\">\"name\"<\/span>: <span class=\"hljs-string\">\"kubeadmin\"<\/span>,\n    <span class=\"hljs-string\">\"uid\"<\/span>: <span class=\"hljs-string\">\"d85326ad-0202-4285-bfd1-bb370c668bc6\"<\/span>,\n    <span class=\"hljs-string\">\"resourceVersion\"<\/span>: <span class=\"hljs-string\">\"25096\"<\/span>,\n    <span class=\"hljs-string\">\"creationTimestamp\"<\/span>: <span class=\"hljs-string\">\"2026-05-14T11:10:41Z\"<\/span>,\n    <span class=\"hljs-string\">\"managedFields\"<\/span>: &#91;\n      {\n        <span class=\"hljs-string\">\"manager\"<\/span>: <span class=\"hljs-string\">\"oauth-server\"<\/span>,\n        <span class=\"hljs-string\">\"operation\"<\/span>: <span class=\"hljs-string\">\"Update\"<\/span>,\n        <span class=\"hljs-string\">\"apiVersion\"<\/span>: <span class=\"hljs-string\">\"user.openshift.io\/v1\"<\/span>,\n        <span class=\"hljs-string\">\"time\"<\/span>: <span class=\"hljs-string\">\"2026-05-14T11:10:41Z\"<\/span>,\n        <span class=\"hljs-string\">\"fieldsType\"<\/span>: <span class=\"hljs-string\">\"FieldsV1\"<\/span>,\n        <span class=\"hljs-string\">\"fieldsV1\"<\/span>: {\n          <span class=\"hljs-string\">\"f:identities\"<\/span>: {}\n        }\n      }\n    ]\n  },\n  <span class=\"hljs-string\">\"identities\"<\/span>: &#91;\n    <span class=\"hljs-string\">\"developer:kubeadmin\"<\/span>\n  ],\n  <span class=\"hljs-string\">\"groups\"<\/span>: &#91;\n    <span class=\"hljs-string\">\"system:authenticated\"<\/span>,\n    <span class=\"hljs-string\">\"system:authenticated:oauth\"<\/span>\n  ]\n}%                                                                                                                                                                        rajesh@DM-GYK3HC26H7 ~ % <\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">OpenShift Local CRC Basic Learning Workflow<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">World-Class Step-by-Step Lab Guide After OpenShift Local Is Running<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Audience: Beginners learning OpenShift, Kubernetes, containers, deployments, services, routes, builds, jobs, storage, ConfigMaps, and Secrets.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Platform: OpenShift Local on macOS.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Assumption: OpenShift Local is already installed and started.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">0. Lab Architecture<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">In this lab, you will use two OpenShift projects:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">lab-web    -&gt; Web apps, Deployment, Service, Route, ConfigMap, Secret, PVC\nlab-batch  -&gt; Jobs and CronJobs\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This helps students understand project switching clearly.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Core learning flow:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Project\n  -&gt; Application\n  -&gt; Deployment\n  -&gt; Pod\n  -&gt; Service\n  -&gt; Route\n  -&gt; Browser \/ curl access\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Extended learning flow:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Build <span class=\"hljs-keyword\">from<\/span> Git\n  -&gt; BuildConfig\n  -&gt; Build\n  -&gt; ImageStream\n  -&gt; Deployment\n  -&gt; Service\n  -&gt; Route\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Storage and configuration flow:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">PersistentVolume\n  -&gt; PersistentVolumeClaim\n  -&gt; Pod mount\n\nConfigMap\n  -&gt; Environment variable \/ mounted file\n\nSecret\n  -&gt; Sensitive environment variable \/ mounted file\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Batch workload flow:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Job\n  -&gt; Pod\n  -&gt; Completed task\n\nCronJob\n  -&gt; Job\n  -&gt; Pod\n  -&gt; Repeated scheduled task\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">1. Verify OpenShift Local Status<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Run:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">crc status\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Expected:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">CRC VM:          Running\nOpenShift:       Running\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">If OpenShift shows <code>Starting<\/code>, wait until it becomes <code>Running<\/code>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">2. Load the OpenShift CLI Environment<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Run:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-built_in\">eval<\/span> $(crc oc-env)\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Verify:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc version\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">You should see the OpenShift client version.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">3. Get Login Credentials<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Run:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">crc <span class=\"hljs-built_in\">console<\/span> --credentials\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">You should see users like:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">kubeadmin\ndeveloper\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">For most beginner labs, use:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"HTTP\" data-shcb-language-slug=\"http\"><span><code class=\"hljs language-http\"><span class=\"hljs-attribute\">Username<\/span>: developer\n<span class=\"hljs-attribute\">Password<\/span>: developer\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTTP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">http<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">4. Login to OpenShift Local<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Run:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc login -u developer -p developer https:<span class=\"hljs-comment\">\/\/api.crc.testing:6443<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Verify:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc whoami\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Expected:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">developer\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check the cluster API:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc cluster-info\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">5. Understand Projects<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">In OpenShift, a project is a Kubernetes namespace with extra OpenShift features.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">List projects:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc projects\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check current project:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc project\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Create the first project:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">new<\/span>-project lab-web\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Create the second project:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">new<\/span>-project lab-batch\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Switch back to the web project:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc project lab-web\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Verify:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc project\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Expected:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Using project <span class=\"hljs-string\">\"lab-web\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">6. Project Switching Practice<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Switch to <code>lab-batch<\/code>:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc project lab-batch\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check resources:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> all\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Switch to <code>lab-web<\/code>:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc project lab-web\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check resources:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-13\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> all\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-13\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Important rule:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-14\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">Resources created in lab-web are not visible in lab-batch unless you <span class=\"hljs-keyword\">use<\/span> -<span class=\"hljs-title\">A<\/span> <span class=\"hljs-title\">or<\/span> <span class=\"hljs-title\">specify<\/span> <span class=\"hljs-title\">the<\/span> <span class=\"hljs-title\">namespace<\/span>.\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-14\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Useful cross-project commands:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-15\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> pods -A\noc <span class=\"hljs-keyword\">get<\/span> svc -A\noc <span class=\"hljs-keyword\">get<\/span> route -A\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-15\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">7. Explore OpenShift ImageStreams<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Switch to <code>lab-web<\/code>:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc project lab-web\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">List ImageStreams available in the <code>openshift<\/code> namespace:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-16\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> imagestreams -n openshift\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-16\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Find HTTPD:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-17\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> imagestreams -n openshift | grep httpd\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-17\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Inspect the HTTPD ImageStream:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc describe imagestream httpd -n openshift\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Simple meaning:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">ImageStream is an OpenShift object that tracks container image versions\/tags.\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">8. Deploy First HTTPD Application<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Deploy HTTPD from OpenShift ImageStream:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-18\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">new<\/span>-app --name=my-httpd --image-stream=openshift\/httpd\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-18\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check created resources:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-19\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> all\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-19\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">You should see:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">deployment.apps\/my-httpd\nreplicaset.apps\/my-httpd-xxxxx\npod\/my-httpd-xxxxx\nservice\/my-httpd\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check pods:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-20\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> pods\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-20\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Expected:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">my-httpd-xxxxx   1\/1   Running\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">9. Understand Deployment, ReplicaSet, Pod, and Service<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Run:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-21\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> deployment\noc <span class=\"hljs-keyword\">get<\/span> replicaset\noc <span class=\"hljs-keyword\">get<\/span> pods\noc <span class=\"hljs-keyword\">get<\/span> svc\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-21\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Explanation:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Deployment  -&gt; Desired application state\nReplicaSet  -&gt; Maintains number of pod replicas\nPod         -&gt; Runs the container\nService     -&gt; Stable internal network endpoint for pods\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Describe the Deployment:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc describe deployment my-httpd\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Describe the Service:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc describe svc my-httpd\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check Service endpoints:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-22\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> endpoints my-httpd\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-22\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Expected:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-23\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">my-httpd<\/span>   10<span class=\"hljs-selector-class\">.x<\/span><span class=\"hljs-selector-class\">.x<\/span><span class=\"hljs-selector-class\">.x<\/span><span class=\"hljs-selector-pseudo\">:8080<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-23\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">If endpoints show <code>&lt;none&gt;<\/code>, the Service is not connected to a running pod.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">10. Expose the Application Using Route<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A Service is internal. To access the app from browser or curl, create a Route.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Run:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc expose svc\/my-httpd\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check Route:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-24\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> route my-httpd\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-24\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Expected:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">NAME       HOST\/PORT\nmy-httpd   my-httpd-lab-web.apps-crc.testing\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Get only the URL:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-25\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">oc get route my-httpd -o jsonpath=<span class=\"hljs-string\">'http:\/\/{.spec.host}{\"\\n\"}'<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-25\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Access using curl:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-26\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">curl http:<span class=\"hljs-comment\">\/\/$(oc get route my-httpd -o jsonpath='{.spec.host}')<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-26\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Or open in browser:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-27\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">http:<span class=\"hljs-comment\">\/\/my-httpd-lab-web.apps-crc.testing<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-27\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">11. Troubleshoot \u201cApplication Is Not Available\u201d<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">If you see:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Application is not available\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Run:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-28\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc project\noc <span class=\"hljs-keyword\">get<\/span> pods\noc <span class=\"hljs-keyword\">get<\/span> svc\noc <span class=\"hljs-keyword\">get<\/span> route\noc <span class=\"hljs-keyword\">get<\/span> endpoints my-httpd\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-28\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check whether route exists:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-29\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> route -A | grep my-httpd\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-29\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check whether app is in another project:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-30\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> all -A | grep my-httpd\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-30\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Common causes:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Wrong project\nWrong route hostname\nPod not running\nService has no endpoint\nRoute points to wrong service\nApplication still starting\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Useful debugging commands:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc describe route my-httpd\noc describe svc my-httpd\noc describe deployment my-httpd\noc logs deployment\/my-httpd\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">12. Deploy Same HTTPD App in Second Project<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Now deploy the same app in another project to understand isolation.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Switch to <code>lab-batch<\/code>:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc project lab-batch\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Deploy HTTPD:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-31\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">new<\/span>-app --name=my-httpd --image-stream=openshift\/httpd\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-31\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Expose it:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc expose svc\/my-httpd\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check route:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-32\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> route my-httpd\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-32\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">You should see a different hostname:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-33\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">my-httpd-lab-batch<\/span><span class=\"hljs-selector-class\">.apps-crc<\/span><span class=\"hljs-selector-class\">.testing<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-33\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Now compare both routes:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-34\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> route -A | grep my-httpd\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-34\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Expected:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-35\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">lab-web<\/span>     <span class=\"hljs-selector-tag\">my-httpd<\/span>   <span class=\"hljs-selector-tag\">my-httpd-lab-web<\/span><span class=\"hljs-selector-class\">.apps-crc<\/span><span class=\"hljs-selector-class\">.testing<\/span>\n<span class=\"hljs-selector-tag\">lab-batch<\/span>   <span class=\"hljs-selector-tag\">my-httpd<\/span>   <span class=\"hljs-selector-tag\">my-httpd-lab-batch<\/span><span class=\"hljs-selector-class\">.apps-crc<\/span><span class=\"hljs-selector-class\">.testing<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-35\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Access both:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-36\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">curl http:<span class=\"hljs-comment\">\/\/my-httpd-lab-web.apps-crc.testing<\/span>\ncurl http:<span class=\"hljs-comment\">\/\/my-httpd-lab-batch.apps-crc.testing<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-36\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Important learning:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Same app name can exist in different projects.\nEach project gets its own namespace and route hostname.\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">13. Delete HTTPD from lab-batch<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Keep <code>lab-web<\/code> for the rest of the labs.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Switch to <code>lab-batch<\/code>:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc project lab-batch\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Delete HTTPD resources:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-37\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">delete<\/span> all -l app=my-httpd\noc <span class=\"hljs-keyword\">delete<\/span> route my-httpd\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-37\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Verify:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-38\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> all\noc <span class=\"hljs-keyword\">get<\/span> route\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-38\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Switch back:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc project lab-web\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">14. Scale the Application<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Check current pods:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-39\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> pods\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-39\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Scale to 3 replicas:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc scale deployment\/my-httpd --replicas=3\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check pods:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-40\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> pods -o wide\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-40\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check deployment:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-41\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> deployment my-httpd\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-41\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Scale back to 1:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc scale deployment\/my-httpd --replicas=1\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Verify:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-42\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> pods\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-42\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Learning:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Deployment controls how many pod replicas should run.\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">15. Check Logs and Open Pod Shell<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">View logs from Deployment:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc logs deployment\/my-httpd\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Get pod name:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-43\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> pods\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-43\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Open shell inside pod:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc rsh deployment\/my-httpd\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Inside the container, run:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-44\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">pwd\nls\nwhoami\n<span class=\"hljs-keyword\">exit<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-44\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Alternative command:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc exec deployment\/my-httpd -- whoami\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">16. Port Forward Service Locally<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">This is useful when Route is not working or when testing private services.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Run:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc port-forward svc\/my-httpd 18080:8080\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Open another terminal and test:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-45\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">curl http:<span class=\"hljs-comment\">\/\/localhost:18080<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-45\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Stop port-forward using:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Ctrl + C\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">17. View Application Status<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Run:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc status\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This gives a human-friendly summary of the current project.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Also run:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-46\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> all\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-46\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This gives the Kubernetes\/OpenShift resource view.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">18. Add Labels<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Add a label to the Deployment:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc label deployment\/my-httpd app-type=webserver\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check labels:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-47\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> deployment my-httpd --show-labels\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-47\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Find resources by label:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-48\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> deployment -l app-type=webserver\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-48\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check pod labels:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-49\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> pods --show-labels\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-49\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Learning:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Labels are key-value metadata used for selection, grouping, and automation.\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">19. Set Resource Requests and Limits<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Set CPU and memory requests\/limits:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-50\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">set<\/span> resources deployment\/my-httpd \\\n  --requests=cpu=100m,memory=128Mi \\\n  --limits=cpu=500m,memory=256Mi\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-50\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Verify:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc describe deployment my-httpd\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check rollout:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc rollout status deployment\/my-httpd\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Learning:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Requests reserve minimum resources.\nLimits cap maximum resources.\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">20. Rollout History and Rollback<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Make a visible change:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-51\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">set<\/span> env deployment\/my-httpd TRAINING_VERSION=v1\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-51\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check rollout:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc rollout status deployment\/my-httpd\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check rollout history:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc rollout history deployment\/my-httpd\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Make another change:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-52\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">set<\/span> env deployment\/my-httpd TRAINING_VERSION=v2\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-52\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check environment:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-53\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">set<\/span> env deployment\/my-httpd --list\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-53\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Rollback:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc rollout undo deployment\/my-httpd\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check again:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-54\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc rollout status deployment\/my-httpd\noc <span class=\"hljs-keyword\">set<\/span> env deployment\/my-httpd --list\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-54\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Learning:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">OpenShift\/Kubernetes Deployments support rolling updates and rollback.\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">21. Export YAML and Apply YAML<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Export Deployment YAML:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-55\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> deployment my-httpd -o yaml &gt; my-httpd-deployment.yaml\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-55\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">View file:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-56\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">cat<\/span> <span class=\"hljs-selector-tag\">my-httpd-deployment<\/span><span class=\"hljs-selector-class\">.yaml<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-56\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Export Service YAML:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-57\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> svc my-httpd -o yaml &gt; my-httpd-service.yaml\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-57\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Export Route YAML:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-58\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> route my-httpd -o yaml &gt; my-httpd-route.yaml\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-58\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Learning:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">CLI commands create resources.\nYAML defines resources declaratively.\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Do not blindly re-apply exported YAML without cleaning fields like:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">status\nresourceVersion\nuid\nmanagedFields\ncreationTimestamp\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">22. Create ConfigMap<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Create a ConfigMap:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-59\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc create configmap app-config \\\n  --<span class=\"hljs-keyword\">from<\/span>-literal=APP_MODE=training \\\n  --<span class=\"hljs-keyword\">from<\/span>-literal=WELCOME_MESSAGE=<span class=\"hljs-string\">\"Hello from ConfigMap\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-59\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check ConfigMap:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-60\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> configmap\noc describe configmap app-config\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-60\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Inject ConfigMap values as environment variables:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-61\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">set<\/span> env deployment\/my-httpd --from=configmap\/app-config\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-61\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Verify:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-62\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">set<\/span> env deployment\/my-httpd --list\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-62\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check inside pod:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc exec deployment\/my-httpd -- env | grep APP_MODE\noc exec deployment\/my-httpd -- env | grep WELCOME_MESSAGE\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Learning:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">ConfigMap stores non-sensitive configuration.\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">23. Create ConfigMap as a File<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Create an HTML file:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-63\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">cat &gt; index.html &lt;&lt;<span class=\"hljs-string\">'EOF'<\/span>\n&lt;html&gt;\n  &lt;body&gt;\n    &lt;h1&gt;Hello from OpenShift Local&lt;\/h1&gt;\n    &lt;p&gt;This page is coming from a ConfigMap mounted into the HTTPD container.&lt;\/p&gt;\n  &lt;\/body&gt;\n&lt;\/html&gt;\nEOF\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-63\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Create ConfigMap from file:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-64\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc create configmap httpd-index --<span class=\"hljs-keyword\">from<\/span>-file=index.html\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-64\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc describe configmap httpd-index\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Mount ConfigMap into the HTTPD document root:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-65\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">set<\/span> volume deployment\/my-httpd \\\n  --add \\\n  --name=httpd-index-volume \\\n  --type=configmap \\\n  --configmap-name=httpd-index \\\n  --mount-path=\/var\/www\/html\/index.html \\\n  --sub-path=index.html\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-65\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Wait for rollout:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc rollout status deployment\/my-httpd\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Access route:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-66\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">curl http:<span class=\"hljs-comment\">\/\/$(oc get route my-httpd -o jsonpath='{.spec.host}')<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-66\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Learning:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-67\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">ConfigMaps can be consumed <span class=\"hljs-keyword\">as<\/span> environment variables or mounted <span class=\"hljs-keyword\">as<\/span> files.\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-67\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Note:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">When using subPath, ConfigMap updates may not automatically appear in the running pod.\nFor beginner labs, restart the pod or rollout the deployment after updating.\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">24. Create Secret<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Create a Secret:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-68\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc create secret generic app-secret \\\n  --<span class=\"hljs-keyword\">from<\/span>-literal=DB_USER=student \\\n  --<span class=\"hljs-keyword\">from<\/span>-literal=DB_PASSWORD=<span class=\"hljs-string\">'redhat123'<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-68\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check Secret:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-69\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> secret\noc describe secret app-secret\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-69\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Do not print real production secrets. This is only a lab.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Inject Secret as environment variables:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-70\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">set<\/span> env deployment\/my-httpd --from=secret\/app-secret --prefix=SECRET_\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-70\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Verify:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-71\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">set<\/span> env deployment\/my-httpd --list\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-71\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check inside pod:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc exec deployment\/my-httpd -- env | grep SECRET_DB_USER\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Learning:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-72\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Secret stores sensitive configuration such <span class=\"hljs-keyword\">as<\/span> passwords, tokens, and keys.\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-72\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Important:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-73\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">Secrets are not magic. <span class=\"hljs-keyword\">Use<\/span> <span class=\"hljs-title\">RBAC<\/span>, <span class=\"hljs-title\">encryption<\/span> <span class=\"hljs-title\">at<\/span> <span class=\"hljs-title\">rest<\/span>, <span class=\"hljs-title\">and<\/span> <span class=\"hljs-title\">external<\/span> <span class=\"hljs-title\">secret<\/span> <span class=\"hljs-title\">managers<\/span> <span class=\"hljs-title\">for<\/span> <span class=\"hljs-title\">production<\/span>-<span class=\"hljs-title\">grade<\/span> <span class=\"hljs-title\">security<\/span>.\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-73\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">25. Build from Source: Git to Deployment<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">This lab requires internet access from the OpenShift Local VM.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Stay in <code>lab-web<\/code>:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc project lab-web\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Deploy from Git using Source-to-Image:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-74\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">new<\/span>-app https:<span class=\"hljs-comment\">\/\/github.com\/sclorg\/nodejs-ex --name=nodejs-ex<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-74\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check generated objects:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-75\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> all\noc <span class=\"hljs-keyword\">get<\/span> buildconfig\noc <span class=\"hljs-keyword\">get<\/span> builds\noc <span class=\"hljs-keyword\">get<\/span> imagestream\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-75\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Follow the build logs:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc logs -f bc\/nodejs-ex\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">If build log command does not work, list builds:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-76\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> builds\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-76\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Then run:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc logs -f build\/nodejs-ex-1\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Expose the app:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc expose svc\/nodejs-ex\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check route:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-77\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> route nodejs-ex\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-77\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Access:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-78\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">curl http:<span class=\"hljs-comment\">\/\/$(oc get route nodejs-ex -o jsonpath='{.spec.host}')<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-78\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Learning:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Git repository\n  -&gt; BuildConfig\n  -&gt; Build\n  -&gt; ImageStream\n  -&gt; Deployment\n  -&gt; Service\n  -&gt; Route\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">26. Rebuild Source App<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Start a new build:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc start-build nodejs-ex\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Follow build:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc start-build nodejs-ex --follow\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check builds:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-79\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> builds\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-79\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check deployment:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-80\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> deployment\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-80\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check pods:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-81\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> pods\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-81\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Learning:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">BuildConfig defines how source code becomes a runnable image.\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">27. Create a Simple Job<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Switch to batch project:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc project lab-batch\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Create a Job:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-82\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc create job hello-job \\\n  --image=registry.access.redhat.com\/ubi9\/ubi-minimal \\\n  -- <span class=\"hljs-regexp\">\/bin\/<\/span>sh -c <span class=\"hljs-string\">'date; echo \"Hello from OpenShift Job\"; sleep 5; echo \"Job completed\"'<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-82\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check Job:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-83\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> jobs\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-83\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check pods:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-84\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> pods\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-84\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">View logs:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc logs job\/hello-job\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Describe Job:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc describe job hello-job\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Learning:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Job runs a task to completion.\nIt is suitable for one-time batch tasks.\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Clean up:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-85\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">delete<\/span> job hello-job\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-85\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">28. Create a CronJob<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Create a CronJob that runs every minute:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-86\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc create cronjob hello-cron \\\n  --image=registry.access.redhat.com\/ubi9\/ubi-minimal \\\n  --schedule=<span class=\"hljs-string\">'*\/1 * * * *'<\/span> \\\n  -- <span class=\"hljs-regexp\">\/bin\/<\/span>sh -c <span class=\"hljs-string\">'date; echo \"Hello from OpenShift CronJob\"'<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-86\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check CronJob:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-87\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> cronjob\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-87\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Wait for a minute, then check Jobs:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-88\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> jobs\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-88\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check pods:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-89\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> pods\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-89\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">View logs from the latest job pod:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-90\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc logs $(oc <span class=\"hljs-keyword\">get<\/span> pods --sort-by=.metadata.creationTimestamp -o name | tail -1)\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-90\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Suspend CronJob:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-91\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc patch cronjob hello-cron -p <span class=\"hljs-string\">'{\"spec\":{\"suspend\":true}}'<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-91\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Verify:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-92\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> cronjob hello-cron\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-92\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Resume CronJob:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-93\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc patch cronjob hello-cron -p <span class=\"hljs-string\">'{\"spec\":{\"suspend\":false}}'<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-93\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Delete CronJob:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-94\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">delete<\/span> cronjob hello-cron\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-94\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Delete old Jobs if any remain:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-95\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">delete<\/span> jobs --all\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-95\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Learning:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-96\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">CronJob creates Jobs on a schedule.\nUse it <span class=\"hljs-keyword\">for<\/span> scheduled tasks such <span class=\"hljs-keyword\">as<\/span> reports, cleanup, and backups.\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-96\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">29. Persistent Storage: Check StorageClass<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Switch to <code>lab-web<\/code>:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc project lab-web\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check StorageClass:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-97\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> storageclass\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-97\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">You should usually see a default storage class in OpenShift Local.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If no default StorageClass exists, your PVC may stay Pending.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">30. Create PVC<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Create a PVC:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-98\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">cat &gt; pvc.yaml &lt;&lt;<span class=\"hljs-string\">'EOF'<\/span>\n<span class=\"hljs-attr\">apiVersion<\/span>: v1\n<span class=\"hljs-attr\">kind<\/span>: PersistentVolumeClaim\n<span class=\"hljs-attr\">metadata<\/span>:\n  name: data-pvc\n<span class=\"hljs-attr\">spec<\/span>:\n  accessModes:\n    - ReadWriteOnce\n  <span class=\"hljs-attr\">resources<\/span>:\n    requests:\n      storage: <span class=\"hljs-number\">1<\/span>Gi\nEOF\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-98\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Apply:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-99\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">oc<\/span> <span class=\"hljs-selector-tag\">apply<\/span> <span class=\"hljs-selector-tag\">-f<\/span> <span class=\"hljs-selector-tag\">pvc<\/span><span class=\"hljs-selector-class\">.yaml<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-99\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-100\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> pvc\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-100\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Expected:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">data-pvc   Bound\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">If it stays Pending:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-101\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc describe pvc data-pvc\noc <span class=\"hljs-keyword\">get<\/span> storageclass\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-101\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">If your StorageClass has a specific name, update the PVC like this:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-102\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">storageClassName: <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">your-storage-class-name<\/span>&gt;<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-102\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">31. Use PVC in a Deployment<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Create Deployment that writes data into PVC:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-103\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">cat &gt; pvc-demo.yaml &lt;&lt;<span class=\"hljs-string\">'EOF'<\/span>\napiVersion: apps\/v1\nkind: Deployment\nmetadata:\n  name: pvc-demo\nspec:\n  replicas: <span class=\"hljs-number\">1<\/span>\n  selector:\n    matchLabels:\n      app: pvc-demo\n  template:\n    metadata:\n      labels:\n        app: pvc-demo\n    spec:\n      containers:\n        - name: writer\n          image: registry.access.redhat.com\/ubi9\/ubi-minimal\n          command:\n            - \/bin\/sh\n            - -c\n          args:\n            - <span class=\"hljs-keyword\">while<\/span> <span class=\"hljs-keyword\">true<\/span>; <span class=\"hljs-keyword\">do<\/span> date &gt;&gt; \/data\/visits.log; sleep <span class=\"hljs-number\">10<\/span>; done\n          volumeMounts:\n            - name: data\n              mountPath: \/data\n      volumes:\n        - name: data\n          persistentVolumeClaim:\n            claimName: data-pvc\nEOF\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-103\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Apply:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-104\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">oc<\/span> <span class=\"hljs-selector-tag\">apply<\/span> <span class=\"hljs-selector-tag\">-f<\/span> <span class=\"hljs-selector-tag\">pvc-demo<\/span><span class=\"hljs-selector-class\">.yaml<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-104\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-105\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> pods\noc <span class=\"hljs-keyword\">get<\/span> pvc\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-105\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Read file from the pod:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-106\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">POD=$(oc get pod -l app=pvc-demo -o jsonpath=<span class=\"hljs-string\">'{.items&#91;0].metadata.name}'<\/span>)\noc exec $POD -- tail <span class=\"hljs-number\">-5<\/span> \/data\/visits.log\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-106\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Delete pod:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-107\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">delete<\/span> pod $POD\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-107\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Wait for new pod:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-108\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> pods -w\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-108\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Stop watch with:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Ctrl + C\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check data again:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-109\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">NEWPOD=$(oc get pod -l app=pvc-demo -o jsonpath=<span class=\"hljs-string\">'{.items&#91;0].metadata.name}'<\/span>)\noc exec $NEWPOD -- tail <span class=\"hljs-number\">-5<\/span> \/data\/visits.log\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-109\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Learning:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Pod was deleted, but data survived because it was stored in PVC.\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">32. Understand PV and PVC<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Check PVC:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-110\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> pvc\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-110\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check PV:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-111\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> pv\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-111\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Describe PVC:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc describe pvc data-pvc\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Simple meaning:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-112\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">PV  = Storage available <span class=\"hljs-keyword\">in<\/span> the cluster\nPVC = Request <span class=\"hljs-keyword\">for<\/span> storage <span class=\"hljs-keyword\">from<\/span> a project\/application\nPod = Uses PVC <span class=\"hljs-keyword\">as<\/span> a volume\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-112\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">33. Create Manual Deployment, Service, and Route<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">This lab teaches the difference between <code>oc new-app<\/code> and manual object creation.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Switch to <code>lab-web<\/code>:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc project lab-web\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Create a Deployment manually:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-113\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">cat &gt; manual-httpd.yaml &lt;&lt;<span class=\"hljs-string\">'EOF'<\/span>\n<span class=\"hljs-attr\">apiVersion<\/span>: apps\/v1\n<span class=\"hljs-attr\">kind<\/span>: Deployment\n<span class=\"hljs-attr\">metadata<\/span>:\n  name: manual-httpd\n<span class=\"hljs-attr\">spec<\/span>:\n  replicas: <span class=\"hljs-number\">1<\/span>\n  <span class=\"hljs-attr\">selector<\/span>:\n    matchLabels:\n      app: manual-httpd\n  <span class=\"hljs-attr\">template<\/span>:\n    metadata:\n      labels:\n        app: manual-httpd\n    <span class=\"hljs-attr\">spec<\/span>:\n      containers:\n        - name: httpd\n          <span class=\"hljs-attr\">image<\/span>: image-registry.openshift-image-registry.svc:<span class=\"hljs-number\">5000<\/span>\/openshift\/httpd:latest\n          <span class=\"hljs-attr\">ports<\/span>:\n            - containerPort: <span class=\"hljs-number\">8080<\/span>\nEOF\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-113\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Apply:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-114\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">oc<\/span> <span class=\"hljs-selector-tag\">apply<\/span> <span class=\"hljs-selector-tag\">-f<\/span> <span class=\"hljs-selector-tag\">manual-httpd<\/span><span class=\"hljs-selector-class\">.yaml<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-114\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">If the internal image tag <code>latest<\/code> does not exist, check available tags:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc describe imagestream httpd -n openshift\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Then replace <code>latest<\/code> with an available tag such as:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-115\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\">2<span class=\"hljs-selector-class\">.4-ubi9<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-115\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check pod:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-116\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> pods -l app=manual-httpd\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-116\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Create Service:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc expose deployment\/manual-httpd --port=8080 --target-port=8080\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check Service:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-117\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> svc manual-httpd\noc <span class=\"hljs-keyword\">get<\/span> endpoints manual-httpd\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-117\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Create Route:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc expose svc\/manual-httpd\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check Route:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-118\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> route manual-httpd\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-118\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Access:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-119\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">curl http:<span class=\"hljs-comment\">\/\/$(oc get route manual-httpd -o jsonpath='{.spec.host}')<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-119\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Learning:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-120\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">new<\/span>-app creates several objects automatically.\nManual YAML helps you understand each object clearly.\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-120\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">34. Readiness and Liveness Probes<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Add readiness probe:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-121\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">set<\/span> probe deployment\/my-httpd \\\n  --readiness \\\n  --<span class=\"hljs-keyword\">get<\/span>-url=http:\/\/:8080\/\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-121\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Add liveness probe:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-122\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">set<\/span> probe deployment\/my-httpd \\\n  --liveness \\\n  --<span class=\"hljs-keyword\">get<\/span>-url=http:\/\/:8080\/\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-122\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check rollout:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc rollout status deployment\/my-httpd\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Describe pod:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-123\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">oc describe pod $(oc get pod -l deployment=my-httpd -o jsonpath=<span class=\"hljs-string\">'{.items&#91;0].metadata.name}'<\/span>)\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-123\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Learning:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Readiness probe decides whether pod should receive traffic.\nLiveness probe decides whether pod should be restarted.\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">35. Events and Troubleshooting<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">View events:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-124\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> events --sort-by=.lastTimestamp\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-124\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Watch pods:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-125\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> pods -w\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-125\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Describe failed pod:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-126\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">oc describe pod <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">pod-name<\/span>&gt;<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-126\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">View logs:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-127\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">oc logs <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">pod-name<\/span>&gt;<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-127\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Previous container logs:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-128\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">oc logs <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">pod-name<\/span>&gt;<\/span> --previous\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-128\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check all resources:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-129\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> all\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-129\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Common troubleshooting chain:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Route\n  -&gt; Service\n  -&gt; Endpoints\n  -&gt; Pod\n  -&gt; Container logs\n  -&gt; Events\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Commands:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-130\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> route\noc <span class=\"hljs-keyword\">get<\/span> svc\noc <span class=\"hljs-keyword\">get<\/span> endpoints\noc <span class=\"hljs-keyword\">get<\/span> pods\noc logs deployment\/my-httpd\noc <span class=\"hljs-keyword\">get<\/span> events --sort-by=.lastTimestamp\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-130\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">36. Web Console Practice<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Open console:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-131\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">crc <span class=\"hljs-built_in\">console<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-131\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Or show credentials:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-132\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">crc <span class=\"hljs-built_in\">console<\/span> --credentials\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-132\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">In the console:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-133\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-number\">1.<\/span> Login <span class=\"hljs-keyword\">as<\/span> developer\n<span class=\"hljs-number\">2.<\/span> <span class=\"hljs-keyword\">Switch<\/span> to Developer perspective\n<span class=\"hljs-number\">3.<\/span> Select lab-web project\n<span class=\"hljs-number\">4.<\/span> Go to Topology\n<span class=\"hljs-number\">5.<\/span> Click my-httpd\n<span class=\"hljs-number\">6.<\/span> Check Route, Pods, Logs, Events\n<span class=\"hljs-number\">7.<\/span> <span class=\"hljs-keyword\">Switch<\/span> to lab-batch\n<span class=\"hljs-number\">8.<\/span> Check Jobs <span class=\"hljs-keyword\">and<\/span> CronJobs\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-133\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Learning:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-134\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">CLI gives speed.\nWeb <span class=\"hljs-built_in\">console<\/span> gives visual understanding.\nUse both.\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-134\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">37. RBAC and Permissions Basics<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Check what you can do:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-135\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc auth can-i create pods\noc auth can-i create deployments\noc auth can-i create routes\noc auth can-i <span class=\"hljs-keyword\">get<\/span> secrets\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-135\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check who can view pods:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-136\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc policy who-can <span class=\"hljs-keyword\">get<\/span> pods\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-136\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check current user:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc whoami\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Learning:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">RBAC controls who can perform actions on resources.\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">38. Useful OpenShift Discovery Commands<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Find API resources:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc api-resources\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Find route resource:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc api-resources | grep route\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Find job resources:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc api-resources | grep job\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Explain a resource:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-137\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">oc<\/span> <span class=\"hljs-selector-tag\">explain<\/span> <span class=\"hljs-selector-tag\">deployment<\/span>\n<span class=\"hljs-selector-tag\">oc<\/span> <span class=\"hljs-selector-tag\">explain<\/span> <span class=\"hljs-selector-tag\">deployment<\/span><span class=\"hljs-selector-class\">.spec<\/span>\n<span class=\"hljs-selector-tag\">oc<\/span> <span class=\"hljs-selector-tag\">explain<\/span> <span class=\"hljs-selector-tag\">service<\/span>\n<span class=\"hljs-selector-tag\">oc<\/span> <span class=\"hljs-selector-tag\">explain<\/span> <span class=\"hljs-selector-tag\">route<\/span>\n<span class=\"hljs-selector-tag\">oc<\/span> <span class=\"hljs-selector-tag\">explain<\/span> <span class=\"hljs-selector-tag\">cronjob<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-137\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">39. Compare Current Project vs All Projects<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Current project only:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-138\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> pods\noc <span class=\"hljs-keyword\">get<\/span> svc\noc <span class=\"hljs-keyword\">get<\/span> route\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-138\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">All projects:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-139\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> pods -A\noc <span class=\"hljs-keyword\">get<\/span> svc -A\noc <span class=\"hljs-keyword\">get<\/span> route -A\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-139\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Find all HTTPD resources:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-140\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> all -A | grep httpd\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-140\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Find all routes:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-141\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> route -A\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-141\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Learning:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-142\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Most beginner confusion comes <span class=\"hljs-keyword\">from<\/span> being <span class=\"hljs-keyword\">in<\/span> the wrong project.\nAlways run oc project when confused.\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-142\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">40. Complete Lab Review<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">At this point, you have practiced:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-143\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Project creation and switching\nApplication deployment\nDeployment\nReplicaSet\nPod\nService\nRoute\nExpose\nScaling\nLogs\nPod shell\nPort forward\nLabels\nResource requests and limits\nRollout and rollback\nYAML <span class=\"hljs-keyword\">export<\/span>\/apply\nConfigMap\nSecret\nBuild <span class=\"hljs-keyword\">from<\/span> Git\nBuildConfig\nImageStream\nJob\nCronJob\nPVC\nPV\nWeb Console\nRBAC basics\nTroubleshooting\nCleanup\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-143\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">41. Clean Up Application Resources Only<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Switch to <code>lab-web<\/code>:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc project lab-web\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Delete HTTPD app:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-144\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">delete<\/span> all -l app=my-httpd\noc <span class=\"hljs-keyword\">delete<\/span> route my-httpd\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-144\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Delete Node.js app:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-145\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">delete<\/span> all -l app=nodejs-ex\noc <span class=\"hljs-keyword\">delete<\/span> route nodejs-ex\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-145\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Delete PVC demo:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-146\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">delete<\/span> deployment pvc-demo\noc <span class=\"hljs-keyword\">delete<\/span> pvc data-pvc\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-146\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Delete manual app:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-147\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">delete<\/span> deployment manual-httpd\noc <span class=\"hljs-keyword\">delete<\/span> svc manual-httpd\noc <span class=\"hljs-keyword\">delete<\/span> route manual-httpd\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-147\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Delete ConfigMaps and Secrets:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-148\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">delete<\/span> configmap app-config httpd-index\noc <span class=\"hljs-keyword\">delete<\/span> secret app-secret\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-148\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Switch to <code>lab-batch<\/code>:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc project lab-batch\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Delete batch resources:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-149\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">delete<\/span> jobs --all\noc <span class=\"hljs-keyword\">delete<\/span> cronjobs --all\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-149\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">42. Clean Up Projects<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Delete both lab projects:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-150\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">delete<\/span> project lab-web\noc <span class=\"hljs-keyword\">delete<\/span> project lab-batch\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-150\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Verify:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc projects\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">43. Final One-Page Command Summary<\/h1>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-151\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">crc status\n<span class=\"hljs-keyword\">eval<\/span> $(crc oc-env)\ncrc console --credentials\noc login -u developer -p developer https:<span class=\"hljs-comment\">\/\/api.crc.testing:6443<\/span>\n\noc <span class=\"hljs-keyword\">new<\/span>-project lab-web\noc <span class=\"hljs-keyword\">new<\/span>-project lab-batch\n\noc project lab-web\noc get imagestreams -n openshift\noc <span class=\"hljs-keyword\">new<\/span>-app --name=my-httpd --image-stream=openshift\/httpd\noc get all\noc expose svc\/my-httpd\noc get route my-httpd\ncurl http:<span class=\"hljs-comment\">\/\/$(oc get route my-httpd -o jsonpath='{.spec.host}')<\/span>\n\noc scale deployment\/my-httpd --replicas=<span class=\"hljs-number\">3<\/span>\noc get pods\noc scale deployment\/my-httpd --replicas=<span class=\"hljs-number\">1<\/span>\n\noc logs deployment\/my-httpd\noc rsh deployment\/my-httpd\n\noc create configmap app-config --from-literal=APP_MODE=training\noc set env deployment\/my-httpd --from=configmap\/app-config\n\noc create secret generic app-secret --from-literal=DB_PASSWORD=<span class=\"hljs-string\">'redhat123'<\/span>\noc set env deployment\/my-httpd --from=secret\/app-secret --prefix=SECRET_\n\noc <span class=\"hljs-keyword\">new<\/span>-app https:<span class=\"hljs-comment\">\/\/github.com\/sclorg\/nodejs-ex --name=nodejs-ex<\/span>\noc logs -f bc\/nodejs-ex\noc expose svc\/nodejs-ex\ncurl http:<span class=\"hljs-comment\">\/\/$(oc get route nodejs-ex -o jsonpath='{.spec.host}')<\/span>\n\noc project lab-batch\noc create job hello-job --image=registry.access.redhat.com\/ubi9\/ubi-minimal -- \/bin\/sh -c <span class=\"hljs-string\">'date; echo hello'<\/span>\noc logs job\/hello-job\n\noc create cronjob hello-cron --image=registry.access.redhat.com\/ubi9\/ubi-minimal --schedule=<span class=\"hljs-string\">'*\/1 * * * *'<\/span> -- \/bin\/sh -c <span class=\"hljs-string\">'date; echo cron'<\/span>\noc get cronjob\noc get jobs\n\noc project lab-web\noc get storageclass\noc apply -f pvc.yaml\noc get pvc\noc apply -f pvc-demo.yaml\n\noc get pods -A\noc get route -A\noc get all -A | grep httpd\n\noc delete project lab-web lab-batch\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-151\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">44. Key Mental Model<\/h1>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Project\n  contains application resources\n\nImageStream\n  tracks image versions\n\nDeployment\n  defines desired application state\n\nReplicaSet\n  maintains replicas\n\nPod\n  runs container\n\nService\n  gives stable internal access\n\nRoute\n  gives external browser access\n\nBuildConfig\n  defines how source code becomes an image\n\nJob\n  runs one-time task\n\nCronJob\n  runs scheduled task\n\nPVC\n  requests persistent storage\n\nConfigMap\n  stores non-sensitive config\n\nSecret\n  stores sensitive config\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">45. Recommended Teaching Order<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Use this order in class:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-152\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-number\">1.<\/span> Login and CLI setup\n<span class=\"hljs-number\">2.<\/span> Projects and switching\n<span class=\"hljs-number\">3.<\/span> HTTPD app <span class=\"hljs-keyword\">from<\/span> ImageStream\n<span class=\"hljs-number\">4.<\/span> Service and Route\n<span class=\"hljs-number\">5.<\/span> Troubleshooting route\/service\/pod\n<span class=\"hljs-number\">6.<\/span> Deploy same app <span class=\"hljs-keyword\">in<\/span> second project\n<span class=\"hljs-number\">7.<\/span> Scaling and logs\n<span class=\"hljs-number\">8.<\/span> ConfigMap\n<span class=\"hljs-number\">9.<\/span> Secret\n<span class=\"hljs-number\">10.<\/span> Build <span class=\"hljs-keyword\">from<\/span> Git\n<span class=\"hljs-number\">11.<\/span> Jobs\n<span class=\"hljs-number\">12.<\/span> CronJobs\n<span class=\"hljs-number\">13.<\/span> PVC\/PV\n<span class=\"hljs-number\">14.<\/span> YAML and rollout\n<span class=\"hljs-number\">15.<\/span> Cleanup\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-152\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">46. Important Notes for Students<\/h1>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-153\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-keyword\">Do<\/span> not create too many projects without naming discipline.\nAlways check oc project.\nAlways <span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">oc<\/span> <span class=\"hljs-title\">get<\/span> <span class=\"hljs-title\">route<\/span> -<span class=\"hljs-title\">A<\/span> <span class=\"hljs-title\">if<\/span> <span class=\"hljs-title\">you<\/span> <span class=\"hljs-title\">cannot<\/span> <span class=\"hljs-title\">find<\/span> <span class=\"hljs-title\">your<\/span> <span class=\"hljs-title\">URL<\/span>.\n<span class=\"hljs-title\">A<\/span> <span class=\"hljs-title\">Service<\/span> <span class=\"hljs-title\">is<\/span> <span class=\"hljs-title\">internal<\/span>.\n<span class=\"hljs-title\">A<\/span> <span class=\"hljs-title\">Route<\/span> <span class=\"hljs-title\">is<\/span> <span class=\"hljs-title\">external<\/span>.\n<span class=\"hljs-title\">A<\/span> <span class=\"hljs-title\">Pod<\/span> <span class=\"hljs-title\">can<\/span> <span class=\"hljs-title\">die<\/span> <span class=\"hljs-title\">and<\/span> <span class=\"hljs-title\">come<\/span> <span class=\"hljs-title\">back<\/span>.\n<span class=\"hljs-title\">A<\/span> <span class=\"hljs-title\">Deployment<\/span> <span class=\"hljs-title\">keeps<\/span> <span class=\"hljs-title\">the<\/span> <span class=\"hljs-title\">app<\/span> <span class=\"hljs-title\">alive<\/span>.\n<span class=\"hljs-title\">A<\/span> <span class=\"hljs-title\">PVC<\/span> <span class=\"hljs-title\">keeps<\/span> <span class=\"hljs-title\">data<\/span> <span class=\"hljs-title\">beyond<\/span> <span class=\"hljs-title\">pod<\/span> <span class=\"hljs-title\">restart<\/span>.\n<span class=\"hljs-title\">A<\/span> <span class=\"hljs-title\">Job<\/span> <span class=\"hljs-title\">finishes<\/span>.\n<span class=\"hljs-title\">A<\/span> <span class=\"hljs-title\">CronJob<\/span> <span class=\"hljs-title\">repeats<\/span>.\n<span class=\"hljs-title\">A<\/span> <span class=\"hljs-title\">ConfigMap<\/span> <span class=\"hljs-title\">is<\/span> <span class=\"hljs-title\">not<\/span> <span class=\"hljs-title\">for<\/span> <span class=\"hljs-title\">passwords<\/span>.\n<span class=\"hljs-title\">A<\/span> <span class=\"hljs-title\">Secret<\/span> <span class=\"hljs-title\">is<\/span> <span class=\"hljs-title\">for<\/span> <span class=\"hljs-title\">sensitive<\/span> <span class=\"hljs-title\">data<\/span>, <span class=\"hljs-title\">but<\/span> <span class=\"hljs-title\">production<\/span> <span class=\"hljs-title\">secret<\/span> <span class=\"hljs-title\">security<\/span> <span class=\"hljs-title\">needs<\/span> <span class=\"hljs-title\">RBAC<\/span> <span class=\"hljs-title\">and<\/span> <span class=\"hljs-title\">encryption<\/span>.\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-153\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">47. Best Beginner Troubleshooting Command Set<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">When lost, run:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-154\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc project\noc <span class=\"hljs-keyword\">get<\/span> all\noc <span class=\"hljs-keyword\">get<\/span> route\noc <span class=\"hljs-keyword\">get<\/span> endpoints\noc <span class=\"hljs-keyword\">get<\/span> events --sort-by=.lastTimestamp\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-154\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">When project confusion happens, run:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-155\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">oc get all -A | grep <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">app-name<\/span>&gt;<\/span>\noc get route -A | grep <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">app-name<\/span>&gt;<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-155\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">When app does not open, run:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-156\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">oc get route\noc describe route <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">route-name<\/span>&gt;<\/span>\noc get svc\noc describe svc <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">service-name<\/span>&gt;<\/span>\noc get endpoints <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">service-name<\/span>&gt;<\/span>\noc get pods\noc logs deployment\/<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">deployment-name<\/span>&gt;<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-156\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">48. Final Outcome<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">After completing this lab, students should be comfortable with:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-157\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">OpenShift Local daily workflow\noc CLI basics\nProject switching\nApplication deployment\nService and Route access\nBuild <span class=\"hljs-keyword\">from<\/span> source\nDeployment lifecycle\nConfig and Secret injection\nBatch and scheduled jobs\nPersistent storage basics\nTroubleshooting\nCleanup\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-157\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This is the right foundation before moving into:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Helm\nKustomize\nOperators\nOpenShift Pipelines\nGitOps\nMonitoring\nIngress\/TLS\nRBAC deep dive\nNetworkPolicy\nStateful applications\nProduction OpenShift architecture\n<\/code><\/span><\/pre>","protected":false},"excerpt":{"rendered":"<p>How to install oc? OpenShift: How to Install OpenShift CLI&nbsp;oc How to login? Login to the Openshift using Web Console and CLI using oc Copy the admin&#8230; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[5153],"tags":[],"class_list":["post-49104","post","type-post","status-publish","format-standard","hentry","category-openshift"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/49104","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=49104"}],"version-history":[{"count":10,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/49104\/revisions"}],"predecessor-version":[{"id":77244,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/49104\/revisions\/77244"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=49104"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=49104"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=49104"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}