Skip to content

What DKS is

DKS (Door Kubernetes Service) gives your organization a managed Kubernetes cluster for each create request. You choose the zone, Kubernetes version, worker size, and how the API is reached. Door runs the control plane. You run workloads with kubectl once you have a kubeconfig.

This page introduces the objects you will see, the three ways to manage clusters, the lifecycle phases, and the split between what you manage and what Door manages.

Who can do this: member can list and read clusters. super_admin can create, update, scale, and delete. See Authentication and organizations.

Concepts

Concept Meaning
Organization The Door tenant that owns clusters. Every API call is scoped to one organization. Example: acme.
Zone Where the cluster is provisioned. Today the catalog zone is abidjan.
Cluster One managed Kubernetes cluster. Identified by a UUID after create. You choose the DNS name (example: payments-prod).
Node pool A homogeneous group of worker nodes with one machine tier, a desired count, and optional autoscaling. A cluster always has at least one pool.
Node One worker in a pool. The name matches what kubectl get nodes shows.
Machine tier The public size id you send as node_pools[].size (for example dks.c5.xlarge). The catalog lists vCPU, RAM, and disk for each id.
Kubernetes version The version Door installs, chosen from the catalog (for example v1.32.4). You pick it at create. This API does not change the version later.
Exposure mode How you reach the Kubernetes API. private: only from your network or VPN. public: an HTTPS hostname under clusters.dks.door.africa.
Network mode How application Elastic IPs are routed. intranet (default): private / VPN-reachable addresses. internet: Internet-routed addresses. Immutable after create. Distinct from exposure (the API hostname).
Elastic IP A named address you allocate on a Provisioned cluster for applications. Private or public, depending on the cluster's network mode and the zone.
Firewall rule An ingress rule you open on worker nodes (protocol, port range, source CIDRs). Independent of Elastic IPs.

The control plane is not a concept you configure. Public create has no control-plane field. Extra fields such as a control-plane profile are rejected with 422.

A cluster also reports hub registration (whether the cluster is registered with the Door hub: pending, registered, or failed) and a default environment (pending, ready, or failed). Those are status fields, not create options.

Organization (acme)
  └── Zone (abidjan)
        └── Cluster (payments-prod)
              ├── Node pools → nodes
              ├── Elastic IPs
              └── Firewall rules
        Exposure: public | private          (Kubernetes API)
        Network mode: intranet | internet   (application dataplane; set at create)

Examples in this set: organization acme, zone abidjan, cluster payments-prod, id 3f9c1a2e-7b4d-4c58-9e21-5d6f8a0b1c2d, pool workers, machine tier dks.c5.xlarge, Kubernetes v1.32.4. Auth: Authorization: Bearer $DOOR_TOKEN.

Three management channels, plus kubectl

You can do the same cluster operations through:

  1. Door console — https://door.cloud/dks/clusters. Create wizard at /dks/clusters/new. After create, /dks/clusters/<id>/provisioning follows setup. Cluster detail tabs: Overview, Nodes, Networking, Access & kubeconfig, Settings.
  2. REST API — https://dks-api.apps.door.cloud. Customer routes are /v1/public/clusters... and /v1/catalog only. Every route, header, status code, and schema is in the API reference.
  3. Maya — the Door AI assistant in the console. Ask in natural language. Maya pauses for your approval before it creates, scales, or deletes. After you approve, a progress card follows the same progress block as the API.

After you download a kubeconfig, kubectl (and any Kubernetes client) talks to your cluster, not to the DKS API. RBAC inside the cluster is yours. See Kubeconfig and kubectl.

Pick the channel that fits the task. The console is fastest for a first cluster. The API is for automation (Idempotency-Key, long-poll /state). Maya is for conversational create/scale/delete with an approval step. Read-only Maya questions (list, catalog, status) do not need approval.

Cluster lifecycle

Create walks through five public phases, then you operate the cluster at Provisioned. Teardown is Deleting then Deleted. Setup can fail at any time before Provisioned.

flowchart LR
  Requested --> Provisioning
  Provisioning --> ControlPlaneReady
  ControlPlaneReady --> NodesReady
  NodesReady --> Provisioned
  Requested -.-> Failed
  Provisioning -.-> Failed
  ControlPlaneReady -.-> Failed
  NodesReady -.-> Failed
  Provisioned --> Deleting
  Failed --> Deleting
  Deleting --> Deleted
Requested → Provisioning → ControlPlaneReady → NodesReady → Provisioned
                ↘              ↘                   ↘              ↘ Failed
