A fully local Kubernetes platform engineering demo running entirely in Docker. No cloud account needed. No cost. Runs on your laptop.
- Multiple Kubernetes clusters running locally using vind (vCluster in Docker)
- Sveltos managing progressive rollouts across clusters using ClusterPromotion
- ArgoCD for GitOps sync. Installed as platform infrastructure, not managed by Sveltos
- Full GitOps loop: push to Git → ArgoCD syncs → Sveltos deploys progressively
- Docker Desktop
- vCluster CLI v0.34.0+
- kubectl
- helm
- sveltosctl v1.10.0+
bootstrap/
├── install-argocd.sh # Run once to install ArgoCD
└── argocd-app-sveltos.yaml # Run once to connect ArgoCD to this repo
sveltos/
└── progressive/
└── clusterpromotion-podinfo.yaml # Progressive rollout definition
vcluster upgrade --version v0.34.0
vcluster use driver docker
vcluster platform startsudo vcluster create mgmt
sudo vcluster create dev
sudo vcluster create stagingNote:
sudois required on Mac for LoadBalancer support.
vcluster connect mgmt --print > /tmp/mgmt.yaml
vcluster connect dev --print > /tmp/dev.yaml
vcluster connect staging --print > /tmp/staging.yamlEach vCluster runs in an isolated Docker network. Connect them to a shared network so Sveltos on mgmt can reach dev and staging:
docker network create vcluster-shared
docker network connect vcluster-shared vcluster.cp.mgmt
docker network connect vcluster-shared vcluster.cp.dev
docker network connect vcluster-shared vcluster.cp.stagingGet the shared network IPs:
docker inspect vcluster.cp.dev | grep -A 15 vcluster-shared
docker inspect vcluster.cp.staging | grep -A 15 vcluster-sharedFix kubeconfigs with shared network IPs and correct port (8443):
# Replace with your actual IPs from above
sed 's/localhost:PORT/172.18.0.3:8443/' /tmp/dev.yaml > /tmp/dev-fixed.yaml
sed 's/localhost:PORT/172.18.0.4:8443/' /tmp/staging.yaml > /tmp/staging-fixed.yamlexport KUBECONFIG=/tmp/mgmt.yaml
helm repo add projectsveltos https://projectsveltos.github.io/helm-charts
helm repo update
helm install projectsveltos projectsveltos/projectsveltos \
-n projectsveltos \
--create-namespace \
--version=1.10.0
kubectl get pods -n projectsveltoskubectl label sveltoscluster mgmt -n mgmt type=mgmtkubectl create namespace dev
kubectl create namespace staging
sveltosctl register cluster \
--namespace=dev \
--cluster=dev \
--kubeconfig=/tmp/dev-fixed.yaml \
--labels=env=dev
sveltosctl register cluster \
--namespace=staging \
--cluster=staging \
--kubeconfig=/tmp/staging-fixed.yaml \
--labels=env=staging
kubectl get sveltoscluster -A --show-labelsbash bootstrap/install-argocd.sh
kubectl apply -f bootstrap/argocd-app-sveltos.yamlArgoCD syncs Sveltos resources from this repo. Sveltos handles progressive rollouts to dev and staging automatically.
# Check all clusters are ready
kubectl get sveltoscluster -A
# Check progressive rollout status
kubectl get clusterpromotion podinfo-rollout -o yaml | grep -A 20 status
# Access podinfo on dev
export KUBECONFIG=/tmp/dev.yaml
kubectl port-forward svc/podinfo 9898:9898 -n podinfo
open http://localhost:9898
# Access podinfo on staging
export KUBECONFIG=/tmp/staging.yaml
kubectl port-forward svc/podinfo 9898:9898 -n podinfo
open http://localhost:9898Edit sveltos/progressive/clusterpromotion-podinfo.yaml and push to main. ArgoCD syncs the change to mgmt. Sveltos deploys to dev first, waits 2 minutes, then promotes to staging automatically.
- Use
sudo vcluster createon Mac for LoadBalancer support - Each vCluster gets its own isolated Docker network. Shared network is required
- vCluster API server listens on port
8443not6443 - Use localhost kubeconfigs for local kubectl access, container IPs for Sveltos registration
- Sveltos
valuesfield requires pipe|, nested YAML map will not work
