{"id":49101,"date":"2025-04-14T14:54:32","date_gmt":"2025-04-14T14:54:32","guid":{"rendered":"https:\/\/www.devopsschool.com\/blog\/?p=49101"},"modified":"2025-07-12T05:56:26","modified_gmt":"2025-07-12T05:56:26","slug":"openshift-comprehensive-guide-oc-vs-kubectl-cli","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/openshift-comprehensive-guide-oc-vs-kubectl-cli\/","title":{"rendered":"Openshift: Comprehensive Guide: oc vs kubectl CLI"},"content":{"rendered":"\n<p>Here\u2019s a <strong>comprehensive guide<\/strong> comparing the <code>oc<\/code> (OpenShift CLI) and <code>kubectl<\/code> (Kubernetes CLI) commands, focusing on their <strong>differences, similarities<\/strong>, and <strong>real-world usage<\/strong>. This is especially useful for OpenShift developers or admins coming from Kubernetes backgrounds.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">\ud83d\udcd8 Comprehensive Guide: <code>oc<\/code> vs <code>kubectl<\/code> CLI<\/h1>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th><strong>Aspect<\/strong><\/th><th><strong><code>oc<\/code> (OpenShift CLI)<\/strong><\/th><th><strong><code>kubectl<\/code> (Kubernetes CLI)<\/strong><\/th><\/tr><\/thead><tbody><tr><td><strong>Definition<\/strong><\/td><td>CLI tool for managing OpenShift resources and clusters<\/td><td>CLI tool for managing Kubernetes resources and clusters<\/td><\/tr><tr><td><strong>Default Cluster<\/strong><\/td><td>Targets OpenShift (Red Hat Kubernetes platform)<\/td><td>Targets any CNCF-compliant Kubernetes cluster<\/td><\/tr><tr><td><strong>Installation<\/strong><\/td><td>Installed with OpenShift tools or CRC<\/td><td>Comes bundled with most Kubernetes distributions<\/td><\/tr><tr><td><strong>Resource Access<\/strong><\/td><td>Supports all Kubernetes APIs + OpenShift APIs (e.g., <code>Build<\/code>, <code>Route<\/code>, <code>ImageStream<\/code>)<\/td><td>Supports only Kubernetes-native APIs<\/td><\/tr><tr><td><strong>Customization<\/strong><\/td><td>Includes extended functionality and OpenShift-specific templates<\/td><td>No built-in support for OpenShift-only resources<\/td><\/tr><tr><td><strong>Login<\/strong><\/td><td>Uses <code>oc login<\/code> with OpenShift OAuth<\/td><td>Uses <code>kubectl config<\/code> or kubeconfig files<\/td><\/tr><tr><td><strong>Compatibility<\/strong><\/td><td>Fully supports <code>kubectl<\/code> commands as aliases<\/td><td>Cannot access OpenShift-only resources<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u2705 Similarities Between <code>oc<\/code> and <code>kubectl<\/code><\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th><strong>Feature<\/strong><\/th><th><strong>Example Command (same for both)<\/strong><\/th><th><strong>Description<\/strong><\/th><\/tr><\/thead><tbody><tr><td>Get Pods<\/td><td><code>oc get pods<\/code> \/ <code>kubectl get pods<\/code><\/td><td>Lists pods in current namespace<\/td><\/tr><tr><td>Describe Resource<\/td><td><code>oc describe pod &lt;name&gt;<\/code> \/ <code>kubectl describe pod &lt;name&gt;<\/code><\/td><td>Detailed pod description<\/td><\/tr><tr><td>Apply YAML<\/td><td><code>oc apply -f app.yaml<\/code> \/ <code>kubectl apply -f app.yaml<\/code><\/td><td>Apply resource configuration<\/td><\/tr><tr><td>Delete Resources<\/td><td><code>oc delete pod &lt;name&gt;<\/code> \/ <code>kubectl delete pod &lt;name&gt;<\/code><\/td><td>Delete a resource<\/td><\/tr><tr><td>Logs<\/td><td><code>oc logs &lt;pod&gt;<\/code> \/ <code>kubectl logs &lt;pod&gt;<\/code><\/td><td>Stream logs from a container<\/td><\/tr><tr><td>Port-forward<\/td><td><code>oc port-forward svc\/myapp 8080:80<\/code><\/td><td>Forward local port to a service<\/td><\/tr><tr><td>Exec<\/td><td><code>oc exec -it &lt;pod&gt; -- \/bin\/bash<\/code><\/td><td>Get shell access to a pod<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>\u2705 <strong>Fact<\/strong>: Every valid <code>kubectl<\/code> command is also valid in <code>oc<\/code>.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udd34 Differences: <code>oc<\/code> Adds OpenShift-Specific Features<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th><strong>Command<\/strong><\/th><th><strong>Only in <code>oc<\/code><\/strong><\/th><th><strong>Purpose<\/strong><\/th><\/tr><\/thead><tbody><tr><td><code>oc new-app<\/code><\/td><td>Yes<\/td><td>Rapid app deployment from source\/image<\/td><\/tr><tr><td><code>oc new-project<\/code><\/td><td>Yes<\/td><td>Create a new OpenShift project (namespace)<\/td><\/tr><tr><td><code>oc adm<\/code><\/td><td>Yes<\/td><td>OpenShift admin utility commands<\/td><\/tr><tr><td><code>oc rollout<\/code><\/td><td>Extended<\/td><td>Manage OpenShift-specific rollouts<\/td><\/tr><tr><td><code>oc status<\/code><\/td><td>Yes<\/td><td>Visual overview of current project<\/td><\/tr><tr><td><code>oc whoami<\/code><\/td><td>Yes<\/td><td>Check current OpenShift user<\/td><\/tr><tr><td><code>oc get route<\/code><\/td><td>Yes<\/td><td>View OpenShift routes (external access)<\/td><\/tr><tr><td><code>oc import-image<\/code><\/td><td>Yes<\/td><td>Import images into OpenShift image streams<\/td><\/tr><tr><td><code>oc policy<\/code><\/td><td>Yes<\/td><td>RBAC management for OpenShift<\/td><\/tr><tr><td><code>oc start-build<\/code><\/td><td>Yes<\/td><td>Trigger OpenShift BuildConfig<\/td><\/tr><tr><td><code>oc logs -f bc\/&lt;buildConfig&gt;<\/code><\/td><td>Yes<\/td><td>Stream logs from OpenShift build<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>\u26a0\ufe0f <code>kubectl<\/code> <strong>does not support OpenShift-specific resources<\/strong> like <code>Route<\/code>, <code>BuildConfig<\/code>, <code>DeploymentConfig<\/code>, <code>ImageStream<\/code>.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83e\uddea Example: Deploying a Sample App<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Using <code>kubectl<\/code> (Kubernetes way):<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">kubectl<\/span> <span class=\"hljs-selector-tag\">apply<\/span> <span class=\"hljs-selector-tag\">-f<\/span> <span class=\"hljs-selector-tag\">deployment<\/span><span class=\"hljs-selector-class\">.yaml<\/span>\n<span class=\"hljs-selector-tag\">kubectl<\/span> <span class=\"hljs-selector-tag\">apply<\/span> <span class=\"hljs-selector-tag\">-f<\/span> <span class=\"hljs-selector-tag\">service<\/span><span class=\"hljs-selector-class\">.yaml<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><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<h3 class=\"wp-block-heading\">Using <code>oc<\/code> (OpenShift way):<\/h3>\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\">oc <span class=\"hljs-keyword\">new<\/span>-app nodejs~https:<span class=\"hljs-comment\">\/\/github.com\/sclorg\/nodejs-ex.git<\/span>\noc expose svc\/nodejs-ex\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>OpenShift simplifies workflows with <code>oc new-app<\/code> and <code>oc expose<\/code>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udc69\u200d\ud83d\udcbb Example: Working with Projects\/Namespaces<\/h2>\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\"><span class=\"hljs-comment\"># Create and switch in OpenShift<\/span>\noc <span class=\"hljs-keyword\">new<\/span>-project myapp\n\n<span class=\"hljs-comment\"># Create namespace in Kubernetes<\/span>\nkubectl create <span class=\"hljs-keyword\">namespace<\/span> <span class=\"hljs-title\">myapp<\/span>\n<span class=\"hljs-title\">kubectl<\/span> <span class=\"hljs-title\">config<\/span> <span class=\"hljs-title\">set<\/span>-<span class=\"hljs-title\">context<\/span> --<span class=\"hljs-title\">current<\/span> --<span class=\"hljs-title\">namespace<\/span>=<span class=\"hljs-title\">myapp<\/span>\n<\/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<h2 class=\"wp-block-heading\">\u2699\ufe0f <code>oc adm<\/code> (Admin Commands Exclusive to OpenShift)<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th><strong>Command<\/strong><\/th><th><strong>Purpose<\/strong><\/th><\/tr><\/thead><tbody><tr><td><code>oc adm diagnostics<\/code><\/td><td>Run cluster diagnostics<\/td><\/tr><tr><td><code>oc adm top<\/code><\/td><td>View resource usage like <code>kubectl top<\/code><\/td><\/tr><tr><td><code>oc adm policy add-role-to-user<\/code><\/td><td>Manage RBAC easily<\/td><\/tr><tr><td><code>oc adm groups<\/code><\/td><td>Manage OpenShift user groups<\/td><\/tr><tr><td><code>oc adm node-logs<\/code><\/td><td>View node logs in OpenShift<\/td><\/tr><tr><td><code>oc adm drain<\/code><\/td><td>Drain node (similar to <code>kubectl drain<\/code>)<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83e\udde0 When to Use What?<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th><strong>Use Case<\/strong><\/th><th><strong>Recommended CLI<\/strong><\/th><\/tr><\/thead><tbody><tr><td>Basic Kubernetes operations<\/td><td><code>kubectl<\/code> or <code>oc<\/code><\/td><\/tr><tr><td>OpenShift templates, routes, and builds<\/td><td><code>oc<\/code> only<\/td><\/tr><tr><td>Admin tasks on OpenShift (RBAC, node mgmt)<\/td><td><code>oc adm<\/code><\/td><\/tr><tr><td>Scripting across clusters (K8s generic)<\/td><td><code>kubectl<\/code><\/td><\/tr><tr><td>Using <code>CRC<\/code> or OpenShift Online<\/td><td><code>oc<\/code> preferred<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udccc Summary Table<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th><strong>Command Type<\/strong><\/th><th><code>kubectl<\/code> Support<\/th><th><code>oc<\/code> Support<\/th><\/tr><\/thead><tbody><tr><td>Kubernetes Resources<\/td><td>\u2705 Yes<\/td><td>\u2705 Yes<\/td><\/tr><tr><td>OpenShift Resources<\/td><td>\u274c No<\/td><td>\u2705 Yes<\/td><\/tr><tr><td>CLI Alias of Each Other<\/td><td>\u2705 <code>oc<\/code> supports all <code>kubectl<\/code><\/td><td>\u2705 Yes<\/td><\/tr><tr><td>Admin Commands<\/td><td>\u274c Limited<\/td><td>\u2705 Full (<code>oc adm<\/code>)<\/td><\/tr><tr><td>Developer Productivity<\/td><td>\u274c No templating<\/td><td>\u2705 Powerful templates, routes, builds<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udca1 Tip: You can always alias <code>kubectl<\/code> to <code>oc<\/code> if you&#8217;re using OpenShift full-time:<\/h3>\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\">alias kubectl=<span class=\"hljs-string\">'oc'<\/span>\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<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Here\u2019s a comprehensive guide comparing the oc (OpenShift CLI) and kubectl (Kubernetes CLI) commands, focusing on their differences, similarities, and real-world usage. This is especially useful for OpenShift developers or&#8230; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[5153],"tags":[],"class_list":["post-49101","post","type-post","status-publish","format-standard","hentry","category-openshift"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/49101","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=49101"}],"version-history":[{"count":1,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/49101\/revisions"}],"predecessor-version":[{"id":49102,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/49101\/revisions\/49102"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=49101"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=49101"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=49101"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}