What are they?
Virtual clusters are fully working Kubernetes clusters that run on top of other Kubernetes clusters. Compared to fully separate "real" clusters, virtual clusters reuse worker nodes and networking of the host cluster. They have their own control plane and schedule all workloads into a single namespace of the host cluster. Like virtual machines, virtual clusters partition a single physical cluster into multiple separate ones.
Official documentation
Why do we need them?
To partition the cluster into multiple virtual clusters which can be provided to the tenant teams for isolation. They provide following advantages:
- Ease of use - each tenant gets a cluster of their own!
- Customization - ability to install and use (and test) different cluster level resources (CRDs)
- Isolation - much stricter isolation than traditional namespace based multi tenancy
- Manageability - operators need not handle (too) many clusters
- Lightweight and full-fledged - based on the popular
k3s
distro and sqlite for DB (instead of etcd)
How to use them
Download vcluster cli
brew install vcluster
Install the cluster under a namespace
team-abc
❯ time vcluster create -n team-abc vcluster-abc info Detected local kubernetes cluster kind. Will deploy vcluster with a NodePort & sync real nodes info Create vcluster vcluster-abc... done √ Successfully created virtual cluster vcluster-abc in namespace team-abc info Waiting for vcluster to come up... warn vcluster is waiting, because vcluster pod vcluster-abc-0 has status: ContainerCreating warn vcluster is waiting, because vcluster pod vcluster-abc-0 has status: ContainerCreating warn vcluster is waiting, because vcluster pod vcluster-abc-0 has ... info Starting proxy container... done √ Switched active kube context to vcluster_vcluster-abc_team-abc_kind-macbook - Use `vcluster disconnect` to return to your previous kube context - Use `kubectl get namespaces` to access the vcluster vcluster create -n team-abc vcluster-abc 0.57s user 0.49s system 0% cpu 2:18.09 total
- Check the new cluster
❯ kubectl cluster-info Kubernetes control plane is running at https://127.0.0.1:10754 CoreDNS is running at https://127.0.0.1:10754/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'. ❯ kubectl ns default kube-system kube-public kube-node-lease
- Deploy workloads
❯ kubectl create ns test-ns namespace/test-ns created ❯ kubectl create deployment test-dep --image=nginx --replicas=2 -n test-ns deployment.apps/test-dep created ❯ kubectl get all -n test-ns NAME READY STATUS RESTARTS AGE pod/test-dep-574f5c6754-x4l45 0/1 ContainerCreating 0 51s pod/test-dep-574f5c6754-7tlr5 0/1 ContainerCreating 0 51s NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/test-dep 0/2 2 0 51s NAME DESIRED CURRENT READY AGE replicaset.apps/test-dep-574f5c6754 2 2 0 51s
- Check back from host cluster
❯ vcluster disconnect ❯ k get pods -n team-abc NAME READY STATUS RESTARTS AGE coredns-5df468b6b7-dtmn6-x-kube-system-x-vcluster-abc 1/1 Running 0 7m38s test-dep-574f5c6754-7tlr5-x-test-ns-x-vcluster-abc 1/1 Running 0 2m47s test-dep-574f5c6754-x4l45-x-test-ns-x-vcluster-abc 1/1 Running 0 2m47s vcluster-abc-0 2/2 Running 0 9m30s
House keeping
❯ vcluster list NAME NAMESPACE STATUS CONNECTED CREATED AGE vcluster-abc team-abc Running 2022-06-26 21:38:38 +0530 IST 10m44s ❯ vcluster delete vcluster-abc info Stopping docker proxy... info Delete vcluster vcluster-abc... done √ Successfully deleted virtual cluster vcluster-abc in namespace team-abc done √ Successfully deleted virtual cluster pvc data-vcluster-abc-0 in namespace team-abc
Get the kubeconfig of a vcluster
❯ vcluster list NAME NAMESPACE STATUS CONNECTED CREATED AGE vcluster-abc team-abc Running True 2022-06-26 21:51:11 +0530 IST 5m29s ❯ vcluster disconnect # Look for a secret named vc-<cluster-name> in the <namespace> used ❯ kubectl get secret vc-vcluster-abc -n team-abc --template={{.data.config}} | base64 -D clusters: - cluster: certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJkakNDQVIyZ0F3SUJBZ0lCQURBS0JnZ3Foa2pPUFFRREFqQWpNU0V3SHdZRFZRUUREQmhyTTNNdGMyVnkKZG1WeUxXTmhRREUyTlRZeU5qQTFNalV3SGhjTk1qSXdOakkyTVRZeU1qQTFXaGNOTXpJd05qSXpNVFl5TWpBMQpXakFqTVNFd0h3WURWUVFEREJock0zTXRjMlZ5ZG1WeUxXTmhRREUyTlRZeU5qQTFNalV3V1RBVEJnY3Foa2pPClBRSUJCZ2dxaGtqT1BRTUJCd05DQUFTVThuZGdKaWlNTFFHTEI0VmxSSjlQNm9LdTdGbkU4ZTM2OXl0eDhUYnUKeFJxNTg3NVE4SE1zRU9SMjl4a2puUmN5dUNrcVpOTTRHeDYzLzM1bW5TSjBvMEl3UURBT0JnTlZIUThCQWY4RQpCQU1DQXFRd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVU5PKzlHb1M5Z1lib0NMWjU3ck9GCmdndFFDZlF3Q2dZSUtv= ...
TODO
There are a lot more features to be explored and will do in another post
- pause/resume
- applying manifests on init
- passing down limits and quotas
- extensions/plugins
- using different distributions
What is impressive
- Tailor made for testing CRDs
- Probably well suited for CI use-cases to create clusters on the fly
- Very useful in creating throw-away clusters (for DEV/R&D purposes)
Top comments (0)