<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Tass</title>
    <description>The latest articles on DEV Community by Tass (@tasslin).</description>
    <link>https://dev.to/tasslin</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F410137%2Fd1888ef4-324b-4f51-b1c8-9b1c972af1df.jpeg</url>
      <title>DEV Community: Tass</title>
      <link>https://dev.to/tasslin</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tasslin"/>
    <language>en</language>
    <item>
      <title>KubeVirt介紹與初步教學使用</title>
      <dc:creator>Tass</dc:creator>
      <pubDate>Thu, 18 Jun 2020 08:24:59 +0000</pubDate>
      <link>https://dev.to/tasslin/kubevirt-3c0n</link>
      <guid>https://dev.to/tasslin/kubevirt-3c0n</guid>
      <description>&lt;h1&gt;
  
  
  KubeVirt介紹與初步教學使用
&lt;/h1&gt;

&lt;h5&gt;
  
  
  tags:&lt;code&gt;Kubernetes&lt;/code&gt;、&lt;code&gt;KubeVirt&lt;/code&gt;、&lt;code&gt;Minikube&lt;/code&gt;、&lt;code&gt;Openshift&lt;/code&gt;、&lt;code&gt;DevOps&lt;/code&gt;
&lt;/h5&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nN8YlBjI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/EEDLGjf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nN8YlBjI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/EEDLGjf.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  官方介紹
&lt;/h2&gt;

&lt;p&gt;先來看看官方介紹&amp;nbsp;:)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;KubeVirt&lt;/strong&gt; is a virtual machine management add-on for Kubernetes. The aim is to provide a common ground for virtualization solutions on top of Kubernetes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: KubeVirt is a heavy work in progress.&lt;/p&gt;

&lt;p&gt;David introduces the talk showing what KubeVirt is and what is not:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;KubeVirt is not involved with managing AWS or GCP instances&lt;/li&gt;
&lt;li&gt;KubeVirt is not a competitor to Firecracker or Kata containers&lt;/li&gt;
&lt;li&gt;KubeVirt is not a container runtime replacement&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;He likes to define KubeVirt as:&lt;/strong&gt;&lt;br&gt;
KubeVirt is a Kubernetes extension that allows running traditional VM workloads natively side by side with Container workloads.&lt;/p&gt;
&lt;h2&gt;
  
  
  介紹
&lt;/h2&gt;

&lt;p&gt;KubeVirt 是基於 Kubernetes ，在2017由RedHat發起。&lt;/p&gt;

&lt;p&gt;主要目標是讓一些Legacy與Monolith的服務不相容容器化時，可以運用KubeVirt來達成目的。&lt;/p&gt;

&lt;p&gt;或是在Deep learning需要使用GPU、vGPU時，可以調用。&lt;br&gt;
NVIDIA 有&lt;a href="https://github.com/NVIDIA/kubevirt-gpu-device-plugin"&gt;Plugin&lt;/a&gt;。&lt;/p&gt;
&lt;h3&gt;
  
  
  運行模式
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dQ4l9yts--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1600/1%2AcVoRd4SuwPwnUjhIeUVl1Q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dQ4l9yts--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1600/1%2AcVoRd4SuwPwnUjhIeUVl1Q.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;由上圖可以得知，KubeVirt運作原理與Kubernetes相似，因為是基於K8s XD&lt;/p&gt;

&lt;p&gt;那最末端都是Pods，一邊是Pod 包 VM ，一邊是 Pod 包 Container。&lt;/p&gt;

&lt;p&gt;上層也是透過API Server -&amp;gt; kubelet 來去溝通，所以KubeVirt 遵照&lt;a href="https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/"&gt;Custom Resource Definition&lt;/a&gt; (CRD) 來制定Type。&lt;/p&gt;

&lt;p&gt;而Cluster的Controller會與Node的Daemons遵照KubeVirt的邏輯去啟用運行或移除運行。&lt;/p&gt;

&lt;p&gt;而VM的volume則是透過Kubernetes的PVC來去達成。&lt;/p&gt;

&lt;p&gt;那VM是如何跑在Pod？&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--brfDun8e--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1600/1%2AvwX_8e5K6tXdKaSQEX5Qfg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--brfDun8e--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1600/1%2AvwX_8e5K6tXdKaSQEX5Qfg.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;透過上圖可以看出是透過KVM + Qemu來達成。&lt;/p&gt;

&lt;p&gt;更細節可以去看&lt;a href="https://github.com/kubevirt/kubevirt"&gt;Github&lt;/a&gt; XD&lt;/p&gt;

&lt;p&gt;因為說那麼多，還是先來個實作吧！更好去理解如何運行囉:)&lt;/p&gt;

&lt;p&gt;GO!&lt;/p&gt;
&lt;h2&gt;
  
  
  實作1
&lt;/h2&gt;

