network_mode: ipv4_nat adds a NAT router and gives the bastion a public IPv4 address instead (see Network design). You own the control plane and every server; Ankra provisions, upgrades and repairs them.
This is the self-managed lane. If you want the Ankra team to run the control plane for you, use Ankra Cloud Kubernetes instead; the comparison table sets the two side by side.
Before you start
Ankra Cloud Credential
An Ankra Cloud API token (
act_...) from a user allowed to create servers, networks and routers. The same credential serves both self-managed clusters and Ankra Cloud Kubernetes. See Ankra Cloud Credentials.SSH Key Credential
An SSH public key for server access. You can provide your own or let Ankra generate one. See SSH Key Credentials.
Create the cluster
Dashboard
1
Open the create dialog
Go to Clusters, click Create cluster and pick Ankra Cloud under Ankra Managed (kubeadm or k3s on Ankra Cloud servers).
2
Credentials & Zone
Pick the Ankra Cloud credential, or add one inline with Add Ankra Cloud credential. Choose the Runtime credential the in-cluster cloud controller and CSI driver use: the default reuses the provisioning credential, and a separate, dedicated credential limits what those components can reach. Pick an SSH key, then the zone. Zones, plans and templates load live from your Ankra Cloud account; a zone that runs no servers (a network-only location such as Stockholm) is refused.
3
Private Network & Bastion
Choose Create a dedicated network (Ankra creates and owns the network, and in
ipv4_nat mode its router; the wizard proposes 10.64.0.0/20) or Use an existing network in the zone. The wizard has no network-mode control, so a cluster it creates is ipv6_only; choose ipv4_nat through the API or the CLI. Pick the bastion plan, and optionally restrict Bastion allowed IPs to the CIDRs that may reach the bastion over SSH; on an ipv6_only bastion only the IPv6 entries apply, and empty allows any address only in ipv4_nat mode. Storage retention on teardown decides whether persistent volumes are kept (the default) or deleted when the cluster is deprovisioned.4
Compute
Set the control-plane count (the wizard offers 1, 3 or 5; the API accepts any count from 1 to 9) and plan, then one or more worker node groups, each with its own plan, count, labels and taints. The cost summary prices every server from the live plan catalog, plus public IPv4. The router, storage, load balancers and transfer are not in the total; see Cost.On kubeadm, a node group labelled
ankra.cloud/sandbox-runtime=gvisor gets the gVisor sandbox runtime installed on its nodes before they join. Ankra AI runs code on its own, to fix a build or regenerate a lockfile, only behind a sandbox, so give the cluster that will run CI or Ankra AI’s workspaces one such group; one node is enough to start. Keep ordinary workers beside it, because image builds cannot run under gVisor. On the CLI, ankra cluster ankracloud create --sandbox-nodes 1 adds that group, named sandbox and on the worker plan unless --sandbox-node-plan names another, beside a workers group; it refuses a k3s cluster and a cluster with no workers, and preflight takes the same flags.5
Kubernetes
Choose the server template (default
debian-13), the distribution and the Kubernetes version:- kubeadm (default) - vanilla Kubernetes with containerd and Cilium. Cilium is the only CNI kubeadm accepts on Ankra Cloud. etcd runs stacked on the control-plane nodes, or on 3 or 5 dedicated external etcd servers with their own plan.
- k3s - a single binary with batteries included, with a choice of CNI.
6
GitOps
Optionally connect a Git repository, and Ankra commits the cluster’s stacks to it. Two checkboxes are on by default:
- Include Networking Stack - Traefik, cert-manager and a Let’s Encrypt ClusterIssuer, with Traefik behind an Ankra Cloud load balancer. To serve Gateway and HTTPRoute resources from the same Traefik as well, see Gateway API.
- Include DNS Integration - external-dns, so Ingress hostnames publish their DNS records automatically.
ankracloud-cloud-provider stack is then not committed to Git.7
Preflight & Review
Name the cluster and click Run preflight. The checks run against your account: the credential authenticates, the zone offers compute, every plan and the template exist, an existing network lives in the chosen zone, kubeadm is paired with Cilium, and the zone can serve the default
ipv6_only network mode. Any failing check blocks creation and says why. Then click Create cluster; a progress view tracks the network, the router of an ipv4_nat cluster, the firewall, the bastion, the servers, the Kubernetes installation and the Ankra Agent.API
GET /api/v1/clusters/ankracloud/plans?credential_id=<id> (and /zones, /templates, /networks?zone=<zone> alongside). POST /api/v1/clusters/ankracloud/preflight takes the same body and answers the checks without creating anything.
A cluster has at most 100 workers across its node groups, and at most 64 nodes in all, control planes included, because of the pod range it is given (see Network ranges and their limits). A request that plans more, counting each node group’s autoscaling maximum, is refused before anything is provisioned.
Verify
- The cluster moves from Provisioning to Online in the clusters list once the Ankra Agent has connected.
-
Point
kubectlat it through Ankra (this needs a Cluster Access grant) and check the nodes:Every control plane and worker should beReady. See Accessing Clusters with kubectl.
Network design
A cluster is built in one of two network modes, chosen at create withnetwork_mode (--network-mode on the CLI). The default, ipv6_only, takes no public IPv4 address at all: the nodes reach IPv4 through the zone’s NAT64, and Ankra reaches the bastion through the Ankra Cloud port forward. ipv4_nat adds a NAT router for the nodes’ IPv4 egress and gives the bastion a public IPv4 address, a paid add-on under a per-account quota. Clusters created before 2026-11-03, when ipv6_only became the default, keep the ipv4_nat layout. The preflight says whether a zone can serve the mode you chose: ipv6_only needs public IPv6, NAT64 and port forwarding in the zone, ipv4_nat a public IPv4 address for the bastion and IPv4 for a NAT router, and each refusal names the other mode.
The default layout:
In ipv4_nat mode Ankra connects to the bastion’s public IPv4 address directly, and a router with NAT on the private network carries the nodes’ IPv4 egress instead of the NAT64.
Ankra Cloud servers are IPv6-first. In
ipv6_only mode the nodes have no IPv4 route to the internet of their own: IPv4 traffic from nodes and pods leaves through the server’s IPv4 translation (CLAT) and the zone’s NAT64, and kubelet hands pods the IPv4 resolvers 1.1.1.1 and 8.8.8.8, reached the same way, because the zone’s DNS64 resolvers are IPv6 and IPv4-only pods cannot reach them. In ipv4_nat mode the nodes do not use the CLAT; pod and node IPv4 traffic leaves through the router’s NAT instead. Kubernetes runs IPv4 single-stack on the private network in both modes.
Every server Ankra creates carries the labels platform.ankra.io/managed-by=ankra-platform, platform.ankra.io/cluster-id=<cluster-id> and platform.ankra.io/role, so you can find a cluster’s servers in the Ankra Cloud console.
Cost
Ankra Cloud bills the cluster’s resources to your Ankra Cloud account. A cluster is made of:- Servers - the bastion, the control planes and the workers, each at its plan price.
- Public IPv4 - none in
ipv6_onlymode. Inipv4_natmode one address, held by the bastion. The nodes hold none in either mode, and IPv6 is not billed. - The router with NAT -
ipv4_natmode only: one for each cluster, billed monthly while NAT is enabled. - Load balancers - the ones the cloud controller creates for
LoadBalancerServices, the networking stack’s Traefik included. - Persistent volumes - the storages the CSI driver provisions, by tier and size.
- Transfer - outbound traffic beyond what each server includes.
ipv6_only and takes no public IPv4 address, so that line does not apply to it. For the current price of every line, see Billing in the Ankra Cloud documentation.
To choose plans, CPU pools, root disk sizes and tiers, and to check the account quota before you build, see Ankra Cloud Servers, Disks and Quota.
Cloud controller and storage
After the Ankra Agent is installed, Ankra deploys theankracloud-cloud-provider stack into kube-system: the ankra-cloud-ccm and ankra-cloud-csi charts, sharing the runtime credential’s token through the Secret ankra-cloud (SOPS-encrypted when the stack is committed to Git). Every kubelet runs with --cloud-provider=external, and the controller links each node to its server as ankracloud://<zone>/<server-id>. The charts’ own behaviour, values and annotations are documented by Ankra Cloud: Kubernetes cloud controller manager and Kubernetes CSI driver.
LoadBalancer Services. ankra-cloud-ccm gives each Service of type LoadBalancer an Ankra Cloud load balancer on the cluster’s private network, with the nodes’ private addresses as members. The networking stack’s Traefik uses one, with externalTrafficPolicy: Local so the client address is preserved. Deleting the Service deletes its load balancer; Ankra itself never deletes one, so remove your LoadBalancer Services before you terminate the cluster, or a load balancer still bound then stays in your Ankra Cloud account.
Persistent volumes. ankra-cloud-csi provisions Ankra Cloud storages. It installs four StorageClasses:
Volumes are ReadWriteOnce and created in the zone of the node their pod is scheduled on.
Operate it
Day-2 tasks work as on every Ankra Managed provider, from the dashboard, the API or the CLI. Theankra cluster ankracloud commands below are the Ankra Cloud ones; provider-neutral commands such as ankra cluster upgrade find the provider from the cluster.
- Node groups - Nodes → Node groups
- Control plane with
ankra cluster ankracloud control-plane set-countandset-instance-type, restart a node withankra cluster ankracloud nodes restart, and the bastion withankra cluster ankracloud bastion status,diagnoseandresize - Upgrade Kubernetes with
ankra cluster upgrade;ankra cluster ankracloud k8s-versionshows the version it runs now - Stop and start with
ankra cluster ankracloud stopandstart- a stop powers the servers off and keeps them with their disks; a start powers them on again. When the control-plane servers are lost with their host,ankra cluster state-snapshots latestshows the newest snapshot a start may restore, andankra cluster ankracloud start <cluster> --restore-snapshot-id <id> --restore-over-kept-etcdrestores it on that start, the second flag confirming that the kept control planes and their etcd are gone; see Restore a named snapshot - Terminate a cluster with
ankra cluster ankracloud deprovision- deletes the servers, the bastion, the router of anipv4_natcluster, the firewall rules and the network Ankra created. A network you adopted withprivate_network_idis left in place, and persistent volumes follow the retention policy, deleted only once you accept it
Disabled k3s components
The
k3s_disabled_components list set at create can grow on a running k3s cluster. The body is the complete list and has to contain every entry already stored; an unknown or repeated entry is a 422 validation error pointing at the entry. applies answers: “The platform’s maintenance read lane compares each control plane’s k3s server config against this list within about five minutes and flags the ones missing an entry; the reconcile lane then patches the config and restarts k3s on one control plane at a time, in the cluster’s k8s update chain. Control planes already carrying every entry are not touched. The list only grows: re-enabling a bundled component is not supported yet, so a change that removes a stored entry is refused, and so is any change while a node update, version upgrade or node restart is still in progress on the cluster.” These refusals answer 409 with the detail shown: