Skip to content

Routes and Networking

What You'll Learn

  • How a Route differs from an Ingress, and why OpenShift supports both
  • How the built-in HAProxy router actually handles TLS termination and traffic
  • How OpenShift's SDN and OVN-Kubernetes network plugins fit into the bigger Kubernetes networking picture

Why This Matters

Every OpenShift cluster ships a working ingress path out of the box — no separate ingress controller to install, no chart to pick. That's convenient, but it also means Routes predate and work differently from standard Kubernetes Ingress, and conflating the two leads to confusion about TLS termination modes and why a plain Ingress manifest sometimes behaves unexpectedly on OpenShift.

Mental Model

A Route is OpenShift's original, native way of exposing a Service externally — it existed before Kubernetes Ingress did. OpenShift still supports standard Ingress objects (translated internally into Routes by the router), but Routes expose OpenShift-specific TLS termination modes that Ingress alone doesn't model.

How It Works

Route vs. Ingress

Kubernetes Ingress OpenShift Route
API group networking.k8s.io/v1 route.openshift.io/v1
Portable across distributions Yes No — OpenShift-specific
Requires installing a controller Yes (nginx, Traefik, etc.) No — the router ships with the platform
TLS termination modes Controller-dependent Edge, Passthrough, Re-encrypt — first-class fields
Weighted traffic splitting across backends Not native to the spec Native (spec.to.weight, spec.alternateBackends)
apiVersion: route.openshift.io/v1
kind: Route
metadata:
  name: payments-api
  namespace: payments
spec:
  host: payments.apps.cluster.example.com
  to:
    kind: Service
    name: payments-api
    weight: 100
  port:
    targetPort: http
  tls:
    termination: edge
    insecureEdgeTerminationPolicy: Redirect
# Quickest way to expose an existing Service as a Route
oc expose service payments-api

# Create a TLS-terminated route explicitly
oc create route edge payments-api-secure --service=payments-api

oc get routes -n payments

TLS termination modes, unique to Routes:

  • Edge — TLS terminates at the router; traffic to the pod is plain HTTP. Simplest option when the app doesn't need to see TLS itself.
  • Passthrough — TLS is not decrypted by the router at all; it passes straight through to the pod, which must terminate TLS itself. Needed when the application requires the client certificate or must manage its own TLS.
  • Re-encrypt — TLS terminates at the router, then the router re-encrypts a new TLS connection to the pod. Gives you router-level features (like host-based routing) while still encrypting traffic inside the cluster.

A standard Ingress resource still works on OpenShift — the cluster's Ingress Operator watches Ingress objects and creates a corresponding Route on your behalf, so both APIs ultimately drive the same router. Teams writing portable manifests (meant to also run on vanilla Kubernetes) often stick to Ingress; teams that want OpenShift-specific features like traffic weighting or Passthrough TLS use Route directly.

The built-in HAProxy router

Every OpenShift cluster runs a default IngressController backed by HAProxy, deployed as pods in the openshift-ingress namespace. It watches Route (and Ingress) objects cluster-wide and reconfigures HAProxy automatically as Routes are created, updated, or deleted — no reload step for operators to manage themselves.

# The router's own pods
oc get pods -n openshift-ingress

# Cluster-wide router configuration (replica count, scope, etc.)
oc get ingresscontroller default -n openshift-ingress-operator -o yaml

For high-traffic clusters, the default router can be scaled with more replicas, and additional IngressControllers can be deployed for traffic isolation (e.g., a separate router dedicated to internal-only traffic) — this is a common production tuning step that a fresh OpenShift install doesn't do for you automatically.

SDN and OVN-Kubernetes

OpenShift's pod networking is implemented by a CNI plugin, same as any Kubernetes distribution — OpenShift historically shipped its own OpenShift SDN plugin, and has moved to OVN-Kubernetes as the default network plugin (the default since OpenShift 4.12, and the only supported option in current 4.x releases going forward). OVN-Kubernetes is based on Open Virtual Network and Open vSwitch, and brings capabilities OpenShift SDN didn't have natively — including better NetworkPolicy egress support and IPv6/dual-stack networking.

# Check which network plugin the cluster is running
oc get network.config.openshift.io cluster -o jsonpath='{.spec.networkType}'

# Cluster-wide network configuration
oc get network.config.openshift.io cluster -o yaml

Standard Kubernetes NetworkPolicy objects work the same way regardless of which plugin is underneath — the plugin is what enforces them, not what you author against:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-from-same-namespace
  namespace: payments
spec:
  podSelector: {}
  policyTypes:
    - Ingress
  ingress:
    - from:
        - podSelector: {}

Common Mistakes

  • Assuming Ingress "doesn't work" on OpenShift — it does; the Ingress Operator translates it into a Route behind the scenes.
  • Choosing Passthrough TLS termination by default instead of Edge — Passthrough pushes TLS management onto the application unnecessarily unless there's a real requirement (mTLS to the pod, client cert inspection) for it.
  • Forgetting the router itself can become a bottleneck at scale — not scaling router replicas or isolating traffic with a second IngressController on a high-traffic cluster.
  • Confusing OpenShift SDN (legacy) with OVN-Kubernetes (current default) when reading older documentation or troubleshooting an older cluster.

Interview Questions

  • What's the difference between edge, passthrough, and re-encrypt TLS termination on a Route?
  • How does a standard Kubernetes Ingress object behave on an OpenShift cluster?
  • What changed when OpenShift moved from OpenShift SDN to OVN-Kubernetes as the default network plugin?

See Interview Prep for full answers.

Next

Continue to Source-to-Image and Builds to see how OpenShift builds the images these Routes expose.