Skip to main content
Redhat Developers  Logo
  • Products

    Platforms

    • Red Hat Enterprise Linux
      Red Hat Enterprise Linux Icon
    • Red Hat AI
      Red Hat AI
    • Red Hat OpenShift
      Openshift icon
    • Red Hat Ansible Automation Platform
      Ansible icon
    • View All Red Hat Products

    Featured

    • Red Hat build of OpenJDK
    • Red Hat Developer Hub
    • Red Hat JBoss Enterprise Application Platform
    • Red Hat OpenShift Dev Spaces
    • Red Hat OpenShift Local
    • Red Hat Developer Sandbox

      Try Red Hat products and technologies without setup or configuration fees for 30 days with this shared Openshift and Kubernetes cluster.
    • Try at no cost
  • Technologies

    Featured

    • AI/ML
      AI/ML Icon
    • Linux
      Linux Icon
    • Kubernetes
      Cloud icon
    • Automation
      Automation Icon showing arrows moving in a circle around a gear
    • View All Technologies
    • Programming Languages & Frameworks

      • Java
      • Python
      • JavaScript
    • System Design & Architecture

      • Red Hat architecture and design patterns
      • Microservices
      • Event-Driven Architecture
      • Databases
    • Developer Productivity

      • Developer productivity
      • Developer Tools
      • GitOps
    • Automated Data Processing

      • AI/ML
      • Data Science
      • Apache Kafka on Kubernetes
    • Platform Engineering

      • DevOps
      • DevSecOps
      • Ansible automation for applications and services
    • Secure Development & Architectures

      • Security
      • Secure coding
  • Learn

    Featured

    • Kubernetes & Cloud Native
      Openshift icon
    • Linux
      Rhel icon
    • Automation
      Ansible cloud icon
    • AI/ML
      AI/ML Icon
    • View All Learning Resources

    E-Books

    • GitOps Cookbook
    • Podman in Action
    • Kubernetes Operators
    • The Path to GitOps
    • View All E-books

    Cheat Sheets

    • Linux Commands
    • Bash Commands
    • Git
    • systemd Commands
    • View All Cheat Sheets

    Documentation

    • Product Documentation
    • API Catalog
    • Legacy Documentation
  • Developer Sandbox

    Developer Sandbox

    • Access Red Hat’s products and technologies without setup or configuration, and start developing quicker than ever before with our new, no-cost sandbox environments.
    • Explore Developer Sandbox

    Featured Developer Sandbox activities

    • Get started with your Developer Sandbox
    • OpenShift virtualization and application modernization using the Developer Sandbox
    • Explore all Developer Sandbox activities

    Ready to start developing apps?

    • Try at no cost
  • Blog
  • Events
  • Videos

How to reduce costs with OpenShift on Graviton AWS

How OpenShift users on AWS can save money by migrating x86 applications to 64-bit Arm

July 30, 2025
Jeff Young
Related topics:
Automation and managementHybrid CloudKubernetes
Related products:
Red Hat OpenShift

