kubernetes

Quickstart

From zero to a running pod in three commands โ€” plus the kubectl call that proves it works.

Last updated ยท 20 July 2026


You need:

  • The exc CLI installed and authenticated.
  • kubectl on your $PATH.
  • A registered SSH key (the cluster VMs use it).
  • A reasonable vCPU quota (exc quota to check).

1. Create the cluster

exc k8s cluster create \
  --control_plane_image_id 1 \
  --control_plane_instance_type m1a.large \
  --subnet_id 1 \
  --ssh_pubkey my-key \
  --root_volume_size_gib 40

This provisions the control-plane VM (visible in exc compute list) and returns the cluster ID. Use the kubeconfig command in the next step to save an admin kubeconfig locally.

Capture the cluster ID for later:

CLUSTER_ID=<id-from-create>

2. Use the kubeconfig

Fetch the clusterโ€™s admin kubeconfig to a separate file, then use it in this shell:

exc k8s cluster kubeconfig get --cluster_id $CLUSTER_ID -o ~/.kube/excloud-dev.yaml
export KUBECONFIG=~/.kube/excloud-dev.yaml
kubectl get nodes

The downloaded kubeconfig selects the cluster name as its current context and contains an admin client certificate. Treat the file like a credential. Its system:masters identity has unrestricted cluster access.

If you already keep several clusters in ~/.kube/config, use this instead of the separate-file flow above. It fetches the same kubeconfig, merges it into the default file, and saves a backup first: ~/.kube/config.bak, then ~/.kube/config.bak1, bak2, and so on when earlier backups exist.

exc k8s cluster kubeconfig merge --cluster_id $CLUSTER_ID
kubectl config get-contexts

For quicker context and namespace switching, install kubectx. On macOS with Homebrew, it installs both kubectx and kubens:

brew install kubectx

Then select the Excloud context shown by kubectl config get-contexts, and switch namespaces without repeating --context or --namespace:

kubectx <cluster-name>
kubens <namespace>

At this point the only โ€œnodeโ€ is the control plane and itโ€™s tainted away from regular pods. You need workers.

3. Add a worker

exc k8s cluster worker create \
  --cluster_id $CLUSTER_ID \
  --worker_name worker-1 \
  --worker_image_id 1 \
  --worker_instance_type m1a.xlarge \
  --subnet_id 1 \
  --ssh_pubkey my-key

The worker is a regular VM that auto-joins the cluster. Add as many as you want; each becomes a Node that can run pods.

Verify:

kubectl get nodes
NAME                STATUS   ROLES           AGE     VERSION
cluster-7-cp-1      Ready    control-plane   3m12s   v1.30.2
worker-1            Ready    <none>          45s     v1.30.2

4. Run a pod

kubectl run hello --image=nginx:alpine --port=80
kubectl expose pod hello --port 80
kubectl port-forward svc/hello 8080:80

In another terminal:

curl localhost:8080

5. Clean up

exc k8s cluster worker list   --cluster_id $CLUSTER_ID
exc k8s cluster worker delete --cluster_id $CLUSTER_ID --worker_id <id>
exc k8s cluster delete        --cluster_id $CLUSTER_ID

Cluster deletion terminates the control-plane VM. Delete any remaining workers first.

Next

  • Workload Identity โ€” let your pods authenticate to other Excloud (or external) services without baked-in secrets.
  • Install an ingress controller (ingress-nginx, traefik) and a LoadBalancer provisioner that targets an Excloud Public IPv4.