YJWANG

[Kubernetes] Kube-virt k8s 환경에 설치 및 vm 실행 해보기 본문

60.Cloud/80.Kubernetes

[Kubernetes] Kube-virt k8s 환경에 설치 및 vm 실행 해보기

왕영주 2021. 5. 18. 14:28

본 포스팅은 아래 공식 홈페이지 링크 기준으로 작성됐습니다. 또한 provisioner 없이 구축했습니다.

참고 링크


 

 

Architecture


 

 

virt-controller
kube-api에 VM resource 요청이 오면 해당 요청을 핸들링 하는 역할을 수행한다.
예로 kube-api에 VM생성 요청이 오면 virt-controller가 이를 받아서 VM pod를 생성한다.

 

virt-handler
virt-controller와 마찬가지로 VM을 핸들링 하는데 Pod내에 있는 libvirtd와 통신하여 직접 Domain (VM)을 핸들링하는 역할을 수행한다.

 

virt-launcher
VM process가 사용할 cgroup과 namespace를 제공하는 역할을 하는 component이다.

 

사전 구성


- k8s cluster가 구축돼있어야합니다.
- 공식문서 기준 30GB의 usable 공간이 있어야합니다. (실제로 저정도는 사용하지 않으니 부족해도 설치가 될 듯합니다..)
- WorkerNode에 VM이 생성될 수 있어야합니다.

 

구성


먼저 kube-virt operator를 설치합니다.

# export VERSION=$(curl -s https://api.github.com/repos/kubevirt/kubevirt/releases | grep tag_name | grep -v -- '-rc' | head -1 | awk -F': ' '{print $2}' | sed 's/,//' | xargs)
# echo $VERSION
# kubectl create -f https://github.com/kubevirt/kubevirt/releases/download/${VERSION}/kubevirt-operator.yaml

 

이후 kube-virt operator가 핸들링할 custome resource를 배포합니다.

# kubectl create -f https://github.com/kubevirt/kubevirt/releases/download/${VERSION}/kubevirt-cr.yaml

 

배포를 확인합니다.

(Worker Node 2대 기준이라 Pod 수가 다를 순 있지만 전체적인 종류는 일치해야 합니다.)

# kubectl get all -n kubevirt
NAME                                  READY   STATUS    RESTARTS   AGE
pod/virt-api-5bddcd67f8-59v7x         1/1     Running   0          160m
pod/virt-api-5bddcd67f8-r2f8h         1/1     Running   0          160m
pod/virt-controller-9cc98c7c4-gjsdr   1/1     Running   0          160m
pod/virt-controller-9cc98c7c4-pvrs2   1/1     Running   0          160m
pod/virt-handler-5x9cd                1/1     Running   0          160m
pod/virt-handler-rrk2s                1/1     Running   0          160m
pod/virt-operator-6f5cd6d65-2pclf     1/1     Running   0          166m
pod/virt-operator-6f5cd6d65-7nmv2     1/1     Running   0          166m

NAME                                  TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
service/kubevirt-operator-webhook     ClusterIP   10.233.55.248   <none>        443/TCP   160m
service/kubevirt-prometheus-metrics   ClusterIP   10.233.53.143   <none>        443/TCP   160m
service/virt-api                      ClusterIP   10.233.0.144    <none>        443/TCP   160m

NAME                          DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE
daemonset.apps/virt-handler   2         2         2       2            2           kubernetes.io/os=linux   160m

NAME                              READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/virt-api          2/2     2            2           160m
deployment.apps/virt-controller   2/2     2            2           160m
deployment.apps/virt-operator     2/2     2            2           166m

NAME                                        DESIRED   CURRENT   READY   AGE
replicaset.apps/virt-api-5bddcd67f8         2         2         2       160m
replicaset.apps/virt-controller-9cc98c7c4   2         2         2       160m
replicaset.apps/virt-operator-6f5cd6d65     2         2         2       166m

NAME                            AGE    PHASE
kubevirt.kubevirt.io/kubevirt   160m   Deployed

 

이제 kubernetes 내에 있는 VM pod를 핸들링 하기 위한 virtctl command를 설치합니다.

# VERSION=$(kubectl get kubevirt.kubevirt.io/kubevirt -n kubevirt -o=jsonpath="{.status.observedKubeVirtVersion}")
# ARCH=$(uname -s | tr A-Z a-z)-$(uname -m | sed 's/x86_64/amd64/') || windows-amd64.exe
# echo ${ARCH}
# curl -L -o virtctl https://github.com/kubevirt/kubevirt/releases/download/${VERSION}/virtctl-${VERSION}-${ARCH}
# chmod +x virtctl
# sudo install virtctl /usr/local/bin

 

테스트 VM을 생성합니다.

# kubectl apply -f https://raw.githubusercontent.com/kubevirt/kubevirt.github.io/master/labs/manifests/vm.yaml
virtualmachine.kubevirt.io "testvm" created

 

VM이 생성됐는지 확인합니다.

# kubectl get vm
NAME     AGE   VOLUME
testvm   74m   

 

VM이 생성됐다면 start 하고 VM이 배정된 Node를 확인합니다.

# virtctl start testvm

# kubectl get vmis
NAME     AGE   PHASE     IP            NODENAME
testvm   69m   Running   10.233.89.6   virt-go-u20-91

 

kube-net을 접근할 수 있는 Node에서 IP를 통해 ssh로 접근할 수 있고 kubevirt 명령어의 console로도 접속할 수 있습니다.

# virtctl console testvm
Successfully connected to testvm console. The escape sequence is ^]

login as 'cirros' user. default password: 'gocubsgo'. use 'sudo' for root.
testvm login: cirros
Password: 
$ hostname
testvm

container 내부에서 VM이 생성되어 proccess로 올라가기 때문에 virsh로는 vm을 확인할 수 없었습니다~

반응형