&lt;p&gt;這邊使用Minikube實作，請先去官網安裝&amp;nbsp;:) 。&lt;/p&gt;

&lt;p&gt;P.S. 筆者偷懶使用MAC，記得要裝KVM &amp;amp; Qemu。&lt;/p&gt;
&lt;h3&gt;
  
  
  啟用minikube
&lt;/h3&gt;


&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ minikube start --memory=4096 --cpus=2 --network-plugin cni
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;P.S. vm-driver kvm2&lt;/p&gt;

&lt;p&gt;這邊會使用KubeVirt的版本為v0.30.0，那也可以使用最新的。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# 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)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;版本確認後，直接使用github上的yaml。&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ kubectl create -f https://github.com/kubevirt/kubevirt/releases/download/$KUBEVIRT_VERSION/kubevirt-operator.yaml
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--XjlZuVL5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/2400/1%2Ahl2EBSyj0f2FaswOnSPDMw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--XjlZuVL5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/2400/1%2Ahl2EBSyj0f2FaswOnSPDMw.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;有Custom Resource Definition、RBAC以及deployment等等。&lt;br&gt;
看一下建立了什麼。&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ kubectl get all -n kubevirt
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--o3ur2yP9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/2400/1%2AlYvtNT0h1sxF72_9nDR2Fw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--o3ur2yP9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/2400/1%2AlYvtNT0h1sxF72_9nDR2Fw.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;查看Virtualization Extensions&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# 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
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;確認好之後，來到最重要的時刻 - &amp;gt; &lt;strong&gt;Deploy KubeVirt&lt;/strong&gt;。&lt;br&gt;
專屬的&lt;strong&gt;custom resource&lt;/strong&gt;。&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ kubectl create -f https://github.com/kubevirt/kubevirt/releases/download/$KUBEVIRT_VERSION/kubevirt-cr.yaml
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;查看部署了什麼！&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ kubectl get all -n kubevirt
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--k0KzolM0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/2400/1%2A8tTTTOmIGUgZCouexUuLRg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--k0KzolM0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/2400/1%2A8tTTTOmIGUgZCouexUuLRg.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;那有了這些，才可以透過&lt;code&gt;virtctl&lt;/code&gt; or &lt;code&gt;kubectl virt&lt;/code&gt; 來呼叫API Server並且正確運行。&lt;/p&gt;

&lt;p&gt;這裡使用Krew來快速安裝kubectl plugins，如沒使用過請參考此篇。&lt;br&gt;
kubectl krew install virt&lt;/p&gt;

&lt;p&gt;事前準備都好了！這裡就直接使用官方的VM！官方的registry disk。&lt;/p&gt;

&lt;p&gt;有 alpine, cirros and fedora，這邊使用kubevirt/cirros-registry-disk-demo。&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# 載下來查
$ 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
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--x0CIUxqP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/2400/1%2AqrTaMRu9ronizeyQOMBCUQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--x0CIUxqP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/2400/1%2AqrTaMRu9ronizeyQOMBCUQ.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;OK! 建立完成，到這裡就可以直接啟用VM囉，透過kubectl virt來啟用。&lt;/p&gt;

&lt;p&gt;P.S. 要啟用原因是vm.yaml第六行 running: false 。&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# 啟用
$ kubectl virt start testvm
# 查看
$ kubectl get vmis
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5I4B0aqS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1600/1%2A4s-X8UBN6qSP1-NxLainlg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5I4B0aqS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1600/1%2A4s-X8UBN6qSP1-NxLainlg.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---cVgd32U--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1600/1%2ASdzgUEYv1WzKvpzxL3lpVg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---cVgd32U--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1600/1%2ASdzgUEYv1WzKvpzxL3lpVg.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;這裡連進去試試看有沒有成功。&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ kubectl virt console testvm
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;P.S. Disconnect from the virtual machine console by typing:&lt;code&gt;ctrl+]&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--I0GRR0yb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1600/1%2AdwbpjNqN79DsCysZJfm4sw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--I0GRR0yb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1600/1%2AdwbpjNqN79DsCysZJfm4sw.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Cleanup
&lt;/h3&gt;


&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ kubectl virt stop testvm
$ kubectl delete vm testvm
$ minikube stop
$ minikube delete
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  實作2
&lt;/h2&gt;
&lt;h3&gt;
  
  
  啟用Minikube
&lt;/h3&gt;

&lt;p&gt;一樣使用minikube，此次是使用&lt;br&gt;
&amp;nbsp;Ubuntu 18.04.4 LTS (GNU/Linux 5.0.0–1032-azure x86_64)&lt;/p&gt;

&lt;p&gt;這裡要注意KVM有沒有已經啟用。&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ cat /sys/module/kvm_intel/parameters/nested
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;要回Y，如果不是要去啟用:)&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ 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
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;那這裡的實作是！！！&lt;br&gt;
使用Windows server 2012 ISO！！！&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;注意&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;這裡要多裝一個「CDI」&lt;br&gt;
KubeVirt and CDI are already installed.&lt;/p&gt;

