A production-ready Kubernetes cluster setup using Vagrant, Parallels Desktop, CRI-O runtime, and Calico networking. Includes ArgoCD and Helm pre-installed.
Install Xcode Command Line Tools (provides make, git, and other essentials):
xcode-select --installThen install the following:
Vagrant - Version 2.3.0 or higher
- Host Machine: 16GB RAM minimum (recommended: 32GB)
- Disk Space: 50GB free space
- CPU: 4+ cores recommended
- OS: macOS
vagrant plugin install vagrant-parallelsgit clone https://github.com/mialeevs/kube_vagrant.git
cd kube_vagrantEdit settings.yaml to customize:
- Number of worker nodes (default: 1)
- Memory and CPU allocation
- Network settings
- Kubernetes version
nodes:
control:
cpu: 2
memory: 6144
workers:
count: 1 # Change this to add more workers
cpu: 2
memory: 6144make upThis will:
- Validate
settings.yamlconfiguration - Create all VMs sequentially without provisioning
- Provision the control plane first (Kubernetes init, Calico, ArgoCD, Helm)
- Provision each worker node sequentially (join cluster, install node exporter)
Initial setup takes 10-15 minutes depending on your internet speed.
make helpmake ssh-control
kubectl get nodes
kubectl get pods -AExport kubeconfig to your host:
make kubeconfig
export KUBECONFIG=~/.kube/config-vagrant
kubectl get nodes- Kubernetes: v1.34
- Container Runtime: CRI-O v1.35
- CNI: Calico v3.28.2
- ArgoCD: v2.13.2 (GitOps)
- Helm: v3 (Package Manager)
ArgoCD is pre-installed and exposed via NodePort on the control plane.
make argocd-uiThis opens an SSH tunnel so you can access ArgoCD at:
https://localhost:8443
https://192.168.1.100:30904
Press Ctrl+C to stop the tunnel.
make argocd-password- Username:
admin - Password: (from command above)
make status
make pods
make nodesmake validatemake reloadmake downmake destroymake cleanmake ssh-control
make ssh-workerDefault network settings:
- Control Plane IP:
192.168.1.100 - Worker IPs:
192.168.1.11,192.168.1.12, etc. - Pod Network:
10.244.0.0/16 - Service Network:
10.96.0.0/12
Modify these in settings.yaml if they conflict with your network.
- Check Vagrant status:
make status- View provisioning logs:
make logs-control- Check worker logs:
make logs-worker- Verify join script exists:
cat configs/join.sh- Manually join a worker:
make ssh-worker
sudo bash /vagrant/configs/join.sh- Check network connectivity:
make ssh-worker
ping -c 3 192.168.1.100- Check pod status:
make ssh-control
kubectl describe pod <pod-name> -n <namespace>- Check CRI-O status:
make ssh-control
sudo systemctl status crio- Verify Calico is running:
make ssh-control
kubectl get pods -n kube-system -l k8s-app=calico-nodeIf pods can't resolve DNS:
make ssh-control
kubectl get pods -n kube-system -l k8s-app=kube-dns
kubectl logs -n kube-system -l k8s-app=kube-dnsIf nodes are running out of resources:
- Increase memory in
settings.yaml - Reload the cluster:
make reloadEdit settings.yaml:
software:
kubernetes: v1.34 # Change to desired version
crio: v1.35 # Should match or be compatible with Kubernetes versionEdit settings.yaml:
nodes:
workers:
count: 3 # Increase number of workersThen run:
make upEdit settings.yaml:
nodes:
control:
cpu: 4
memory: 8192
workers:
cpu: 4
memory: 8192The following aliases are pre-configured on the control plane node:
k=kubectlc=clear
.
├── Makefile # Command interface (run make help)
├── Vagrantfile # Main Vagrant configuration
├── settings.yaml # Cluster configuration
├── scripts/
│ ├── common.sh # Common setup for all nodes
│ ├── control.sh # Control plane specific setup
│ ├── node.sh # Worker node specific setup
│ └── validate-settings.sh # Pre-flight settings validation
└── configs/
└── join.sh # Auto-generated cluster join command
Feel free to submit issues and enhancement requests!
See LICENSE file for details.