KubeVirt介紹與初步教學使用

tasslin

Tass

Posted on June 18, 2020

KubeVirt介紹與初步教學使用

KubeVirt介紹與初步教學使用

tags:KubernetesKubeVirtMinikubeOpenshiftDevOps

官方介紹

先來看看官方介紹 :)

KubeVirt is a virtual machine management add-on for Kubernetes. The aim is to provide a common ground for virtualization solutions on top of Kubernetes.

Note: KubeVirt is a heavy work in progress.

David introduces the talk showing what KubeVirt is and what is not:

  • KubeVirt is not involved with managing AWS or GCP instances
  • KubeVirt is not a competitor to Firecracker or Kata containers
  • KubeVirt is not a container runtime replacement

He likes to define KubeVirt as:
KubeVirt is a Kubernetes extension that allows running traditional VM workloads natively side by side with Container workloads.

介紹

KubeVirt 是基於 Kubernetes ,在2017由RedHat發起。

主要目標是讓一些Legacy與Monolith的服務不相容容器化時,可以運用KubeVirt來達成目的。

或是在Deep learning需要使用GPU、vGPU時,可以調用。
NVIDIA 有Plugin

運行模式

由上圖可以得知,KubeVirt運作原理與Kubernetes相似,因為是基於K8s XD

那最末端都是Pods,一邊是Pod 包 VM ,一邊是 Pod 包 Container。

上層也是透過API Server -> kubelet 來去溝通,所以KubeVirt 遵照Custom Resource Definition (CRD) 來制定Type。

而Cluster的Controller會與Node的Daemons遵照KubeVirt的邏輯去啟用運行或移除運行。

而VM的volume則是透過Kubernetes的PVC來去達成。

那VM是如何跑在Pod?

透過上圖可以看出是透過KVM + Qemu來達成。

更細節可以去看Github XD

因為說那麼多,還是先來個實作吧!更好去理解如何運行囉:)

GO!

實作1

這邊使用Minikube實作,請先去官網安裝 :) 。

P.S. 筆者偷懶使用MAC,記得要裝KVM & Qemu。

啟用minikube

$ minikube start --memory=4096 --cpus=2 --network-plugin cni

P.S. vm-driver kvm2

這邊會使用KubeVirt的版本為v0.30.0,那也可以使用最新的。

# On other OS you might need to define it like
$ export KUBEVIRT_VERSION="v0.30.0"
# On Linux you can obtain it using 'curl' via:
$ export KUBEVIRT_VERSION=$(curl -s https://api.github.com/repos/kubevirt/kubevirt/releases | grep tag_name | grep -v -- - | sort -V | tail -1 | awk -F':' '{print $2}' | sed 's/,//' | xargs)

版本確認後,直接使用github上的yaml。

$ kubectl create -f https://github.com/kubevirt/kubevirt/releases/download/$KUBEVIRT_VERSION/kubevirt-operator.yaml

有Custom Resource Definition、RBAC以及deployment等等。
看一下建立了什麼。

$ kubectl get all -n kubevirt

查看Virtualization Extensions

# To check if your VM's CPU supports virtualization extensions execute the following command:
$ minikube ssh -p kubevirt "egrep 'svm|vmx' /proc/cpuinfo"
# If the command doesn't generate any output, create the following ConfigMap so that KubeVirt uses emulation mode, otherwise skip to the next section
$ kubectl create configmap kubevirt-config -n kubevirt --from-literal debug.useEmulation=true

確認好之後,來到最重要的時刻 - > Deploy KubeVirt
專屬的custom resource

$ kubectl create -f https://github.com/kubevirt/kubevirt/releases/download/$KUBEVIRT_VERSION/kubevirt-cr.yaml

查看部署了什麼!

$ kubectl get all -n kubevirt

那有了這些,才可以透過virtctl or kubectl virt 來呼叫API Server並且正確運行。

這裡使用Krew來快速安裝kubectl plugins,如沒使用過請參考此篇。
kubectl krew install virt

事前準備都好了!這裡就直接使用官方的VM!官方的registry disk。

有 alpine, cirros and fedora,這邊使用kubevirt/cirros-registry-disk-demo。

# 載下來查
$ curl -L -o vm.yaml https://raw.githubusercontent.com/kubevirt/kubevirt.github.io/master/labs/manifests/vm.yaml
$ less vm.yaml
# 直接使用
$ kubectl apply -f https://raw.githubusercontent.com/kubevirt/kubevirt.github.io/master/labs/manifests/vm.yaml
# 查看
$ kubectl get vms

OK! 建立完成,到這裡就可以直接啟用VM囉,透過kubectl virt來啟用。

P.S. 要啟用原因是vm.yaml第六行 running: false 。

# 啟用
$ kubectl virt start testvm
# 查看
$ kubectl get vmis

這裡連進去試試看有沒有成功。

$ kubectl virt console testvm

P.S. Disconnect from the virtual machine console by typing:ctrl+].

Cleanup

$ kubectl virt stop testvm
$ kubectl delete vm testvm
$ minikube stop
$ minikube delete

