Skip to main content
Ankra builds Ankra Managed Kubernetes clusters on Ankra Cloud servers: a private network, a bastion server, control plane and worker servers on the private network, kubeadm or k3s installed over SSH, and the Ankra Cloud cloud controller manager and CSI driver deployed as a stack. By default the cluster is IPv6-only, with no NAT router and no public IPv4 address; 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.
Closed beta. Ankra Cloud as a cluster provider is in closed beta. The workflow is stable but the surface may still change, and it is enabled per organisation on request - until it is, Ankra Cloud does not appear in the create-cluster dialog or among the credential providers, and its endpoints are not served. Contact support to have it turned on for your organisation.
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.
Skipping GitOps still deploys the cloud controller manager and CSI driver; the 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

Plans are account-wide; list them, and the zones, templates and networks the wizard offers, with 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

  1. The cluster moves from Provisioning to Online in the clusters list once the Ankra Agent has connected.
  2. Point kubectl at it through Ankra (this needs a Cluster Access grant) and check the nodes:
    Every control plane and worker should be Ready. See Accessing Clusters with kubectl.

Network design

A cluster is built in one of two network modes, chosen at create with network_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_only mode. In ipv4_nat mode one address, held by the bastion. The nodes hold none in either mode, and IPv6 is not billed.
  • The router with NAT - ipv4_nat mode only: one for each cluster, billed monthly while NAT is enabled.
  • Load balancers - the ones the cloud controller creates for LoadBalancer Services, 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.
The wizard’s estimate covers the servers and a public IPv4 address for the bastion only; a cluster the wizard creates is 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 the ankracloud-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. The ankra 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-count and set-instance-type, restart a node with ankra cluster ankracloud nodes restart, and the bastion with ankra cluster ankracloud bastion status, diagnose and resize
  • Upgrade Kubernetes with ankra cluster upgrade; ankra cluster ankracloud k8s-version shows the version it runs now
  • Stop and start with ankra cluster ankracloud stop and start - 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 latest shows the newest snapshot a start may restore, and ankra cluster ankracloud start <cluster> --restore-snapshot-id <id> --restore-over-kept-etcd restores 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 an ipv4_nat cluster, the firewall rules and the network Ankra created. A network you adopted with private_network_id is 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:

Troubleshooting