Running OpenShift in Production: What AWS EKS and GKE Don't Tell You
You’ve scaled Kubernetes to production on EKS or GKE, and everything works—until you need to migrate workloads between clouds, enforce corporate security policies across clusters, or explain to compliance why your container registry doesn’t have built-in image signing. That’s when vanilla Kubernetes stops being enough.
The problem isn’t that managed Kubernetes services are bad—they’re excellent at what they do. AWS, Google, and Azure have eliminated the operational overhead of running control planes, made cluster upgrades mostly painless, and integrated deep into their respective cloud ecosystems. But that ecosystem integration is precisely the trap. Your EKS clusters depend on AWS IAM, ALB Ingress Controllers, ECR, and CloudWatch. Your GKE workloads assume GCP’s Workload Identity, Cloud Load Balancing, and Artifact Registry. Move those applications to another cloud, and you’re rewriting Terraform, swapping authentication mechanisms, and debugging why your ingress annotations don’t work anymore.
The second problem surfaces when you go beyond infrastructure. Kubernetes gives you pods, services, and deployments. It doesn’t give you a container registry with vulnerability scanning and image signing. It doesn’t include an ingress controller that works the same way across every cluster. It doesn’t enforce network policies by default or provide a built-in way to route external traffic without vendor-specific annotations. These aren’t optional features for enterprises—they’re table stakes. So you build them yourself, assembling Harbor, Istio, cert-manager, and a dozen operators into an internal platform that needs its own documentation, maintenance, and on-call rotation.
OpenShift entered production environments not because it’s theoretically better than Kubernetes, but because it solves these operational gaps by default. The question isn’t whether you need these capabilities—you’re already building or buying them. The question is whether an opinionated, integrated platform makes more sense than stitching together your own.
The Enterprise Kubernetes Gap: What Managed Services Don’t Provide
EKS, GKE, and AKS solve a critical problem: they eliminate the operational burden of managing Kubernetes control planes. You get automatic upgrades, managed etcd, and infrastructure that scales without manual intervention. For many workloads, this is exactly what you need.

