Home / OCI

OCIHow-toIntermediate

Transformation: move OCI workloads from x86 to Ampere Arm (A1/A2) shapes

Plan a migration from x86 shapes to Ampere Arm shapes on OCI. Check software compatibility, build multi-arch images for OKE, mix node pools during rollout, benchmark fairly and keep x86 where it still makes sense.

Deepak Bhardwaj2 min read

Applies toOCI Compute VM.Standard.A1.Flex / A2.Flex, OKE node pools, Oracle Linux / Ubuntu aarch64, OCIR

Fit check

Workload Arm readiness
Java, Python, Node.js, Go, .NET 8 apps Usually straightforward; rebuild images
Containers from public images Check for linux/arm64 variants
Native binaries, vendor agents, commercial software Needs vendor arm64 builds
Windows Not available on Ampere — stay on x86
Oracle Database Check current platform certification before planning

1. Inventory and compatibility

  • List images and packages with native code (Python wheels with C extensions, Node native modules, JNI libraries).
  • Confirm monitoring/security agents (including the Oracle Cloud Agent plugins you use) support aarch64.
  • Pick the Arm image of your OS (Oracle Linux and Ubuntu publish aarch64 platform images).

2. Build multi-arch images

docker buildx create --use
docker buildx build --platform linux/amd64,linux/arm64 \
  -t fra.ocir.io/<ns>/orders:3.1.0 --push .
docker buildx imagetools inspect fra.ocir.io/<ns>/orders:3.1.0

Native arm64 build runners (an A1 instance as a CI runner) build much faster than QEMU emulation.

3. OKE: mixed node pools

oci ce node-pool create --cluster-id $CL --compartment-id $C --name np-arm \
  --kubernetes-version v1.30.1 --node-shape VM.Standard.A1.Flex \
  --node-shape-config '{"ocpus":4,"memoryInGBs":24}' \
  --node-image-id <aarch64-oke-image-ocid> --size 3 \
  --placement-configs '[{"availabilityDomain":"'$AD'","subnetId":"'$WORKER_SUBNET'"}]'

Kubernetes labels nodes with kubernetes.io/arch=arm64. During rollout, move one service at a time with a nodeSelector or node affinity:

spec:
  template:
    spec:
      nodeSelector:
        kubernetes.io/arch: arm64

Once all images are multi-arch, remove selectors and let the scheduler use both pools; then shrink the x86 pool.

4. VMs

For VM workloads, build a new instance from the aarch64 image (you can't change architecture in place), deploy the app with your configuration tooling, and switch the load balancer backend.

5. Benchmark fairly

  • Compare at equal cost, not equal OCPU count. An Ampere OCPU is one core; an x86 OCPU is one core with two hardware threads.
  • Measure p50/p99 latency and throughput at production-like load.
  • Use current runtimes (recent JDK, Python, Node) — older ones lack arm64 optimisations.

Tip

Ampere shapes let you choose OCPUs and memory independently. Re-size memory based on measured need instead of copying the x86 shape's ratio.

Checklist

  • Workloads sorted by Arm readiness
  • Agents and native deps confirmed for aarch64
  • Multi-arch images in CI on arm64 runners
  • OKE Arm node pool; services moved one by one
  • Benchmarks recorded; x86 capacity reduced