Skip to main content
Redhat Developers  Logo
  • AI

    Get started with AI

    • Red Hat AI
      Accelerate the development and deployment of enterprise AI solutions.
    • AI learning hub
      Explore learning materials and tools, organized by task.
    • AI interactive demos
      Click through scenarios with Red Hat AI, including training LLMs and more.
    • AI/ML learning paths
      Expand your OpenShift AI knowledge using these learning resources.
    • AI quickstarts
      Focused AI use cases designed for fast deployment on Red Hat AI platforms.
    • No-cost AI training
      Foundational Red Hat AI training.

    Featured resources

    • OpenShift AI learning
    • Open source AI for developers
    • AI product application development
    • Open source-powered AI/ML for hybrid cloud
    • AI and Node.js cheat sheet

    Red Hat AI Factory with NVIDIA

    • Red Hat AI Factory with NVIDIA is a co-engineered, enterprise-grade AI solution for building, deploying, and managing AI at scale across hybrid cloud environments.
    • Explore the solution
  • Learn

    Self-guided

    • Documentation
      Find answers, get step-by-step guidance, and learn how to use Red Hat products.
    • Learning paths
      Explore curated walkthroughs for common development tasks.
    • Guided learning
      Receive custom learning paths powered by our AI assistant.
    • See all learning

    Hands-on

    • Developer Sandbox
      Spin up Red Hat's products and technologies without setup or configuration.
    • Interactive labs
      Learn by doing in these hands-on, browser-based experiences.
    • Interactive demos
      Click through product features in these guided tours.

    Browse by topic

    • AI/ML
    • Automation
    • Java
    • Kubernetes
    • Linux
    • See all topics

    Training & certifications

    • Courses and exams
    • Certifications
    • Skills assessments
    • Red Hat Academy
    • Learning subscription
    • Explore training
  • Build

    Get started

    • Red Hat build of Podman Desktop
      A downloadable, local development hub to experiment with our products and builds.
    • Developer Sandbox
      Spin up Red Hat's products and technologies without setup or configuration.

    Download products

    • Access product downloads to start building and testing right away.
    • Red Hat Enterprise Linux
    • Red Hat AI
    • Red Hat OpenShift
    • Red Hat Ansible Automation Platform
    • See all products

    Featured

    • Red Hat build of OpenJDK
    • Red Hat JBoss Enterprise Application Platform
    • Red Hat OpenShift Dev Spaces
    • Red Hat Developer Toolset

    References

    • E-books
    • Documentation
    • Cheat sheets
    • Architecture center
  • Community

    Get involved

    • Events
    • Live AI events
    • Red Hat Summit
    • Red Hat Accelerators
    • Community discussions

    Follow along

    • Articles & blogs
    • Developer newsletter
    • Videos
    • Github

    Get help

    • Customer service
    • Customer support
    • Regional contacts
    • Find a partner

    Join the Red Hat Developer program

    • Download Red Hat products and project builds, access support documentation, learning content, and more.
    • Explore the benefits

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

    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 Lightspeed

    • 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

    • MCP servers vs. skills: Choosing the right context for your AI

    • How to route external and local LLMs with Models-as-a-Service

    • Protect data offloaded to GPU-accelerated environments with OpenShift sandboxed containers

    • Case study: Measuring energy efficiency on the x64 platform

    • How to prevent AI inference stack silent failures

    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
    © 2026 Red Hat

    Red Hat legal and privacy links

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

    Chat Support

    Please log in with your Red Hat account to access chat support.