OCI Ampere A1 Compute delivers the best price-performance on OCI for CPU-bound workloads. At 1 OCPU per physical core, A1 provides consistent performance across all cores. For web servers, API backends, container runtimes, and Java or Python services not bound by single-threaded speed, A1 typically costs 50 to 70 percent less than equivalent x86 instances. This post covers Terraform provisioning, A1 node pools in OKE, and multi-arch container build patterns.
Step 1: A1 Instance Provisioning
resource "oci_core_instance" "api_server_a1" {
compartment_id = var.compartment_id
availability_domain = data.oci_identity_availability_domains.ads.availability_domains[0].name
display_name = "api-server-a1-flex"
shape = "VM.Standard.A1.Flex"
shape_config {
ocpus = 4
memory_in_gbs = 24
}
source_details {
source_type = "image"
source_id = var.oracle_linux_a1_image_id
boot_volume_size_in_gbs = 100
}
create_vnic_details {
subnet_id = var.app_subnet_id
nsg_ids = [var.app_server_nsg_id]
assign_public_ip = false
hostname_label = "api-server-a1"
}
metadata = { ssh_authorized_keys = var.ssh_public_key }
defined_tags = { "Operations.Environment" = "production", "Operations.Application" = "api-backend", "Operations.ManagedBy" = "terraform" }
}
output "a1_private_ip" { value = oci_core_instance.api_server_a1.private_ip }
Step 2: A1 Node Pool in OKE
resource "oci_containerengine_node_pool" "a1_workers" {
cluster_id = var.oke_cluster_id
compartment_id = var.compartment_id
name = "a1-worker-pool"
kubernetes_version = "v1.31.1"
node_shape = "VM.Standard.A1.Flex"
node_shape_config { ocpus = 4; memory_in_gbs = 24 }
node_config_details {
size = 6
placement_configs {
availability_domain = data.oci_identity_availability_domains.ads.availability_domains[0].name
subnet_id = var.worker_subnet_id
}
}
node_source_details {
source_type = "IMAGE"
image_id = var.oke_a1_node_image_id
}
initial_node_labels {
key = "kubernetes.io/arch"
value = "arm64"
}
defined_tags = { "Operations.ManagedBy" = "terraform" }
}
Step 3: CPU Utilization Alarm
resource "oci_monitoring_alarm" "a1_cpu_high" {
compartment_id = var.compartment_id
display_name = "a1-api-server-cpu-high"
is_enabled = true
metric_compartment_id = var.compartment_id
namespace = "oci_computeagent"
query = "CpuUtilization[5m]{instanceId = 'A1_INSTANCE_OCID'}.mean() > 85"
severity = "WARNING"
pending_duration = "PT10M"
destinations = [var.ops_notification_topic_id]
body = "A1 API server CPU above 85% for 10 minutes. Consider adding more A1 instances to the instance pool or reviewing thread count configuration."
}
Operational Notes
Not all workloads benefit from A1 equally. CPU-bound web servers, API gateways, queue processors, and container runtimes perform well. Workloads compiled specifically for x86 SIMD instructions, and native binaries without ARM64 builds, will not run on A1 without recompilation. Always benchmark your specific workload before migrating a fleet from x86 to A1.
Build multi-architecture container images using Docker buildx with --platform linux/amd64,linux/arm64. The resulting manifest list lets OKE pull the correct architecture image for each node automatically. Mix x86 and A1 node pools in OKE using node selectors to direct workloads with ARM64 support to A1 nodes while keeping workloads without ARM64 support on x86 nodes.
Regards,
Osama
#OCI #OracleCloud #AmpereA1 #ARM #Terraform #IaC #TechBlog #Oracle #PlatformEngineering #CostOptimization #FinOps #CloudCompute #OracleCloudInfrastructure #OKE #Kubernetes #ARM64 #MultiArch #Docker #CloudNative #HighPerformance
Leave a Reply