Back to blog

OpenShift vs Kubernetes: What Is Actually Different, and When It Matters

June 12, 2026 12 min read Kubexer Team
OpenShiftKubernetesPlatformComparison

A question that comes up constantly: "Is OpenShift different from Kubernetes, or just a rebrand?" The honest answer is both. OpenShift is a certified Kubernetes distribution — the same control plane, the same API machinery, the same Pods and Deployments — wrapped in an opinionated platform that adds build pipelines, stricter security defaults, integrated routing, and a developer console. Understanding where the two diverge saves you from surprises when you connect to an OpenShift cluster expecting plain Kubernetes.

The relationship in one sentence

Every OpenShift cluster is a Kubernetes cluster, but not every Kubernetes cluster is OpenShift. Red Hat takes upstream Kubernetes, adds components on top, sets safer defaults, and ships it with support. Your Deployment, Service, ConfigMap, and kubectl all work unchanged. What changes is everything around the core API.

What OpenShift adds on top

The platform layer is the whole point of OpenShift. The major additions:

  • Routes — OpenShift's external traffic primitive, predating Ingress. A Route exposes a Service at a host with TLS termination handled by the built-in HAProxy router.
  • Projects — a thin wrapper around namespaces with extra access-control and lifecycle semantics. Every Project is a Namespace, but creation flows through OpenShift's tenancy model.
  • BuildConfigs and Builds — in-cluster image builds, including Source-to-Image (S2I), which turns application source straight into a runnable image without you writing a Dockerfile.
  • ImageStreams — an abstraction over container image tags that lets deployments react automatically when a new image is pushed.
  • DeploymentConfigs — the original OpenShift deployment object with triggers and hooks. (Modern OpenShift steers you toward standard Deployment objects, but you will still meet DeploymentConfigs in older clusters.)
  • The web console and OperatorHub — a polished developer/admin UI and a curated catalog of operators.

The security defaults that trip people up

This is where teams moving a working manifest from vanilla Kubernetes to OpenShift hit a wall. OpenShift ships with Security Context Constraints (SCCs) and a restrictive default policy.

The single most common surprise: containers may not run as root, and not at a UID you choose. The default restricted SCC assigns each Project a random high UID range and runs your container as one of those UIDs. An image that assumes it is root, or hardcodes USER 1000 and writes to a directory only that user owns, will fail with permission errors that never appeared on a plain cluster.

apiVersion: v1
kind: Pod
spec:
  securityContext:
    # On OpenShift, do NOT assume you control this UID.
    # Make your image tolerate an arbitrary non-root UID:
    # - group-writable paths owned by the root GROUP (gid 0)
    # - no reliance on a specific user name
    runAsNonRoot: true

The fix is to build "OpenShift-friendly" images: support an arbitrary UID, make writable paths group-writable by GID 0, and never depend on running as root. Good news — these images also run fine on any Kubernetes cluster, so it is a portability win.

SCCs themselves are cluster-scoped objects and, unlike most resources, have no spec block — their settings live as top-level fields. They are effectively OpenShift's answer to Pod Security Admission, but older and more granular.

Networking: Routes vs Ingress

On Kubernetes you expose HTTP traffic with an Ingress plus an ingress controller you install yourself. OpenShift ships a router out of the box and historically used Route objects:

apiVersion: route.openshift.io/v1
kind: Route
metadata:
  name: api
spec:
  host: api.apps.example.com
  to:
    kind: Service
    name: api
  tls:
    termination: edge

Modern OpenShift supports standard Ingress too (it quietly creates a Route behind the scenes), so you can stay portable. But you will still see Routes everywhere in existing clusters, and they offer TLS modes (edge, passthrough, re-encrypt) that map cleanly to real-world needs.

CLI and tooling

OpenShift gives you oc, a superset of kubectl. Everything kubectl does, oc does, plus commands for Projects, Routes, builds, and login flows. You can use plain kubectl against an OpenShift cluster all day — it just will not know about the OpenShift-specific kinds.

When OpenShift earns its keep

  • Regulated and enterprise environments where a supported, security-hardened platform with a clear support contract matters more than assembling your own stack.
  • Mixed developer skill levels — S2I and the console let application teams ship without deep Kubernetes expertise.
  • Standardization across many teams — opinionated defaults reduce the "every namespace is a snowflake" problem.

Vanilla Kubernetes wins when you want maximum flexibility, minimal licensing cost, the freedom to pick your own ingress, CNI, and build tooling, and you have the platform expertise to run it.

Working across both

The practical reality is that many teams operate both: upstream Kubernetes in some clusters, OpenShift in others. The resources overlap heavily, but the OpenShift-specific kinds — Routes, Projects, DeploymentConfigs, ImageStreams, BuildConfigs, Builds, SCCs — are invisible to tools that only understand plain Kubernetes. A client that auto-detects the distribution and surfaces those typed views alongside the standard resources lets you treat both kinds of cluster the same way. In Kubexer, connecting to an OpenShift cluster lights up exactly those resource views automatically, so you are not switching mental models when you switch clusters.

Wrapping up

OpenShift is not a different orchestrator — it is Kubernetes with a batteries-included platform and stricter, safer defaults. Build images that tolerate an arbitrary non-root UID, learn how Routes and SCCs work, and most of your Kubernetes knowledge transfers directly. Choose OpenShift for a supported, opinionated platform; choose vanilla Kubernetes for flexibility and control. Either way, the core you already know stays the same.