&lt;p&gt;P.S. 實作1的還是要再重裝唷:)&lt;/p&gt;

&lt;p&gt;這裡使用的版本為v1.18.0&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ 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
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;什麼是CDI?&lt;br&gt;
Containerized-Data-Importer (CDI)，也就是除了從url來以外，也可以從PVC或是上傳檔案。&lt;/p&gt;

&lt;p&gt;那這裡create後，來看看svc。&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ kubectl get services -n cdi
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--t9DdJM87--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1600/1%2AXCBgVZErknAKdnCCBn-6_w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--t9DdJM87--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1600/1%2AXCBgVZErknAKdnCCBn-6_w.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;OK！那這裡的題目是使用Windows Server2012 64bit，所以到&lt;a href="https://www.microsoft.com/en-us/evalcenter/evaluate-windows-server-2012-r2"&gt;Microsoft Evaluation Center&lt;/a&gt;下載ISO file。&lt;/p&gt;

&lt;p&gt;那下載完後，就要使用kubectl virt上傳，這裡介紹等等有使用的參數。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;image-upload&lt;/code&gt;: Upload a VM image to a PersistentVolumeClaim&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--image-path&lt;/code&gt;: The path of the ISO file&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--pvc-nam&lt;/code&gt;e: The name of the PVC to store the ISO file, in this example is iso-win2k12&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--access-mode&lt;/code&gt;: the access mode for the PVC, in the example ReadOnlyMany has been used.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--pvc-size&lt;/code&gt;: 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&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--uploadproxy-url&lt;/code&gt;: The URL of the cdi-upload proxy service&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;那會看到svc是ClusterIP，為了方便，額外再創一個NodePort！&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cat &amp;lt;&amp;lt;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
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;建立完成後，使用minikube參數來看url。&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;minikube service cdi-uploadproxy-nodeport --url -n cdi -p kubevirt
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;請記得替換 &lt;code&gt;--uploadproxy-url&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ 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
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;--insecure&lt;/code&gt;: Allow insecure server connections when using HTTPS&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--wait-secs&lt;/code&gt;: The time in seconds to wait for upload pod to start. (default 60)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WEcpvLyp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/2400/1%2AdimYiGkD3AUQv4_IeJK6uw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WEcpvLyp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/2400/1%2AdimYiGkD3AUQv4_IeJK6uw.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;上傳成功！&lt;/p&gt;

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

&lt;p&gt;接下來先準備被掛載的PVC以及主要運行的VirtualMachine。&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;



&lt;p&gt;然後先把&lt;code&gt;virtio&lt;/code&gt; 的 image載到本機端。&lt;/p&gt;

&lt;p&gt;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.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker pull kubevirt/virtio-container-disk
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;創建&lt;a href="https://gist.github.com/tass-lin/4710df0a48f057d93570046ea302f144"&gt;win2k12.yml&lt;/a&gt;並啟用。&lt;/p&gt;

&lt;p&gt;P.S. 這邊也要注意PVC掛載情況。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl apply -f win2k12.yml
kubectl virt start win2k12-iso
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;看看有沒有成功&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl get vmi
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;成功了！！&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--iFzctc7a--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1600/1%2AtNSMVdj8D5MxJEN7Gb2TTA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--iFzctc7a--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1600/1%2AtNSMVdj8D5MxJEN7Gb2TTA.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;到這裡成功Run起一台VM了！來連線進去吧！&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl virt vnc win2k12-iso
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--gUMly_Ec--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1600/1%2AelmOhrLtQNfNDHWO99nnYw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gUMly_Ec--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1600/1%2AelmOhrLtQNfNDHWO99nnYw.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;詳細安裝就直接來看官方的&lt;a href="https://kubevirt.io/assets/2020-02-14-KubeVirt-installing_Microsoft_Windows_from_an_iso/kubevirt_install_windows.mp4"&gt;影片&lt;/a&gt;吧！&lt;/p&gt;

&lt;h3&gt;
  
  
  Cleanup
&lt;/h3&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ minikube delete -p kubevirt
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  結論
&lt;/h2&gt;

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

&lt;h2&gt;
  
  
  參考
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/kubevirt/kubevirt"&gt;https://github.com/kubevirt/kubevirt&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://kubevirt.io/"&gt;https://kubevirt.io/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://kubevirt.io/2020/KubeVirt_deep_dive-virtualized_gpu_workloads.html"&gt;https://kubevirt.io/2020/KubeVirt_deep_dive-virtualized_gpu_workloads.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://kubevirt.io/2020/Live-migration.html"&gt;https://kubevirt.io/2020/Live-migration.html&lt;/a&gt;&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>devops</category>
    </item>
  </channel>
</rss>
