This article details BMW Group's migration of its Connected Vehicle platform, Orbit, from x86 to Arm-based AWS Graviton processors. It covers the architectural and operational strategies for a phased, non-disruptive transition, including multi-architecture CI/CD, container image management, and Kubernetes node pool configuration with Karpenter, resulting in significant cost savings and performance improvements.
Read original on AWS Architecture BlogBMW Group undertook a significant modernization initiative to migrate its Connected Vehicle platform, Orbit, to AWS Graviton processors. This migration aimed to achieve better price-performance and environmental benefits, impacting a fleet of over 24.5 million vehicles. The strategy focused on a non-disruptive, phased rollout, allowing application teams to transition at their own pace.
A critical first step was adopting Karpenter to replace fixed Kubernetes Managed Node Groups with dynamic, policy-driven node pools. This provided the flexibility needed to provision appropriate instance types automatically, supporting both x86 and Graviton. Concurrently, the CI/CD platform, handling over 130,000 builds daily, was extended to support multi-architecture builds, requiring runners capable of targeting both x86 and Arm architectures and producing dual build pipelines.
To enable seamless workload migration, every container image needed to support both architectures. BMW used two main approaches for multi-architecture builds:
For platform-scale adoption, native builds on Graviton runners were preferred. Additionally, public base images were mirrored to a private Amazon ECR, leveraging Google's Crane to preserve multi-arch support while ensuring availability, immutability, and CVE compliance. This results in a single image tag serving both arm64 and amd64 nodes transparently.
The Amazon EKS cluster was configured to support mixed architectures with dedicated Graviton node pools. These pools use taints to prevent accidental scheduling; workloads must explicitly opt-in using node selectors and tolerations. This strategy ensures a controlled rollout and predictable behavior, allowing x86 workloads to continue uninterrupted while Arm-ready workloads are scheduled on Graviton.
nodeSelector: bmw.de/stateless-arm: supported
tolerations:
- key: "bmw.de/stateless-arm"
operator: "Equal"
value: "supported"
effect: "NoSchedule"Rollback and Resilience
A key design principle was minimizing rollback risk. Dual-arch images and dedicated NodePools mean applications can run on both CPU architectures. Kubernetes node affinity rules prefer Arm without strictly enforcing it, allowing workloads to gracefully fall back to x86 if issues arise, without requiring image rebuilds or pipeline changes. GitOps with ArgoCD further streamlines recovery by enabling straightforward reverts to previous Git versions.
The migration yielded substantial benefits, including approximately $600,000 in annualized infrastructure savings and significant performance improvements, such as a 57% decrease in CPU consumption for the NGINX-based ingress controller. This demonstrates the economic and performance advantages of moving to Arm-based compute in large-scale distributed systems.