일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- archlinux
- nfs-provisioner
- port open
- golang
- yum
- KVM
- Linux
- Kubernetes
- HTML
- k8s
- cloud-init
- Octavia
- OpenStack
- Arch
- kolla-ansible
- libvirt
- ubuntu
- terraform
- Kubeflow
- cephadm
- i3
- pacman
- ceph
- awx
- ceph-ansible
- repository
- Ansible
- grafana-loki
- Docker
- kolla
- Today
- Total
YJWANG
[Kubernetes] Kube-virt k8s 환경에 설치 및 vm 실행 해보기 본문
본 포스팅은 아래 공식 홈페이지 링크 기준으로 작성됐습니다. 또한 provisioner 없이 구축했습니다.
참고 링크
Architecture
- https://github.com/kubevirt/kubevirt/blob/master/docs/components.md
- https://kubernetes.io/blog/2018/05/22/getting-to-know-kubevirt/
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을 확인할 수 없었습니다~