vCluster: Kubernetes에서의 가상 클러스터 생성 도구

vCluster는 Kubernetes에서 가상 클러스터(Virtual Cluster)를 생성할 수 있도록 돕는 오픈소스 도구로, 단일 물리적 Kubernetes 클러스터 위에 격리된 가상 클러스터를 운영할 수 있게 합니다. 이를 통해 여러 개발자가 동일한 클러스터에서 독립적인 환경을 구축하고 테스트할 수 있습니다.

 

Virtual Cluster란?

Virtual Cluster는 일반 Kubernetes 클러스터 위에서 동작하며 Kubernetes의 모든 기능을 제공합니다. 그러나 독립적인 실제 클러스터와는 다음과 같은 차이점이 있습니다:

  • 네트워크 및 노드 공유: Virtual Cluster는 호스트 클러스터의 Worker 노드와 네트워킹을 공유합니다.
  • 독립된 Control Plane: 각 Virtual Cluster는 개별 Control Plane을 가지며, 워크로드는 호스트 클러스터의 단일 Namespace에 스케줄됩니다.

참고: Virtual Cluster는 물리적 클러스터와 논리적으로 분리된 환경을 제공하며 Kubernetes API 서버를 독립적으로 실행합니다.

 

vCluster 주요 개념

  1. 가상 클러스터란?
    • Kubernetes API 서버를 독립적으로 실행하여 물리적 클러스터와 논리적으로 분리된 환경을 제공
    • 각 가상 클러스터는 별도의 네임스페이스를 활용하여 구성
  2. vCluster의 주요 기능
    • 멀티 테넌시: 하나의 물리적 클러스터에서 여러 사용자가 독립적으로 작업할 수 있음
    • 격리된 환경: 사용자 또는 팀별로 독립된 환경 제공
    • 빠른 프로비저닝: 전체 클러스터를 만드는 것보다 훨씬 빠르고 효율적으로 설정 가능
  3. vCluster 활용 사례
    • 개발/테스트 환경: 실제 프로덕션 클러스터를 건드리지 않고도 안전한 테스트 가능
    • CI/CD 파이프라인: 격리된 빌드 및 테스트 환경 제공
    • 멀티 테넌트 SaaS 플랫폼: 사용자 또는 고객별로 격리된 Kubernetes 환경 제공

 

 

Vcluster 사용의 장점

리소스 격리

vcluster를 사용하면 CPU, 메모리, 스토리지와 같은 중앙 클러스터 리소스의 일부를 개별 가상 클러스터에 할당 할 수 있습니다. 여러 팀이 이 통합 클러스터를 사용할때 노이즈가 많은 문제가 방지됩니다. 

 

접근제어

vcluster를 사용하면 가상 클러스터 수준에서 액세스 정책을 구현하여 권한이 있는 사용자만 액세스 할 수 있도록 할 수 있습니다.

 

출처 : https://www.vcluster.com/docs/

 

What are virtual clusters? | vcluster docs | Virtual Clusters for Kubernetes

What are virtual clusters? Virtual clusters are fully functional Kubernetes clusters nested inside a physical host cluster providing better isolation and flexibility to support multi-tenancy. Multiple teams can operate independently within the same physica

www.vcluster.com

 

사용자 정의

vcluster는 개별 팀의 요구 사항에 맞게 광범위한 사용자 정의를 허용합니다. 다양한 Kubernetes 버전, 네트워크 정책, 수신 규칙 및 리소스  할당량을 정의할 수 있습니다. 개발자는 다른 사람에게 영향을 미치지 않고  vcluster를 수정할 수 있는 권한을 가질 수 있습니다.

 

Multi-tenancy

통합 AKS를 구현하다보면 여러 내부 팀이나 외부 고객에게 Kubernetes Access를 제공해야 합니다. 이 경우 vcluster는 동일한 물리적 클러스터에서 별도의 격리된 환경을 만들어 Multi-tenancy를 쉽게 구현할 수 있도록 합니다.

