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