kubernetes
Quickstart
From zero to a running pod in three commands โ plus the kubectl call that proves it works.
You need:
- The
excCLI installed and authenticated. kubectlon your$PATH.- A registered SSH key (the cluster VMs use it).
- A reasonable vCPU quota (
exc quotato 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
LoadBalancerprovisioner that targets an Excloud Public IPv4.