|
| 1 | +--- |
| 2 | +title: "From Zero to kubectl in 5 Minutes — Managed Kubernetes on Your Own Metal" |
| 3 | +slug: from-zero-to-kubectl-managed-kubernetes-on-your-own-metal |
| 4 | +date: 2026-06-04 |
| 5 | +author: "Timur Tukaev" |
| 6 | +description: "Deploy a production-grade Kubernetes cluster on your own hardware in minutes. Cozystack uses Kamaji, Cluster API, and KubeVirt to give you fully managed Kubernetes with autoscaling, Cilium CNI, and built-in addons — no cloud bill required." |
| 7 | +images: |
| 8 | + - "001.png" |
| 9 | +article_types: |
| 10 | + - how-to |
| 11 | +topics: |
| 12 | + - kubernetes |
| 13 | + - platform |
| 14 | +--- |
| 15 | + |
| 16 | +Every platform team has faced this: a new project needs a Kubernetes cluster. With cloud providers, that means a new billing account, region selection, networking decisions, and a baseline cost of $70–300/month before a single pod runs. Self-hosting with kubeadm? Days of setup, certificates, etcd management, and upgrade anxiety. Rancher helps, but you're still managing the lifecycle yourself. |
| 17 | + |
| 18 | +What if creating a production-grade Kubernetes cluster was as simple as filling out a form? |
| 19 | + |
| 20 | +## Deploy a Managed Kubernetes Cluster |
| 21 | + |
| 22 | +Cozystack uses [Kamaji](https://kamaji.clastix.io/) for control planes (running as pods — no dedicated VMs for masters), [Cluster API](https://cluster-api.sigs.k8s.io/) for lifecycle management, and [KubeVirt](https://kubevirt.io/) for worker node VMs. You pick the version, the instance type, and how many nodes you want. |
| 23 | + |
| 24 | +### Via Dashboard |
| 25 | + |
| 26 | +1. Open the Cozystack dashboard at `https://dashboard.<your-domain>`. |
| 27 | +2. Navigate to the **Marketplace** and find **Kubernetes**. |
| 28 | + |
| 29 | +{{< figure src="001.png" alt="Cozystack dashboard Marketplace showing the Kubernetes application tile" width="720" >}} |
| 30 | + |
| 31 | +3. Click **Deploy** and configure: |
| 32 | + - **Name:** e.g., `dev-cluster` |
| 33 | + - **Version:** pick from v1.30 to v1.35 |
| 34 | + - **Node group:** set `minReplicas: 2`, `maxReplicas: 5` |
| 35 | + - **Instance type:** e.g., `u1.large` (2 vCPU, 8 Gi RAM) |
| 36 | + - **Addons:** check `ingress`, `cert-manager`, `monitoring` |
| 37 | + |
| 38 | +{{< figure src="002.png" alt="Kubernetes deployment form with version, node group, and addons configured" width="720" >}} |
| 39 | + |
| 40 | +4. Click **Deploy**. |
| 41 | + |
| 42 | +Worker nodes boot as VMs, join the cluster, and become Ready — typically within 3–5 minutes. |
| 43 | + |
| 44 | +{{< figure src="003.png" alt="Kubernetes cluster worker nodes reporting Ready status after deployment" width="720" >}} |
| 45 | + |
| 46 | +> **What's included:** Every cluster comes pre-configured with [Cilium CNI](https://cilium.io/) (eBPF-based networking), KubeVirt CSI driver (for persistent volumes), and Cluster Autoscaler (automatic node scaling based on demand). |
| 47 | +
|
| 48 | +### Via kubectl |
| 49 | + |
| 50 | +```yaml |
| 51 | +apiVersion: helm.toolkit.fluxcd.io/v2 |
| 52 | +kind: HelmRelease |
| 53 | +metadata: |
| 54 | + name: kubernetes-dev |
| 55 | + namespace: tenant-team1 |
| 56 | +spec: |
| 57 | + chart: |
| 58 | + spec: |
| 59 | + chart: kubernetes |
| 60 | + reconcileStrategy: Revision |
| 61 | + sourceRef: |
| 62 | + kind: HelmRepository |
| 63 | + name: cozystack-apps |
| 64 | + namespace: cozy-public |
| 65 | + interval: 0s |
| 66 | + values: |
| 67 | + host: dev.team1.example.org |
| 68 | + version: v1.33 |
| 69 | + nodeGroups: |
| 70 | + md0: |
| 71 | + minReplicas: 2 |
| 72 | + maxReplicas: 5 |
| 73 | + instanceType: u1.large |
| 74 | + ephemeralStorage: 20Gi |
| 75 | + controlPlane: |
| 76 | + replicas: 2 |
| 77 | + addons: |
| 78 | + ingressNginx: |
| 79 | + enabled: true |
| 80 | + certManager: |
| 81 | + enabled: true |
| 82 | + monitoringAgents: |
| 83 | + enabled: true |
| 84 | +``` |
| 85 | +
|
| 86 | +```bash |
| 87 | +kubectl apply -f kubernetes-dev.yaml |
| 88 | +``` |
| 89 | + |
| 90 | +### Get your kubeconfig |
| 91 | + |
| 92 | +In the dashboard, open the cluster application → **Secrets** tab → download `admin.conf`. |
| 93 | + |
| 94 | +{{< figure src="004.png" alt="Cluster application Secrets tab with admin.conf kubeconfig available for download" width="720" >}} |
| 95 | + |
| 96 | +Or via CLI: |
| 97 | + |
| 98 | +```bash |
| 99 | +kubectl get secret -n tenant-team1 kubernetes-dev-admin-kubeconfig \ |
| 100 | + -o jsonpath='{.data.admin\.conf}' | base64 -d > kubeconfig-dev.yaml |
| 101 | + |
| 102 | +export KUBECONFIG=kubeconfig-dev.yaml |
| 103 | +kubectl get nodes |
| 104 | +``` |
| 105 | + |
| 106 | +``` |
| 107 | +NAME STATUS ROLES AGE VERSION |
| 108 | +kubernetes-dev-md0-vn8dh-jjbm9 Ready ingress-nginx 4m v1.33.2 |
| 109 | +kubernetes-dev-md0-vn8dh-xhsvl Ready ingress-nginx 3m v1.33.2 |
| 110 | +``` |
| 111 | + |
| 112 | +Deploy your apps with standard `kubectl` or `helm` — no vendor-specific tooling needed. |
| 113 | + |
| 114 | +## Learn more |
| 115 | + |
| 116 | +- [Managed Kubernetes documentation](https://cozystack.io/docs/v1/kubernetes/) |
| 117 | +- [Deploy Applications guide](https://cozystack.io/docs/v1/getting-started/deploy-app/) |
| 118 | +- [Create a Tenant](https://cozystack.io/docs/v1/getting-started/create-tenant/) |
| 119 | + |
| 120 | +## Join the community |
| 121 | + |
| 122 | +- [GitHub](https://github.com/cozystack/cozystack) |
| 123 | +- Telegram [group](https://t.me/cozystack) |
| 124 | +- Slack [group](https://kubernetes.slack.com/archives/C06L3CPRVN1) (get invite at [https://slack.kubernetes.io](https://slack.kubernetes.io)) |
| 125 | +- [Community Meeting Calendar](https://calendar.google.com/calendar?cid=ZTQzZDIxZTVjOWI0NWE5NWYyOGM1ZDY0OWMyY2IxZTFmNDMzZTJlNjUzYjU2ZGJiZGE3NGNhMzA2ZjBkMGY2OEBncm91cC5jYWxlbmRhci5nb29nbGUuY29t) |
0 commit comments