Share:

    Cost optimization remains a paramount concern for enterprises deploying containerized workloads. While x86-based instances have long been the standard, a significant opportunity for cost savings has emerged for customers running Red Hat OpenShift on Amazon Web Services (AWS). By migrating applications to Arm-based instances powered by AWS Graviton processors, organizations can unlock substantial benefits including lower compute costs and better energy efficiency, paving the way for a more economical and sustainable cloud footprint.

    Why migrate from x86 to Arm?

    The following table provides a quick comparison of AWS instance types based on architecture and on-demand cost:

    Instance type

    Architecture

    vCPUs

    Memory (GiB)

    On-demand price us-east-2 per hour

    m6i.xlarge

    x86

    4

    16

    $0.192

    m6gx.large

    Arm (Graviton2)

    4

    16

    $0.145

    Using OpenShift’s pipelines-tutorial, we can mock a cluster cost with a small workload that builds and deploys for a week. Then, using the OpenShift cost operator on each cluster, we can see the cost differences between these instance types. 

    Figure 1 shows the x86 total cluster cost.

    An OpenShift cost management dashboard shows a cost breakdown for the "demo_x86" cluster. The total cost from April 1-8 is $164.82. The cost breakdown by projects includes worker unallocated ($55.29), platform unallocated ($31.33), and network unattributed ($24.05). CPU unused capacity is 2,768.83 core-hours, while memory unused capacity is 8,494.67 GiB-hours.
    Figure 1: Cost breakdown for the demo_x86 cluster: $164.82.

    Compare the x86 total cluster cost to the Arm total cluster cost, shown in Figure 2.

    An OpenShift cost management dashboard shows a cost breakdown for the "demo_arm64" cluster. The total cost from April 1-8 is $101.28. The cost breakdown by projects includes worker unallocated ($28.55), platform unallocated ($16.59), and network unattributed ($25.13). CPU unused capacity is 2,768.69 core-hours, while memory unused capacity is 8,559.65 GiB-hours.
    Figure 2: Cost breakdown for the demo_arm64 cluster: $101.28.

    Cluster node types

    Architecture

    Total instances 

    Cluster cost per week

    m6i.xlarge

    x86

    6

    $164.82

    m6gx.large

    Arm (Graviton2)

    6

    $101.28

    In this case, Arm saved approximately 39%.

    How to migrate an x86 workload to Arm64 on AWS

    We’ll use OpenShift’s pipelines-tutorial as an example. Here are the steps:

    1. Assess workload compatibility.
    2. Enable multi-arch support in OpenShift.
    3. Add 64-bit Arm MachineSets.
    4. Rebuild and verify container images.

    1. Assess workload compatibility

    Before migrating, determine whether your applications can run on 64-bit Arm architecture. Most modern applications built with portable runtimes (e.g., Java, Go, Python, Node.js) can run seamlessly on 64-bit Arm with little or no modifications. Check your container images and dependencies for 64-bit Arm compatibility. 

    In this case, the pipeline-tutorial can be built on both CPU architectures. Fortunately, our pipelines-tutorial doesn’t have these restrictions.

    2. Enable multi-arch support in OpenShift

    OpenShift supports multi-architecture workloads, allowing you to run both 64-bit x86 and 64-bit Arm based nodes in the same cluster. OpenShift’s documentation will be your guide for this process.

    3. Add 64-bit Arm MachineSets

    To migrate to Graviton-based EC2 instances, ensure that the OpenShift cluster is using the multi-arch release payload:

    $ oc adm release info -o jsonpath="{ .metadata.metadata}"
    {"release.openshift.io/architecture":"multi","url":"https://access.redhat.com/errata/xxx"}$

    Decide on a scheduling strategy: manual with taints and tolerations or via the Multiarch Tuning Operator. Because we have 1 workload (our build pipeline), we’ll go the taint and toleration routes. We’ve added this taint to our new Arm machine sets:

         taints:
          - effect: NoSchedule
            key: newarch
            value: arm64

    This prevents existing x86 workloads from being scheduled to the Arm nodes.

    Reimport the necessary ImageStreams with import-mode set to PreserveOriginal:

    oc import-image php -n openshift --all --confirm --import-mode='PreserveOriginal'
    oc import-image python -n openshift --all --confirm --import-mode='PreserveOriginal' 

    4. Rebuild and verify container images

    Note

    OpenShift only supports native architecture container builds. Cross-architecture container builds are not supported.

    To build 64-bit Arm compatible images, we’ve modified the openshift-pipelines tutorial to patch deployments with the Tekton Task’s PodTemplate information. This will allow us to pass a PodTemplate for building and deploying our newly built application on the target architecture. It also makes it easy to revert back to 64-bit x86 by re-running the pipeline without the template.

    Create a PodTemplate defining a toleration and a node affinity to make the builds deploy on Arm machines:

     tolerations:
        - key: "newarch"
          value: "arm64"
          operator: "Equal"
          effect: "NoSchedule"
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
              - matchExpressions:
                  - key: "kubernetes.io/arch"
                    operator: "In"
                    values:
                      - "arm64"
                  - key: "kubernetes.io/os"
                    operator: "In"
                    values:
                      - "linux"

    Next, we’ll update 02_update_deployment_task.yaml. This includes extract patching to include the PodTemplate’s node affinity and tolerations:

    apiVersion: tekton.dev/v1
    kind: Task
    metadata:
     name: update-deployment
    spec:
     params:
       - name: deployment
         description: The name of the deployment patch the image
         type: string
       - name: IMAGE
         description: Location of image to be patched with
         type: string
       - name: taskrun-name
         type: string
         description: Name of the current TaskRun (injected from context)
     steps:
       - name: patch
         image: image-registry.openshift-image-registry.svc:5000/openshift/cli:latest
         command: ["/bin/bash", "-c"]
         args:
           - |-
             oc patch deployment $(inputs.params.deployment) --patch='{"spec":{"template":{"spec":{
               "containers":[{
                 "name": "$(inputs.params.deployment)",
                 "image":"$(inputs.params.IMAGE)"
               }]
             }}}}'
    
             # Find my own TaskRun name
             MY_TASKRUN_NAME="$(params.taskrun-name)"
             echo "TaskRun name: $MY_TASKRUN_NAME"
    
             # Fetch the podTemplate
             PODTEMPLATE_JSON=$(kubectl get taskrun "$MY_TASKRUN_NAME" -o jsonpath='{.spec.podTemplate}')
    
             if [ -z "$PODTEMPLATE_JSON" ]; then
               echo "No podTemplate found in TaskRun...Remove tolerations and affinity."
               oc patch deployment "$(inputs.params.deployment)" \
                 --type merge \
                 -p "{\"spec\": {\"template\": {\"spec\": {\"tolerations\": null, \"affinity\": null}}}}"
             else
               echo "Found podTemplate:"
               echo "$PODTEMPLATE_JSON"
               oc patch deployment "$(inputs.params.deployment)" \
                 --type merge \
                 -p "{\"spec\": {\"template\": {\"spec\": $PODTEMPLATE_JSON }}}"
             fi
    
             # issue: https://issues.redhat.com/browse/SRVKP-2387
             # images are deployed with tag. on rebuild of the image tags are not updated, hence redeploy is not happening
             # as a workaround update a label in template, which triggers redeploy pods
             # target label: "spec.template.metadata.labels.patched_at"
             # NOTE: this workaround works only if the pod spec has imagePullPolicy: Always
             patched_at_timestamp=`date +%s`
             oc patch deployment $(inputs.params.deployment) --patch='{"spec":{"template":{"metadata":{
               "labels":{
                 "patched_at": '\"$patched_at_timestamp\"'
               }
             }}}}'

    We also need to update 04_pipeline.yaml to pass the taskrun-name to the update-deployment task:

    .
    .
    .
     - name: update-deployment
       taskRef:
         name: update-deployment
       params:
       - name: deployment
         value: $(params.deployment-name)
       - name: IMAGE
         value: $(params.IMAGE)
       - name: taskrun-name			//add these
         value: $(context.taskRun.name)     //lines

    Now we can redeploy the UI and API using the arm64.yaml PodTemplate. This will force all parts of the build pipeline and deployment to our tainted 64-bit Arm nodes.

    tkn pipeline start build-and-deploy \
        --prefix-name build-deploy-api-pipelinerun-arm64 \
        -w name=shared-workspace,volumeClaimTemplateFile=https://raw.githubusercontent.com/openshift/pipelines-tutorial/master/01_pipeline/03_persistent_volume_claim.yaml \
        -p deployment-name=pipelines-vote-api \
        -p git-url=https://github.com/openshift/pipelines-vote-api.git \
        -p IMAGE=image-registry.openshift-image-registry.svc:5000/pipelines-tutorial/pipelines-vote-api-arm64 
    --use-param-defaults \
    --pod-template arm64.yaml

     

    tkn pipeline start build-and-deploy \
        --prefix-name build-deploy-ui-pipelinerun-arm64 \
        -w name=shared-workspace,volumeClaimTemplateFile=https://raw.githubusercontent.com/openshift/pipelines-tutorial/master/01_pipeline/03_persistent_volume_claim.yaml \
        -p deployment-name=pipelines-vote-ui \
        -p git-url=https://github.com/openshift/pipelines-vote-ui.git \
        -p IMAGE=image-registry.openshift-image-registry.svc:5000/pipelines-tutorial/pipelines-vote-ui-arm64 \
        --use-param-defaults \
    --pod-template arm64.yaml

    Once the pods are up and running, you can safely remove the x86 worker nodes from the cluster, and remove the taints from the Arm worker nodes (if you choose to do so).

    You can also migrate the 64-bit x86 control plane to 64-bit Arm before or after you migrate your workloads. See the OpenShift documentation for more information.

    Success! Cost savings achieved with OpenShift on Graviton AWS

    It is possible for organizations to have substantial cost savings after migrating OpenShift workloads to 64-bit Arm instances on AWS. Workloads such as web services, microservices, and data processing pipelines often perform better at lower costs on 64-bit Arm without code changes.

    Migrating OpenShift x86 workloads to AWS Graviton (64-bit Arm) instances can significantly cut cloud spending. With OpenShift’s multi-arch capabilities, the transition is smoother than ever. By following these steps, you can start realizing savings benefits right away.

    Are you ready to make the switch? Start by evaluating your workloads and take advantage of AWS Graviton’s cost-efficient computing today!

    Related Posts

    • How to install single node OpenShift on AWS

    • Synchronize instance tags from Amazon EC2 and Microsoft Azure with Red Hat Insights

    • How to create an EC2 instance in AWS using Ansible automation

    • How to scale smarter with Ansible and amazon.aws 9.0.0

    • Extending OpenShift Virtualization connectivity options on hosted control planes in AWS

    • 3 steps to secure network segmentation with Ansible and AWS

    Recent Posts

    • What's New in OpenShift GitOps 1.18

    • Beyond a single cluster with OpenShift Service Mesh 3

    • Kubernetes MCP server: AI-powered cluster management

    • Unlocking the power of OpenShift Service Mesh 3

    • Run DialoGPT-small on OpenShift AI for internal model testing

    What’s up next?

    Learn how to set up and calculate costs with the Red Hat Insights cost management service on a supported cloud or an on-premise cluster.

    Get the cheat sheet
    Red Hat Developers logo LinkedIn YouTube Twitter Facebook

    Platforms

    • Red Hat AI
    • Red Hat Enterprise Linux
    • Red Hat OpenShift
    • Red Hat Ansible Automation Platform
    • See all products

    Build

    • Developer Sandbox
    • Developer Tools
    • Interactive Tutorials
    • API Catalog

    Quicklinks

    • Learning Resources
    • E-books
    • Cheat Sheets
    • Blog
    • Events
    • Newsletter

    Communicate

    • About us
    • Contact sales
    • Find a partner
    • Report a website issue
    • Site Status Dashboard
    • Report a security problem

    RED HAT DEVELOPER

    Build here. Go anywhere.

    We serve the builders. The problem solvers who create careers with code.

    Join us if you’re a developer, software engineer, web designer, front-end designer, UX designer, computer scientist, architect, tester, product manager, project manager or team lead.

    Sign me up

    Red Hat legal and privacy links

    • About Red Hat
    • Jobs
    • Events
    • Locations
    • Contact Red Hat
    • Red Hat Blog
    • Inclusion at Red Hat
    • Cool Stuff Store
    • Red Hat Summit
    © 2025 Red Hat

    Red Hat legal and privacy links

    • Privacy statement
    • Terms of use
    • All policies and guidelines
    • Digital accessibility

    Report a website issue