實作2

啟用Minikube

一樣使用minikube,此次是使用
 Ubuntu 18.04.4 LTS (GNU/Linux 5.0.0–1032-azure x86_64)

這裡要注意KVM有沒有已經啟用。

$ cat /sys/module/kvm_intel/parameters/nested

要回Y,如果不是要去啟用:)

$ minikube config -p kubevirt set memory 8192
$ minikube config -p kubevirt set cpus 4
$ minikube config -p kubevirt set vm-driver kvm2
$ minikube config -p kubevirt set disk-size 50g
$ minikube start -p kubevirt --network-plugin cni

那這裡的實作是!!!
使用Windows server 2012 ISO!!!

注意

這裡要多裝一個「CDI」
KubeVirt and CDI are already installed.

P.S. 實作1的還是要再重裝唷:)

這裡使用的版本為v1.18.0

$ export VERSION=$(curl -s https://github.com/kubevirt/containerized-data-importer/releases/latest | grep -o "v[0-9]\.[0-9]*\.[0-9]*")
$ kubectl create -f https://github.com/kubevirt/containerized-data-importer/releases/download/$VERSION/cdi-operator.yaml
$ kubectl create -f https://github.com/kubevirt/containerized-data-importer/releases/download/$VERSION/cdi-cr.yaml

什麼是CDI?
Containerized-Data-Importer (CDI),也就是除了從url來以外,也可以從PVC或是上傳檔案。

那這裡create後,來看看svc。

$ kubectl get services -n cdi

OK!那這裡的題目是使用Windows Server2012 64bit,所以到Microsoft Evaluation Center下載ISO file。

那下載完後,就要使用kubectl virt上傳,這裡介紹等等有使用的參數。

  • image-upload: Upload a VM image to a PersistentVolumeClaim
  • --image-path: The path of the ISO file
  • --pvc-name: The name of the PVC to store the ISO file, in this example is iso-win2k12
  • --access-mode: the access mode for the PVC, in the example ReadOnlyMany has been used.
  • --pvc-size: The size of the PVC, is where the ISO will be stored, in this case, the ISO is 4.3G so a PVC OS 5G should be enough
  • --uploadproxy-url: The URL of the cdi-upload proxy service

那會看到svc是ClusterIP,為了方便,額外再創一個NodePort!

cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Service
metadata:
 name: cdi-uploadproxy-nodeport
 namespace: cdi
 labels:
   cdi.kubevirt.io: "cdi-uploadproxy"
spec:
 type: NodePort
 ports:
   - port: 443
     targetPort: 8443
     nodePort: 31001
     protocol: TCP
 selector:
   cdi.kubevirt.io: cdi-uploadproxy
EOF

建立完成後,使用minikube參數來看url。

minikube service cdi-uploadproxy-nodeport --url -n cdi -p kubevirt

請記得替換 --uploadproxy-url

$ kubectl virt image-upload \
   --image-path=9600.17050.WINBLUE_REFRESH.140317-1640_X64FRE_SERVER_EVAL_EN-US-IR3_SSS_X64FREE_EN-US_DV9.ISO \
   --pvc-name=iso-win2k12 \
   --access-mode=ReadOnlyMany \
   --pvc-size=5G \
   --uploadproxy-url=https://192.168.39.45:31001 \
   --insecure \
   --wait-secs=240
  • --insecure: Allow insecure server connections when using HTTPS
  • --wait-secs: The time in seconds to wait for upload pod to start. (default 60)

上傳成功!

P.S. 這裡要注意,image-upload 會創建一個DataVolume,會有一個Pod與PVC做連接,如果失敗要查看一下是否為PVC問題~

接下來先準備被掛載的PVC以及主要運行的VirtualMachine。

然後先把virtio 的 image載到本機端。

P.S. A container with the virtio drivers attached as a CD-ROM to the VM. The container image has to be pulled to have it available in the local registry.

docker pull kubevirt/virtio-container-disk

創建win2k12.yml並啟用。

P.S. 這邊也要注意PVC掛載情況。

kubectl apply -f win2k12.yml
kubectl virt start win2k12-iso

看看有沒有成功

kubectl get vmi

成功了!!

到這裡成功Run起一台VM了!來連線進去吧!

kubectl virt vnc win2k12-iso

詳細安裝就直接來看官方的影片吧!

Cleanup

$ minikube delete -p kubevirt

結論

那Kubevirt也解決了Container不方便或是無法解決的事情,VM統包XDD
所有服務都是慢慢變成熟的XD,那Kubevirt也是,如果現在要拿來用於Production,就是要慢慢踩坑囉~。其實也蠻多前輩及大神在踩,更新及維護也是Github上飄來飄去的大神,更版與回覆速度並不慢。
在此介紹及試用:)

參考

https://github.com/kubevirt/kubevirt

https://kubevirt.io/

https://kubevirt.io/2020/KubeVirt_deep_dive-virtualized_gpu_workloads.html

https://kubevirt.io/2020/Live-migration.html

💖 💪 🙅 🚩
tasslin
Tass

Posted on June 18, 2020

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related