Provisioned or Failed → Deleting → Deleted → (GET returns 404)
Phase What it means What you can do
Requested Door accepted the create (201). The request is queued. Progress: Request received. Read the cluster and long-poll GET …/state. Do not expect kubeconfig or node-pool changes.
Provisioning Door is validating settings and creating infrastructure. Progress title / message come from the API — render them as-is (Validating configuration then Creating infrastructure). Same as Requested. Wait.
ControlPlaneReady The Kubernetes API is online. Worker nodes are still joining. Progress: Control plane ready — Your Kubernetes API is online. You can download your kubeconfig while worker nodes finish joining. Download kubeconfig (GET …/kubeconfig). If that call returns 409, wait until Provisioned (the download is accepted in ControlPlaneReady or Provisioned only). Node inventory and pool changes return 409.
NodesReady Workers have joined. Progress: Worker nodes ready — Worker nodes have joined. Finishing health checks and core services. Keep waiting for Provisioned. Node-pool, Elastic IP, firewall, and node-list calls still require Provisioned (409 otherwise).
Provisioned Terminal success. Progress: Cluster ready — Your cluster is ready. All core components are healthy. Full management: kubeconfig, list/add/scale/remove pools, list/delete nodes, Elastic IPs, firewall rules, exposure, tags.
Failed Setup did not finish. failure_message is customer copy (never raw platform text). Read the message. Delete and recreate, or contact your Door account team with the cluster id.
Deleting Delete accepted (202). Resources are being removed. Wait. Default list hides this row; pass include_deleted=true to see it.
Deleted Cluster removed. The row then disappears. GET eventually returns 404. Treat 404 after delete as success.

Gating (409)

These public writes and reads check phase=Provisioned and return 409 otherwise:

  • Add / scale / remove a node pool
  • Allocate / release an Elastic IP
  • Create / delete a firewall rule
  • List nodes (GET …/nodes and GET …/node-pools/{pool}/nodes) — detail cluster not ready yet
  • Delete a single node

Kubeconfig is the exception: it is allowed at ControlPlaneReady or Provisioned. Cluster delete is allowed in any phase, including Failed and still-provisioning.

Scale and similar work do not change phase. While workers are added, phase stays Provisioned and GET …/state lists the activity under operations[].

Follow progress with GET /v1/public/clusters/{id} or long-poll GET /v1/public/clusters/{id}/state?since=<state_version>&timeout_seconds=25 (max 60; header X-State-Version). The console Provisioning page and Maya's progress card use the same progress block (title, message, percent, step). 202 on a mutation means accepted — poll /state or re-GET the cluster; do not assume the workers exist yet. Create itself returns 201 and then the same progress path.

Failed setup does not block the name forever after you delete. After Deleted / 404, you may create payments-prod again with a new Idempotency-Key.

What you manage vs what Door manages

You manage Door manages
Cluster name, description, and tags The Kubernetes control plane (not a field on create; not user-configurable)
Node pools: machine tier, count, autoscaling, pool labels/tags Worker disk size for each tier (root_volume_size_gib follows the catalog disk)
Exposure (private / public) and re-downloading kubeconfig after a change Core cluster services that make the API and workers healthy
Elastic IPs and firewall rules on a Provisioned cluster Zone catalog: versions, machine tiers, name/pool limits
Applications, Services, Ingress, and RBAC inside the cluster Platform capacity and billing gates (a create can return 402 if prepaid credit is insufficient — contact your Door account team for commercial terms)
kubectl access credentials (treat the kubeconfig as a secret) Issuing the kubeconfig file for your cluster

You never send provider size names, image names, or control-plane knobs. Unknown machine tiers return 400 listing only public tier ids. There is no public route to change kubernetes_version after create.

Exposure vs Elastic IP vs firewall:

  • Exposure is the Kubernetes API hostname (kubectl).
  • Elastic IP is an address for your applications (a Service or Ingress you attach later).
  • Firewall rule opens ports on workers regardless of whether you allocated an Elastic IP.

Deleting the cluster removes pools, Elastic IPs, and firewall rules with it.

Pricing, pager, and SLA numbers are not published here. Contact your Door account team. Catalog pricing may be present for a zone; when it is null, ask that team.

Public routes (map)

You want to… Call
See what you can create GET /v1/catalog?zone=abidjan
Create / list / get / delete a cluster POST / GET / DELETE /v1/public/clusters
Follow setup GET /v1/public/clusters/{id}/state
Change tags or description PATCH /v1/public/clusters/{id}
Change API public/private PATCH /v1/public/clusters/{id}/exposure
Download kubeconfig GET /v1/public/clusters/{id}/kubeconfig
Manage workers /node-pools, /nodes
Application addresses and ports /elastic-ips, /firewall-rules

Base URL: https://dks-api.apps.door.cloud. Auth: Authorization: Bearer $DOOR_TOKEN.

Next steps

The guide index and glossary are on Start here: Door Kubernetes Service.