출처 : https://rafay.co/the-kubernetes-current/key-considerations-when-implementing-virtual-kubernetes-clusters/

 

쉬운 확장

추가 vcluster는 동적 워크로드와 확장 요구 사항을 처리하기 위해 빠르게 Spin-up 또는 down 할 수 있습니다. 새로운 개발 및 테스트 환경은 전체 물리적 클러스터를 확장하지 않고도 즉시 프로비저닝 할 수 있습니다.

 

vCluster 연결 가이드

vCluster에 연결하는 과정은 가상 클러스터와 물리적 클러스터 간의 상호작용을 설정하는 중요한 단계입니다. 연결을 통해 가상 클러스터 내부에서 kubectl과 같은 도구를 사용하여 리소스를 관리할 수 있습니다.

 

vCluster 연결의 개념

vCluster는 물리적 클러스터 내에서 실행되지만, 독립된 Kubernetes API 서버를 통해 격리된 환경을 제공합니다. vCluster에 연결하면 물리적 클러스터와는 별도로 해당 API 서버를 통해 작업을 수행할 수 있습니다.

  • vCluster CLI 사용: vCluster CLI를 사용하면 간단하게 연결 및 작업을 수행할 수 있습니다.
  • kubectl 연결: vCluster 연결 후에도 kubectl 명령어를 사용하여 가상 클러스터의 리소스를 관리할 수 있습니다.

 

vCluster 연결 단계

1) vCluster CLI 설치

vCluster CLI가 설치되지 않았다면 다음 명령어로 설치합니다.

curl -L -o vcluster "https://github.com/loft-sh/vcluster/releases/download/v0.22.1/vcluster-darwin-arm64" && sudo install -c -m 0755 vcluster /usr/local/bin && rm -f vcluster

➜  ~ vcluster --version
vcluster version 0.22.1

 

 

vcluster를 사용해 가상 클러스터 생성

기존 클러스터 위에 가상 클러스터를 생성하여 테스트합니다.

vcluster create dev-vcluster --namespace dev

vcluster에 연결

vcluster connect dev-vcluster -n dev
➜  ~ k get ns
NAME              STATUS   AGE
default           Active   90s
kube-node-lease   Active   90s
kube-public       Active   90s
kube-system       Active   90s
➜  ~ kubectl config current-context
vcluster_dev-vcluster_dev_aks-dev-mvp-01

Node 확인

➜  ~ k get node
NAME                             STATUS   ROLES    AGE     VERSION
aks-devops-36174395-vmss000000   Ready    <none>   2m11s   v1.29.7

가상 클러스터는 호스트 클러스터 위에서 작동하는 Namespace 기반 가상 클러스터 입니다. 따라서 가상 클러스터 내부의 위 노드는 실제 물리 노드가 아닌, vcluster가 가상으로 제공하는 Control Plane node 입니다.

  • 가상 클러스터 내부의 노드(aks-devops-36174395-vmss000000)는 vcluster Pod의 컨트롤 플레인을 나타냅니다.
  • 실제 노드 정보는 호스트 클러스터에서 관리되며, 가상 클러스터 내부에서는 보이지 않습니다.

 

vCluster 제어 평면

  • vCluster의 제어 평면은 vCluster Pod(예: my-cluster-0)에 의해 관리됩니다.
  • 가상 클러스터는 내부 데이터 저장을 위해*Kine과 임베디드 SQLite 데이터베이스(state.db)를 사용합니다.
  • 배포 형태에 따른 차이
    • StatefulSet으로 배포: 영구 볼륨을 사용하여 데이터를 저장하며, 포드 삭제 시에도 데이터가 유지됩니다.
    • Deployment로 배포: 영구 저장소가 없는 경우, 포드 삭제 시 모든 데이터가 손실됩니다.
  • 영구 데이터 유지 방법
    • 외부 backingStore를 구성하여 데이터를 포드 외부에 저장할 수 있습니다.
    • 기본적으로 vCluster는 포드 외부에 데이터를 유지하지 않으며, 영구 저장소가 없는 상태에서 포드 삭제 시 데이터가 손실됩니다.

 