But managed Kubernetes services stop at the infrastructure layer. They give you a working cluster, then leave you to build everything else. The gap between “Kubernetes is running” and “developers can ship code safely” is wider than most organizations anticipate.
The Hidden Platform Tax
When you run vanilla Kubernetes in production, you inherit a set of operational problems that managed services don’t address. You need an image registry that integrates with your cluster security model. You need ingress controllers configured consistently across environments. You need a way to enforce network policies without requiring every team to become CNI experts. You need unified logging, metrics, and tracing that works across multiple clusters.
Most platform teams end up building an internal platform layer on top of EKS or GKE. This means evaluating, integrating, and maintaining separate solutions for image management (Harbor or ECR), ingress routing (NGINX, Traefik, or cloud load balancers), service mesh (Istio, Linkerd), secrets management (Vault, Sealed Secrets), and GitOps workflows (ArgoCD, Flux). Each component introduces integration complexity, version compatibility matrices, and operational overhead.
The real cost isn’t in the tooling—it’s in the engineering time. A platform team of three engineers can easily spend 40% of their time managing the integration layer instead of delivering features that differentiate your business. When you multiply this across multiple clusters in different clouds, the maintenance burden compounds.
Where Opinionated Distributions Add Value
OpenShift addresses these gaps by providing integrated components that work together out of the box. The built-in image registry integrates with the cluster’s RBAC model and automatically triggers deployments when images are pushed. The router handles ingress with sensible defaults while allowing customization when needed. Security contexts and network policies are enforced by default, not opt-in configurations that teams forget to apply.
This matters most in multicloud environments. When you run Kubernetes across AWS, Azure, and GCP, maintaining consistent behavior becomes a challenge. Cloud-specific ingress controllers behave differently. IAM integration varies by provider. Even basic operations like persistent volume provisioning require provider-specific configurations.
An opinionated distribution standardizes these experiences. Your developers interact with the same APIs, the same deployment patterns, and the same security model regardless of the underlying infrastructure. This consistency reduces cognitive load and eliminates entire categories of configuration drift.
The question isn’t whether managed Kubernetes works—it does. The question is whether building and maintaining your own platform layer on top of it is the best use of your engineering resources. For organizations running production workloads across multiple clouds, the answer is often no.
OpenShift’s Architecture: Kubernetes Plus Operational Opinions
OpenShift doesn’t just package Kubernetes—it makes architectural decisions for you. While AWS EKS and GKE give you vanilla Kubernetes with optional add-ons, OpenShift ships with hardened defaults and additional primitives that change how you build and deploy applications.
Beyond Standard Kubernetes Resources
OpenShift extends the Kubernetes API with resources designed for enterprise workflows. Routes provide layer 7 ingress with automatic TLS termination before Kubernetes Ingress matured. BuildConfigs codify your container build pipeline directly in the cluster. DeploymentConfigs add deployment strategies that predate and extend Kubernetes Deployments.
Here’s a Route that handles external traffic with edge TLS termination:
apiVersion: route.openshift.io/v1kind: Routemetadata: name: frontend namespace: productionspec: host: app.timderzhavets.com to: kind: Service name: frontend-service port: targetPort: 8080 tls: termination: edge insecureEdgeTerminationPolicy: RedirectThis creates a publicly accessible endpoint with automatic HTTP-to-HTTPS redirection—no separate Ingress controller configuration required. The OpenShift router (based on HAProxy) handles TLS certificates, traffic shaping, and canary deployments out of the box.
The Operator-First Philosophy
Where managed Kubernetes platforms ask you to install operators, OpenShift runs on them. The cluster itself is a collection of operators managing everything from API servers to image registries. The Cluster Version Operator orchestrates updates across 50+ components. The Machine Config Operator handles node-level configuration including kernel parameters and systemd units.
This architecture means every cluster component is upgradeable without manual intervention. When you update from OpenShift 4.14 to 4.15, operators coordinate the rollout across control plane, workers, and cluster services. No runbooks for upgrading etcd or replacing certificates—the operators handle dependency ordering and rollback scenarios.
The trade-off: you can’t easily swap components. Want Cilium instead of the OpenShift SDN? You’re fighting the operators. This opinionated approach reduces operational variables but limits architectural flexibility.
Security Controls That Slow You Down (On Purpose)
OpenShift’s security defaults will break your existing containers. Security Context Constraints (SCCs) are more restrictive than Kubernetes Pod Security Standards. The default restricted SCC blocks:
- Running as root (UID 0)
- Privilege escalation
- Host namespace access
- Arbitrary volume mounts
apiVersion: security.openshift.io/v1kind: SecurityContextConstraintsmetadata: name: backend-sccallowPrivilegeEscalation: falseallowHostDirVolumePlugin: falserunAsUser: type: MustRunAsRange uidRangeMin: 100000 uidRangeMax: 165535seLinuxContext: type: MustRunAsvolumes:- configMap- secret- persistentVolumeClaimThis SCC forces non-root execution with assigned UID ranges—your Node.js app running as root in the container image won’t start. SELinux policies enforce isolation at the kernel level, blocking container escapes that bypass namespace restrictions.
These constraints force you to fix security issues rather than defer them. The migration pain is real: expect to rebuild base images and refactor privileged init containers. But once operational, you get defense-in-depth that managed services leave as optional configuration.
Integrated Build Pipeline
OpenShift’s BuildConfig turns Git repositories into container images without external CI:
apiVersion: build.openshift.io/v1kind: BuildConfigmetadata: name: backend-apispec: source: git: uri: https://github.com/timderzhavets/backend-api ref: main strategy: sourceStrategy: from: kind: ImageStreamTag name: nodejs-16:latest output: to: kind: ImageStreamTag name: backend-api:latestThis build runs inside the cluster using Source-to-Image (S2I), which layers your application code onto curated base images. No Docker daemon, no privileged builders—builds run as unprivileged pods with resource limits.
The architectural opinions here eliminate decisions: where to run builds, how to scan images, how to promote across environments. OpenShift answers these questions with integrated tooling. The cost is reduced flexibility compared to bringing your own GitLab runners or GitHub Actions workflows.
Understanding these architectural choices—Routes over Ingress, operators over static manifests, SCCs over permissive defaults—clarifies where OpenShift adds value and where it constrains your options. The next question becomes how these opinions translate across cloud providers.
Multicloud Reality: Running OpenShift Across AWS, Azure, and GCP
The promise of multicloud Kubernetes is portability. The reality is that each cloud provider has different networking models, storage classes, and operational constraints that affect how you deploy and connect OpenShift clusters. Understanding these differences determines whether your multicloud strategy delivers flexibility or operational chaos.

