KubeVirt介紹與初步教學使用
Tass
Posted on June 18, 2020
KubeVirt介紹與初步教學使用
tags:Kubernetes
、KubeVirt
、Minikube
、Openshift
、DevOps
官方介紹
先來看看官方介紹 :)
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-nam
e: 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/2020/KubeVirt_deep_dive-virtualized_gpu_workloads.html
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
November 29, 2024
November 29, 2024