가상 클러스터와 호스트 클러스터의 격리 확인

가상 클러스터가 호스트 클러스터와 독립적으로 작동하는지 확인합니다.

가상 클러스터에서 리소스 생성

  • 가상 클러스터에서 네임스페이스 생성 및 Deployment 배포
kubectl create ns vcluster
kubectl create deploy nginx-deployment --image=nginx -n vcluster

➜  ~ k create ns vcluster
namespace/vcluster created

➜  ~ k create deploy nginx-deployment --image=nginx -n vcluster
deployment.apps/nginx-deployment created

➜  ~ k get deploy -n vcluster
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   1/1     1            1           15s

 

생성된 Pod는 가상 클러스터 내부에만 존재해야 합니다.

 

호스트 클러스터에서 확인

  • 가상클러스터 연결 해제 후 호스트 클러스터에서 리소스 확인
# 가상 클러스터에서 호스트 클러스터로 kube 컨텍스트를 전환
vcluster disconnect

# 호스트 클러스터의 namespace 확인 (dev존재 확인)
➜  ~ k get ns
NAME                       STATUS   AGE
arc-runner-axccoe          Active   7d
arc-system                 Active   7d
argocd                     Active   7d
botkube                    Active   6d23h
default                    Active   7d
dev                        Active   8m18s

# dev의 해당 deployment 배포가 호스트클러스터에 배포되었는지 확인
➜  ~ k get deploy -n dev
No resources found in dev namespace.


# dev namespace의 모든 리소스 확인
➜  ~ k get all -n dev
NAME                                                              READY   STATUS    RESTARTS   AGE
pod/coredns-664c8d69c4-fmqnv-x-kube-system-x-dev-vcluster         1/1     Running   0          8m51s
pod/dev-vcluster-0                                                1/1     Running   0          9m24s
pod/nginx-deployment-6d6565499c-x4j5l-x-vcluster-x-dev-vcluster   1/1     Running   0          3m27s

NAME                                                       TYPE        CLUSTER-IP        EXTERNAL-IP   PORT(S)                  AGE
service/dev-vcluster                                       ClusterIP   192.168.130.109   <none>        443/TCP,10250/TCP        9m25s
service/dev-vcluster-headless                              ClusterIP   None              <none>        443/TCP                  9m25s
service/dev-vcluster-node-aks-devops-36174395-vmss000000   ClusterIP   192.168.130.170   <none>        10250/TCP                8m51s
service/kube-dns-x-kube-system-x-dev-vcluster              ClusterIP   192.168.130.117   <none>        53/UDP,53/TCP,9153/TCP   8m51s

NAME                            READY   AGE
statefulset.apps/dev-vcluster   1/1     9m26s

 

deployment 리소스는 호스트 클러스터에 존재하지 않습니다. 기본적으로 호스트 클러스터에서 이 워크로드를 실행하는 데 필요하지 않기 때문에 가상 클러스터에더 호스트 클러스터로 동기화 되지 않습니다.

 

 

자원 정리

➜  ~ vcluster delete dev-vcluster -n dev
15:11:05 info Delete vcluster dev-vcluster...
15:11:05 done Successfully deleted virtual cluster dev-vcluster in namespace dev
15:11:05 done Successfully deleted virtual cluster namespace dev
15:11:05 info Waiting for virtual cluster to be deleted...
15:11:17 done Virtual Cluster is deleted

 

 

가상 클러스터 내부와 호스트 클러스터 간 리소스가 어떻게 연결되고 분리되는지를 직접 확인할 수 있었습니다. 특히, 가상 클러스터 내부의 노드가 실제 물리 노드가 아닌 가상 Control Plane 노드라는 점이 재미있엇고, 개인적으로 Kubernetes의 다양한 시나리오를 실험해보기 위해 테스트 환경을 구축해보아야겠다는 생각을 하게되었습니다.