Skip to main content
Reference material for AWS clusters - self-managed kubeadm or k3s clusters on EC2. Amazon EKS is covered by the managed Kubernetes reference.

Cluster Configuration Options

POST /api/v1/clusters/aws answers {"cluster_id", "name", "kind": "aws", "state": "creating", "operation_id"}; track the operation to see provisioning progress.

Node groups

Each entry of node_groups:

Egress modes

Nodes never receive a public IP, so every private subnet must route 0.0.0.0/0 somewhere. Ankra never mixes modes on one cluster. Omitted, it resolves to nat_gateway for a created VPC. For an adopted VPC preflight resolves it: subnets with egress select existing; empty subnets without it select bastion_nat; subnets without egress that hold foreign instances are refused with a message naming them.

What Ankra creates

Everything Ankra creates carries three tags, and the credential’s write permissions are conditioned on them: Teardown deletes everything in this table that carries the cluster’s tags, the created network included (NAT gateways and their Elastic IPs, route tables, subnets, internet gateway, VPC), in reverse order. A stop keeps the network and its NAT gateways, which keep billing. In an adopted VPC, never created, modified or deleted: your VPC, subnets, internet gateway, NAT gateways, DHCP options set, and any route table Ankra did not create. In bastion_nat mode the node subnets’ association is moved to the Ankra route table and moved back at teardown; the route tables themselves are untouched.

Network layout

Cloud integration

  • Cloud controller manager. Deployed as a vendored manifest with an exact image tag, matched to the cluster’s Kubernetes minor and moved with it on upgrade. Nodes register with cloud-provider=external, a provider ID of aws:///<availability-zone>/<instance-id>, and their EC2 private DNS name as the node name. KubernetesClusterID is the Ankra cluster ID, matching the kubernetes.io/cluster/<id>=owned tag on every instance.
  • Load balancers. A Service of type LoadBalancer gets an AWS load balancer from the cloud controller. The networking stack’s Traefik asks for a Network Load Balancer (service.beta.kubernetes.io/aws-load-balancer-type: nlb), and Ankra sets the managed tag on it so the teardown sweep can find it.
  • Storage. The EBS CSI driver is installed from its upstream chart at a pinned version, after the cloud controller (it needs the provider ID and topology labels the controller sets). The default StorageClass provisions encrypted gp3 volumes.
  • No keys in the cluster. The cloud controller and the CSI driver use the instance profile of the node they run on; the control-plane and worker profiles are distinct, following the upstream policy split, and the platform credential is never copied into the cluster.

Preflight checks

Preflight (ankra cluster aws preflight, POST /api/v1/clusters/aws/preflight) runs every check the create runs. For a created network: whether network_ip_range holds a private /20 and a public /24 per zone, whether every zone exists and is available, the three-control-plane rule for more than one zone, and the VPC (L-F678F1CE), NAT gateway (L-FE5A380F) and Elastic IP quotas. For an adopted VPC: whether the VPC and subnets exist in the region, which zones the node subnets cover, and the resolved egress mode (and why bastion_nat is refused, if it is). For both: the AMI resolved for the Ubuntu series and architecture, the vCPU quota for the chosen instance families, the security-groups-per-interface quota, and bastion_allowed_ips. Each item is ok, warning or error.

IMDS guard

The hop limit of 3 on control planes is compensated by the IMDS guard: a cluster-wide network policy in the AWS cloud-provider stack that denies pod egress to 169.254.169.254 for every pod except the EBS CSI controller. It is rendered for Cilium and Calico. Flannel has no policy engine, so on a flannel cluster the guard is not installed, the create result reports imds_guard: unavailable, and a pod scheduled onto a control-plane node can reach the control-plane instance role - prefer Cilium (the default) or keep the control planes tainted.

Catalogs

Every catalog loads live from your credential - ankra cluster aws regions, vpcs, subnets, availability-zones, instance-types, images and pricing, or the endpoints in the catalog API. The tables below are orientation, not the offer.

Regions

Any region your credential can DescribeRegions is offered; opt-in regions appear once enabled in your account.

Instance types

Only amd64 types are offered. Prices are per region and per hour; ankra cluster aws pricing and the wizard show the live figure.
Burstable t3 types spend CPU credits under sustained load; use m6i/c6i/r6i for a control plane or workers that run flat out. ankra cluster aws instance-types lists what the region offers, with vCPUs, memory, architecture and network performance.

Images

The AMI ID is resolved from these public SSM parameters in the target region at create time, so every cluster boots the current stable image of its series. The images catalog (ankra cluster aws images, GET /api/v1/clusters/aws/images) answers ubuntu_series, architectures and default_series, and lists only the series whose AMI resolves in that region.

Limits


Catalog API

Every catalog takes credential_id and region as query parameters (subnets also takes vpc_id), and every answer is three-state: a value Ankra could not read says so rather than reading as empty or zero.

Cluster API

Node Group API Reference

Control Plane API

Node Actions API

See Restart a node and Bastion for usage, and AWS specifics for how AWS applies them.

Credential API

The bearer-token twins of the AWS credential onboarding, for scripts and the CLI. Connecting a credential from the dashboard is documented on AWS Credentials. Creating a cluster needs a keys credential, or a role credential whose scope is provisioning (the AnkraProvisioning role, which covers EKS and self-managed clusters) or self_managed (the EC2-only AnkraSelfManagedProvisioning role); a cost-scoped role is refused. The CLI wraps the three: ankra credentials aws onboarding [--scope cost|provisioning|self_managed] prints the external ID, trust principal, launch-stack URL and the follow-up command; ankra credentials aws create-role --name <name> --role-arn <arn> --external-id <id> [--region <region>] [--scope <scope>] stores the role; ankra credentials aws create-keys --name <name> --access-key-id <id> [--region <region>] stores access keys, asking for the secret on a masked prompt (never a flag); ankra credentials aws list shows what is connected.