Deployment Models: Managed vs Self-Managed Trade-offs
Azure Red Hat OpenShift (ARO) offers the only fully managed OpenShift experience backed by joint Microsoft-Red Hat SRE support. You get automated cluster operations, integrated Azure AD authentication, and consumption-based billing. The trade-off is reduced control over node configuration and update schedules.
## Deploy managed OpenShift on Azureaz aro create \ --resource-group production-openshift \ --name prod-cluster-eastus \ --vnet aro-vnet \ --master-subnet master-subnet \ --worker-subnet worker-subnet \ --pull-secret @pull-secret.txt \ --domain openshift-prod.example.comOn AWS and GCP, you install self-managed OpenShift using the installer-provisioned infrastructure (IPI) method. This gives you full control over cluster configuration but transfers operational responsibility to your team. The installer handles cloud API integration, but you manage control plane upgrades and infrastructure changes.
## Self-managed OpenShift on AWS./openshift-install create cluster --dir=./aws-cluster --log-level=info
## Generated install-config.yaml specifies AWS-specific settingscat <<EOF > aws-cluster/install-config.yamlapiVersion: v1baseDomain: example.complatform: aws: region: us-west-2 subnets: - subnet-0a1b2c3d4e5f6g7h8 - subnet-9i8h7g6f5e4d3c2b1compute: - platform: aws: type: m5.xlargeEOFThe cost difference is significant. ARO pricing includes Red Hat licensing and Azure infrastructure at roughly $3.50/hour for a minimal production cluster. Self-managed on AWS costs approximately $0.75/hour for control plane instances plus worker nodes, but you pay separately for Red Hat subscriptions and operational overhead.
Cross-Cloud Networking: The Hard Parts
Connecting OpenShift clusters across cloud boundaries requires addressing three layers: transit networking, service mesh integration, and DNS resolution. Most organizations start with VPN tunnels or cloud interconnect services, but these introduce latency and bandwidth costs that impact cross-cluster workloads.
Azure ExpressRoute, AWS Direct Connect, and GCP Cloud Interconnect provide private connectivity, but each uses different routing models. Azure route servers support BGP peering across VNets and on-premises networks. AWS Transit Gateway enables hub-and-spoke topologies but requires careful CIDR planning to avoid overlaps. GCP’s VPC Network Peering uses Google’s backbone but doesn’t support transitive routing.
## Deploy Submariner for cross-cluster networkingsubctl deploy-broker --kubeconfig aws-cluster-kubeconfig.yaml
## Join Azure cluster to brokersubctl join broker-info.subm --kubeconfig aro-cluster-kubeconfig.yaml \ --clusterid azure-prod-eastus \ --cable-driver vxlan
## Join GCP cluster to brokersubctl join broker-info.subm --kubeconfig gcp-cluster-kubeconfig.yaml \ --clusterid gcp-prod-west1 \ --cable-driver vxlanSubmariner, Red Hat’s multicluster networking solution, establishes encrypted tunnels between OpenShift clusters using gateway nodes. It handles service discovery and enables pods in one cluster to communicate with services in another using stable ClusterIP addresses. The gateway nodes become critical path components—plan for redundancy and monitor tunnel health.
💡 Pro Tip: Use Submariner’s globalnet feature when cluster Pod CIDR ranges overlap. It assigns global IPs to services and performs NAT at gateway nodes, trading some performance for operational flexibility.
Storage Classes and Persistent Volumes
Each cloud provider exposes different storage primitives through Kubernetes CSI drivers. OpenShift automatically configures default storage classes during installation, but understanding the underlying storage characteristics prevents performance issues and unexpected costs.
Azure Disk provides block storage with Premium SSD options offering single-digit millisecond latency. AWS EBS volumes offer io2 Block Express for high-throughput databases. GCP Persistent Disks support regional replication for HA workloads. The OpenShift storage operator abstracts these differences, but your application’s I/O patterns determine which storage class delivers acceptable performance.
Cross-cloud backup and disaster recovery requires storage-agnostic solutions. OADP (OpenShift API for Data Protection) uses Velero to snapshot persistent volumes and Kubernetes resources to object storage, enabling cluster migration across cloud providers without re-architecting storage layers.
With clusters deployed and connected, the next challenge is implementing security controls that work consistently across cloud provider boundaries while meeting compliance requirements.
Security Controls That Actually Work in Production
Most Kubernetes security guides assume you’ll build custom admission controllers, deploy third-party policy engines, and maintain hundreds of lines of OPA rules. OpenShift ships with enterprise-grade security controls that work out of the box—controls that platform teams need when auditors start asking questions about privilege escalation and compliance posture.
Security Context Constraints: Privilege Escalation Prevention
Security Context Constraints (SCCs) solve the problem that PodSecurityPolicies (deprecated) and Pod Security Standards (too permissive for enterprise) leave unaddressed: granular control over what workloads can actually do at runtime.
Unlike Kubernetes’ native Pod Security Standards which offer only three broad profiles, SCCs let you define exactly which capabilities, volumes, and user contexts are allowed. The default restricted SCC prevents the most common production security incidents:
apiVersion: security.openshift.io/v1kind: SecurityContextConstraintsmetadata: name: webapp-restrictedallowPrivilegedContainer: falseallowHostDirVolumePlugin: falseallowHostNetwork: falseallowHostPID: falseallowHostPorts: falserunAsUser: type: MustRunAsRange uidRangeMin: 100000 uidRangeMax: 165535seLinuxContext: type: MustRunAsfsGroup: type: MustRunAssupplementalGroups: type: RunAsAnyvolumes:- configMap- downwardAPI- emptyDir- persistentVolumeClaim- projected- secretWhen developers try to deploy a container running as root or requesting host network access, OpenShift blocks it at admission time. No custom webhooks required—just assign the SCC to a service account and enforce it cluster-wide.
Image Signing and Registry Integration
OpenShift’s integrated registry doesn’t just store images—it enforces signature verification using built-in trust policies. This prevents the supply chain attacks where unsigned or tampered images get deployed to production.
apiVersion: config.openshift.io/v1kind: Imagemetadata: name: clusterspec: registrySources: allowedRegistries: - registry.redhat.io - quay.io/my-org registryConfig: signatureStoreURL: https://registry.example.com/signatures imagePolicy: requiredSignatures: - registry: quay.io/my-org keyID: 4a7f8b92c3d1e5f6 transport: dockerWhen an image pulls from quay.io/my-org, OpenShift verifies the GPG signature matches the configured key. Unsigned images fail at deployment time, not during a security audit six months later.
Zero-Trust Network Segmentation
OpenShift’s network policies work the same as Kubernetes, but the platform enforces them by default in multi-tenant mode. Every new project (namespace) starts with ingress and egress rules that deny cross-namespace traffic unless explicitly allowed:
apiVersion: networking.k8s.io/v1kind: NetworkPolicymetadata: name: allow-from-prod-namespace namespace: production-apisspec: podSelector: matchLabels: app: payment-service policyTypes: - Ingress ingress: - from: - namespaceSelector: matchLabels: environment: production - podSelector: matchLabels: role: frontend ports: - protocol: TCP port: 8443This prevents lateral movement by default—the security posture most compliance frameworks require but few teams actually implement on EKS or GKE.
Compliance Scanning Without Third-Party Tools
OpenShift’s Compliance Operator continuously scans cluster configuration against CIS Benchmarks, PCI-DSS, and NIST 800-53 profiles. It generates machine-readable reports that map directly to SOC 2 control requirements:
apiVersion: compliance.openshift.io/v1alpha1kind: ScanSettingBindingmetadata: name: pci-dss-scan namespace: openshift-complianceprofiles:- name: ocp4-pci-dss kind: Profile apiGroup: compliance.openshift.io/v1alpha1settingsRef: name: default kind: ScanSetting apiGroup: compliance.openshift.io/v1alpha1The operator runs automated remediations for misconfigurations and tracks drift over time—delivering the audit trail that external scanners charge per-node licensing fees to provide.
💡 Pro Tip: Run compliance scans in a dedicated namespace and export results to your SIEM. The structured output integrates directly with Splunk, Datadog, and other observability platforms without custom parsing.
These controls don’t eliminate the need for security expertise, but they shift the work from building infrastructure to configuring policies—exactly where platform teams should focus when managing production workloads across AWS, Azure, and GCP. The next section examines how OpenShift’s developer tooling amplifies these security controls by making secure deployments the default path.
Developer Experience: The Hidden Productivity Multiplier
Most Kubernetes platform comparisons focus on infrastructure metrics—CPU efficiency, network throughput, storage IOPS. But the operational cost that actually crushes engineering velocity is context switching. Every time a developer needs to leave their IDE to configure TLS certificates, debug routing rules, or trace logs across three different UIs, you’re hemorrhaging productivity.
OpenShift’s integrated developer tooling eliminates entire categories of toil that EKS and GKE treat as “bring your own solution” problems.
Source-to-Image: CI/CD Without the Pipeline Tax
On EKS, deploying a Node.js application means maintaining Dockerfiles, configuring GitHub Actions or Jenkins, managing image registries, and keeping base images patched. OpenShift’s Source-to-Image (S2I) builds handle this entire workflow:
## Create application directly from Git repositoryoc new-app nodejs:18~https://github.com/myorg/api-service \ --name=payment-api \ --build-env NPM_MIRROR=https://registry.npmjs.org
## Automatic builds on Git webhook triggersoc set triggers bc/payment-api --from-github
## Zero-downtime deployments with health checksoc set probe dc/payment-api \ --readiness --get-url=http://:8080/health \ --initial-delay-seconds=30This replaces 300+ lines of Jenkins pipeline configuration and eliminates an entire class of “works on my machine” container build failures. S2I builder images are Red Hat-maintained, CVE-scanned, and updated automatically—no more Dependabot alerts for base image vulnerabilities at 3am.
Routing and TLS: Seconds, Not Sprints
Exposing a service with HTTPS on GKE requires provisioning a Load Balancer, configuring Google-managed certificates or cert-manager, updating DNS, and waiting 15+ minutes for certificate validation. On OpenShift:
## Create route with automatic TLS terminationoc create route edge payment-api \ --service=payment-api \ --hostname=api.mycompany.com \ --insecure-policy=Redirect
## Wildcard certificates for entire namespacesoc annotate route payment-api \ router.openshift.io/haproxy.health.check.interval=5sThe OpenShift Router handles TLS certificate provisioning via Let’s Encrypt integration, manages renewals, and provides edge/passthrough/reencrypt termination modes without external dependencies. Routes appear in the web console within seconds, not the 20-minute DNS propagation cycles typical with cloud load balancers.
Observability Without the Integration Hell
EKS monitoring means stitching together CloudWatch, Prometheus, Grafana, Fluentd, and Jaeger—five different authentication systems, data silos that don’t correlate, and query languages your team needs to learn. OpenShift’s web console surfaces pod logs, metrics, and events in context:
Click a failing pod → view real-time logs → drill into CPU/memory graphs → inspect events—all without leaving the browser or remembering Prometheus PromQL syntax. For developers troubleshooting a production incident at 2am, this integrated experience cuts mean-time-to-resolution from 45 minutes to under 10.
💡 Pro Tip: Enable OpenShift’s Developer Topology view for visual service dependency mapping. It automatically generates architecture diagrams from deployed resources—documentation that actually stays current.
The productivity gain compounds: less time configuring infrastructure means more time shipping features. When we examine migration strategies next, this developer experience advantage becomes a key retention factor.
Migration Strategies: Moving From EKS/GKE to OpenShift
Migration from EKS or GKE to OpenShift isn’t a lift-and-shift operation. While OpenShift is Kubernetes-compliant, its opinionated architecture means you’ll need to transform certain resources and adapt to different operational patterns. Here’s how to execute a zero-downtime migration with minimal disruption.
Workload Compatibility Assessment
Start by inventorying what actually needs to change. Standard Kubernetes resources—Deployments, StatefulSets, Services, ConfigMaps, Secrets—transfer directly. The friction points are platform-specific integrations:
- Ingress resources need conversion to OpenShift Routes or remain as Ingress with the ingress-controller operator
- Service type LoadBalancer annotations are cloud-specific and require remapping
- Storage classes have different provisioners between clouds
- IAM bindings (IRSA on EKS, Workload Identity on GKE) map to OpenShift’s Service Account token projection
Run kubectl get all --all-namespaces -o yaml on your source cluster and grep for cloud provider annotations. These are your migration hotspots.
Resource Transformation Patterns
The most common transformation is Ingress to Route. Here’s a GKE Ingress with Google-managed certificates:
apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: api-gateway annotations: kubernetes.io/ingress.class: "gce" networking.gke.io/managed-certificates: "api-cert"spec: rules: - host: api.example.com http: paths: - path: / pathType: Prefix backend: service: name: api-service port: number: 8080The equivalent OpenShift Route with automatic TLS:
apiVersion: route.openshift.io/v1kind: Routemetadata: name: api-gatewayspec: host: api.example.com to: kind: Service name: api-service port: targetPort: 8080 tls: termination: edge insecureEdgeTerminationPolicy: RedirectRoutes provide integrated HAProxy-based routing without external load balancer provisioning. For multi-service routing, create multiple Routes rather than complex path-based rules.
Phased Migration with Parallel Clusters
Run both clusters in parallel during migration, routing traffic progressively. Deploy your migrated workloads to OpenShift while maintaining the source cluster:
- Deploy to OpenShift with production configuration but no traffic
- Validate functionality using OpenShift Routes with temporary DNS entries
- Mirror production traffic using your service mesh or application-level duplication
- Shift DNS incrementally—start with 10% of traffic via weighted DNS or split-horizon routing
- Monitor error rates and latency between clusters
- Complete cutover when metrics confirm parity
For databases and stateful workloads, use logical replication (PostgreSQL) or cross-cluster replication (Elasticsearch, Kafka) rather than migrating persistent volumes. Attempting PV migration across clouds creates unnecessary downtime and complexity.
💡 Pro Tip: OpenShift’s built-in image registry simplifies migrations. Push container images to the internal registry during migration to avoid Docker Hub rate limits and reduce cross-cloud egress costs when pulling from ECR or GCR.
Handling DeploymentConfigs
You’ll encounter DeploymentConfigs in OpenShift documentation, but don’t migrate to them. DeploymentConfigs are legacy; standard Kubernetes Deployments are the recommended pattern. OpenShift fully supports Deployments with integrated image streams for automatic redeployment when base images update.
The migration complexity isn’t in the Kubernetes API compatibility—it’s in the operational integrations you’ve built around your existing platform. Budget time for re-implementing monitoring dashboards, CI/CD pipelines, and infrastructure-as-code tooling against OpenShift’s API patterns.
When OpenShift Isn’t the Answer
OpenShift’s comprehensive feature set comes with tradeoffs that make it the wrong choice for specific scenarios. Understanding these boundaries prevents costly overengineering.
Resource Overhead at Scale
A minimal OpenShift cluster consumes approximately 16GB RAM and 8 vCPUs for control plane components before running any workloads. This includes the operator framework, integrated registry, monitoring stack, and service mesh components. By comparison, an EKS cluster runs with 2GB RAM for the control plane, which AWS manages entirely.
For organizations running dozens of small clusters—development environments, edge deployments, or isolated customer tenants—this overhead compounds quickly. A team operating 20 development clusters faces an additional infrastructure cost of roughly $3,000 monthly compared to managed EKS equivalents.
The Red Hat API Surface
OpenShift extends Kubernetes with custom resource definitions for Routes, BuildConfigs, DeploymentConfigs, and SecurityContextConstraints. While these abstractions solve real problems, they create dependencies on Red Hat-specific APIs that complicate migrations.
Teams using OpenShift Routes instead of standard Kubernetes Ingress resources find themselves rewriting application manifests when evaluating other platforms. The operator lifecycle manager, while powerful, introduces another layer of abstraction that doesn’t translate to vanilla Kubernetes environments.
Cost Thresholds for Smaller Teams
The break-even point for OpenShift’s operational efficiency occurs around 50-100 developers. Below this threshold, the platform’s learning curve and resource requirements outweigh the productivity gains from integrated tooling.
A team of 15 developers running microservices on EKS with external tools (Flux for GitOps, Falco for security, Prometheus for monitoring) achieves similar outcomes at lower total cost. OpenShift’s value proposition emerges when consolidating tools across larger organizations where standardization drives efficiency.
When Vanilla Kubernetes Wins
Three scenarios favor assembling your own platform from Kubernetes building blocks:
Ephemeral environments: CI/CD pipelines creating short-lived clusters benefit from lightweight distributions like k3s or EKS Anywhere rather than OpenShift’s full stack.
Highly specialized workloads: AI/ML platforms running Kubeflow or data processing pipelines with Spark operators rarely leverage OpenShift’s developer-focused features, making the overhead unjustifiable.
Pure cloud-native shops: Organizations standardized on AWS or GCP services (RDS, CloudSQL, managed Kafka) find more value in tight cloud provider integration than OpenShift’s abstraction layer.
The next consideration involves ongoing operational costs beyond initial platform selection.
Key Takeaways
- Evaluate OpenShift if you’re managing 3+ production clusters across clouds and spending significant engineering time building internal platforms
- Start with Azure Red Hat OpenShift (ARO) for managed experience, then expand to self-managed on AWS/GCP only if workload portability demands it
- Budget 20-30% more compute resources for OpenShift’s control plane and integrated services compared to vanilla Kubernetes
- Migrate one namespace at a time using parallel clusters and traffic shifting rather than big-bang cutover