نسخه آنلاین در حال بارگذاری زمان... تهران: ۲۶°C
۲۸ کاربر آنلاین

PNo.30Light

نشریه تخصصی هوش مصنوعی، سیستم‌های سرور و مهندسی داده

تازه ترین‌ها
زیرساخت و سرور
زمان مطالعه: ۱۹ دقیقه ۰ بازدید

KubeVirt: اجرای ماشین مجازی روی Kubernetes — راهنمای کامل

نویسنده: تحریریه فنی P30Light
KubeVirt: اجرای ماشین مجازی روی Kubernetes — راهنمای کامل
✦ خلاصه نکات کلیدی مقاله
  • KubeVirt VM را به‌صورت CRD (VirtualMachine / VirtualMachineInstance) روی Kubernetes اجرا می‌کند — همان kubectl، همان GitOps.
  • هر VMI داخل Pod از نوع virt-launcher با KVM/QEMU اجرا می‌شود؛ virt-handler روی هر node با kubelet هماهنگ است.
  • برای legacy VM، mixed workload (VM + container)، live migration و modernization تدریجی — نه جایگزین هر container.

Kubernetes container را به استاندارد deploy تبدیل کرد. اما میلیون‌ها workload هنوز ماشین مجازی کامل می‌خواهند: Windows Server، Oracle DB روی OS خاص، applianceهای vendor، یا نرم‌افزاری که containerize شدن ندارد.

راه‌حل‌های سنتی: دو پلتفرم جدا — vSphere/Proxmox برای VM و Kubernetes برای container. دو تیم، دو شبکه، دو backup، دو monitoring.

KubeVirt این شکاف را پر می‌کند:

Virtualization workloads on Kubernetes — managed like Pods.

یعنی VMها را با همان API، همان RBAC، همان GitOps و همان cluster مدیریت کنید — بدون اینکه مجبور باشید فردا همه چیز را containerize کنید.


مشکل: دو دنیا مجزا

مدل سنتی (جدا):
┌─────────────────┐     ┌─────────────────┐
│  vSphere/Proxmox │     │   Kubernetes    │
│  VMها، template  │     │  Pod، Deployment│
│  vMotion         │     │  HPA، Ingress   │
└─────────────────┘     └─────────────────┘
        ↑                       ↑
   تیم virtualization      تیم platform

هزینه‌ها:

مشکلتوضیح
دو control planeآموزش، incident، upgrade جدا
شبکه جداVM به Pod وصل نیست مگر hack
modernization کند«بعداً migrate می‌کنیم» = هرگز
resource wastenodeهای نیمه‌خالی در دو cluster
GitOps ناقصVM دستی در UI، container در YAML

KubeVirt هر دو را زیر یک سقف می‌آورد.


KubeVirt چیست؟

KubeVirt یک افزونه virtualization برای Kubernetes است که:

  • VM را به‌صورت Custom Resource تعریف می‌کند (VirtualMachine، VirtualMachineInstance)
  • از KVM (با QEMU) به‌عنوان hypervisor استفاده می‌کند
  • با scheduler، CNI، CSI و RBAC بومی K8s integrate می‌شود
  • پروژه CNCF (Sandbox) با جامعه فعال Red Hat، NVIDIA و end-userهای enterprise
  • آخرین release stable: v1.9.x (۲۰۲۵–۲۰۲۶)

شعار رسمی:

Develop, modify, and deploy applications in Application Containers and Virtual Machines in a common, shared environment.


معماری: چطور کار می‌کند؟

نمای کلی

                    Kubernetes API Server

         ┌──────────────────┼──────────────────┐
         ▼                  ▼                  ▼
   VirtualMachine    VirtualMachineInstance   DataVolume
   (VM — start/stop)  (VMI — در حال اجرا)     (CDI — disk image)
         │                  │
         └────────┬─────────┘

           virt-controller          ← control plane (Deployment)

    ┌─────────────┼─────────────┐
    ▼             ▼             ▼
 Node 1        Node 2        Node N
virt-handler  virt-handler  virt-handler   ← DaemonSet (کنار kubelet)
    │             │             │
    ▼             ▼             ▼
virt-launcher   virt-launcher  virt-launcher  ← Pod
 Pod            Pod            Pod
 └── QEMU/KVM + libvirt
     └── Guest OS (Linux/Windows/...)

مؤلفه‌های کلیدی

مؤلفهنقش
virt-operatorنصب و lifecycle خود KubeVirt (operator pattern)
virt-controllerwatch روی VM/VMI؛ scheduling، replica، migration
virt-handlerDaemonSet روی هر node؛ اجرای VM محلی
virt-launcherPod یک‌بارمصرف که QEMU process را wrap می‌کند
virt-apivalidation و subresource API
virtctlCLI برای console، start/stop، migrate، image upload

VM vs VMI — تفاوت مهم

منبعرفتارمثال
VirtualMachineInstance (VMI)مثل Pod — اگر define شود همیشه running استkubectl create -f vmi.yaml
VirtualMachine (VM)مثل StatefulSet — start/stop دارد؛ وقتی stop است resource می‌ماندvirtctl start my-vm

برای production معمولاً VirtualMachine استفاده می‌شود — shutdown بدون حذف تعریف.

virt-launcher و KVM

هر VMI یک Pod است (معمولاً privileged). داخل آن:

  • libvirt + QEMU با /dev/kvm
  • disk از PVC (CSI) یا containerDisk
  • network از CNI (bridge، masquerade، Multus)

KubeVirt به hardware virtualization (Intel VT-x / AMD-V) نیاز دارد — روی cloud معمولاً فعال است؛ روی nested VM باید nested virt را روشن کنید.


چه کارهایی می‌توانید ببرید؟

از kubevirt.io:

قابلیتتوضیح
VM + Container هم‌زمانlegacy DB در VM، API جدید در Pod — یک cluster
Declarative VMYAML در Git؛ ArgoCD/Flux مثل بقیه workloadها
Live migrationجابجایی VM بین node بدون downtime (با shared storage)
Snapshot / Restorebackup VM با VolumeSnapshot
Cloud-init / Ignitionbootstrap خودکار Linux VM
Windows VMServer/Desktop با virtio drivers
GPU / SR-IOVpassthrough برای ML یا low-latency network
Fedora CoreOS، ISO bootانعطاف boot source
Monitoringmetrics سازگار با Prometheus

چه زمانی KubeVirt استفاده کنیم؟

✅ سناریوهای مناسب

۱. Legacy workload که containerize نمی‌شود

  • ERP، billing، SCADA vendor-locked
  • نرم‌افزار فقط روی Windows Server ۲۰۱۶ certified است
  • appliance با ISO/vendor image

۲. Modernization تدریجی (strangler pattern)

فاز ۱: VM فعلی lift-and-shift به KubeVirt
فاز ۲: سرویس جدید container کنار همان VM
فاز ۳: بخش‌بخش decompose — بدون big-bang

۳. Mixed workload در یک cluster

  • PostgreSQL در VM (یا Oracle)، cache در Redis Pod
  • CI runner container + Windows build agent VM
  • Dev/test environment parity با production hybrid

۴. Private cloud / IaaS داخلی

  • self-service VM برای تیم‌ها با Namespace + Quota
  • هم‌راستا با Kube-OVN VPC برای multi-tenant network

۵. Live migration و HA

  • maintenance node بدون خاموشی VM
  • drain node در cluster شلوغ

۶. Edge با VM

  • retail POS، industrial gateway — OS کامل لازم است

❌ چه زمانی KubeVirt نه

وضعیتبهتر است
microservice stateless جدیدContainer معمولی
فقط به isolation سخت‌افاری Pod نیاز داریدKata Containers — سبک‌تر
team فقط K8s ساده می‌شناسد، VM نداریدپیچیدگی اضافه نکنید
nested virt غیرممکن و emulation فقطperformance ضعیف — bare-metal VM stack
همه workload قابل containerize استKubeVirt overhead بی‌فایده
نیاز به vSphere features کامل (DRS، Storage vMotion پیشرفته)هنوز vSphere + Tanzu یا hybrid

مقایسه: Container vs Kata vs KubeVirt vs vSphere

معیارContainer (runc)KataKubeVirt (VM)vSphere
واحد اجراcontainermicroVMVM کاملVM
OSshared kernelkernel در guestOS کامل guestOS کامل
چگالیعالیخوبمتوسطمتوسط
Boot timeثانیهزیر ثانیه–ثانیهدقیقهدقیقه
Windowsمحدود
Live migrationN/Aمحدود
Kubernetes nativeنیاز به Tanzu
Legacy appمحدود

خلاصه: KubeVirt وقتی VM واقعی می‌خواهید، نه فقط isolation container.


پیش‌نیازها

از Installation Guide:

  • Kubernetes (یکی از ۳ release آخر در زمان release KubeVirt)
  • kube-apiserver با --allow-privileged=true
  • KVM روی node (/dev/kvm موجود)
  • container runtime: containerd یا CRI-O
  • kubectl هم‌نسخه با cluster
  • برای SELinux: container-selinux نصب باشد
  • storage: CSI با ReadWriteMany برای live migration (یا block storage مناسب)

بررسی KVM روی node

# باید virtualization supported و enabled باشد
grep -E '(vmx|svm)' /proc/cpuinfo

# دسترسی به device
ls -l /dev/kvm

اگر KVM نیست (minikube local، nested virt غیرفعال):

kubectl -n kubevirt patch kubevirt kubevirt --type=merge \
  -p '{"spec":{"configuration":{"developerConfiguration":{"useEmulation":true}}}}'

emulation فقط برای dev/test — production ممنوع.


نصب KubeVirt

گام ۱: Operator

export RELEASE=$(curl -s https://api.github.com/repos/kubevirt/kubevirt/releases/latest \
  | grep tag_name | cut -d '"' -f 4)

kubectl apply -f \
  "https://github.com/kubevirt/kubevirt/releases/download/${RELEASE}/kubevirt-operator.yaml"

گام ۲: KubeVirt CR

kubectl apply -f \
  "https://github.com/kubevirt/kubevirt/releases/download/${RELEASE}/kubevirt-cr.yaml"

kubectl -n kubevirt wait kv kubevirt --for=condition=Available --timeout=300s

گام ۳: تأیید

kubectl get pods -n kubevirt
# virt-api، virt-controller، virt-handler (DaemonSet)، virt-operator

virtctl

# دانلود از release page
curl -L -o virtctl \
  "https://github.com/kubevirt/kubevirt/releases/download/${RELEASE}/virtctl-${RELEASE}-linux-amd64"
chmod +x virtctl && sudo mv virtctl /usr/local/bin/

# یا با krew:
kubectl krew install virt
# سپس: kubectl virt console my-vm

اولین VM: مثال عملی

VirtualMachine با containerDisk (سریع برای تست)

apiVersion: kubevirt.io/v1
kind: VirtualMachine
metadata:
  name: testvm
  namespace: default
spec:
  running: true
  template:
    metadata:
      labels:
        kubevirt.io/vm: testvm
    spec:
      domain:
        devices:
          disks:
            - name: containerdisk
              disk:
                bus: virtio
            - name: cloudinitdisk
              disk:
                bus: virtio
          interfaces:
            - name: default
              masquerade: {}
        resources:
          requests:
            memory: 1Gi
            cpu: 1
      networks:
        - name: default
          pod: {}
      volumes:
        - name: containerdisk
          containerDisk:
            image: quay.io/kubevirt/cirros-container-disk-demo
        - name: cloudinitdisk
          cloudInitNoCloud:
            userData: |
              #cloud-config
              password: cirros
              chpasswd: { expire: False }
kubectl apply -f testvm.yaml
kubectl get vm,vmi
virtctl console testvm   # login: cirros / gocubsgo

VirtualMachine با PVC (production)

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: vm-disk
spec:
  accessModes: [ReadWriteOnce]
  resources:
    requests:
      storage: 20Gi
  storageClassName: your-sc
---
apiVersion: kubevirt.io/v1
kind: VirtualMachine
metadata:
  name: linux-vm
spec:
  running: false
  template:
    spec:
      domain:
        devices:
          disks:
            - name: disk0
              disk: { bus: virtio }
        resources:
          requests:
            memory: 4Gi
            cpu: 2
      volumes:
        - name: disk0
          persistentVolumeClaim:
            claimName: vm-disk
virtctl start linux-vm
virtctl console linux-vm
virtctl stop linux-vm      # graceful shutdown
virtctl stop linux-vm --grace-period 0 --force  # power pull

CDI: import تصویر disk

Containerized Data Importer (CDI) برای upload ISO/qcow2:

export CDI_VERSION=$(curl -s https://api.github.com/repos/kubevirt/containerized-data-importer/releases/latest \
  | grep tag_name | cut -d '"' -f 4)
kubectl apply -f \
  "https://github.com/kubevirt/containerized-data-importer/releases/download/${CDI_VERSION}/cdi-operator.yaml"
kubectl apply -f \
  "https://github.com/kubevirt/containerized-data-importer/releases/download/${CDI_VERSION}/cdi-cr.yaml"
apiVersion: cdi.kubevirt.io/v1beta1
kind: DataVolume
metadata:
  name: windows-2022-dv
spec:
  source:
    upload: {}
  pvc:
    accessModes: [ReadWriteOnce]
    resources:
      requests:
        storage: 50Gi
virtctl image-upload windows-2022-dv --size=50Gi --image-path=./windows2022.qcow2

شبکه VM

حالتکاربرد
masquerade (پیش‌فرض)NAT ساده؛ VM به بیرون از IP Pod
bridgeVM روی L2 bridge؛ IP مستقیم‌تر
slirpdev/test
Multusچند NIC؛ SR-IOV؛ VLAN جدا

برای production multi-tenant، Kube-OVN + Multus ترکیب رایجی است — static IP و VPC per tenant.

interfaces:
  - name: net0
    bridge: {}
networks:
  - name: net0
    multus:
      networkName: tenant-vlan-100

Live Migration

با shared storage (ReadWriteMany PVC یا block):

virtctl migrate my-vm
# یا drain node — KubeVirt VM را migrate می‌کند اگر policy اجازه دهد

نیازها:

  • Storage مشترک بین nodeها
  • CPU model سازگار (یا host-model careful)
  • شبکه پایدار (اختیاری: dedicated migration network)

KubeVirt v1.9+ featureهای cross-cluster migration با EVPN را هم پوشش می‌دهد.


امنیت و multi-tenancy

  • RBAC: virtualmachines.kubevirt.io per Namespace
  • NetworkPolicy: روی Pod virt-launcher اعمال می‌شود
  • SCC/PSP: virt-handler به privileged نیاز دارد — محدود به nodeهای مجاز
  • Audit: security audit رسمی KubeVirt انجام شده (۲۰۲۵)
  • SELinux: پشتیبانی با policy مناسب

هر VMI = یک privileged Pod → tenant isolation با Namespace + NetworkPolicy + (در صورت نیاز) node pool جدا.


KubeVirt در کنار stack مدرن

┌────────────────────────────────────────────────────┐
│              Kubernetes Cluster                     │
├──────────────┬──────────────┬──────────────────────┤
│  Containers  │   KubeVirt   │   Operators          │
│  Deploy/STS  │   VM/VMI     │   CDI, Kube-OVN      │
├──────────────┴──────────────┴──────────────────────┤
│  CNI (Calico/Kube-OVN)  │  CSI (Ceph/Longhorn)     │
├─────────────────────────┴──────────────────────────┤
│  KVM-enabled Linux Nodes                            │
└────────────────────────────────────────────────────┘

OpenShift Virtualization همان KubeVirt upstream با UI و support Red Hat است — اگر enterprise support می‌خواهید.


عملیات روزمره

# وضعیت
kubectl get vm -A
kubectl get vmi -A

# console گرافیکی (VNC)
virtctl vnc my-vm

# pause / unpause (مثل suspend RAM)
virtctl pause vm my-vm
virtctl unpause vm my-vm

# restart
virtctl restart my-vm

# expose سرویس VM
kubectl expose vmi my-vm --port=80 --type=NodePort

جمع‌بندی: چرا KubeVirt؟

بدون KubeVirtبا KubeVirt
دو پلتفرم VM + K8sیک control plane
modernization = پروژه چندسالهlift-and-shift سریع + decompose تدریجی
VM خارج از GitOpsYAML + ArgoCD
شبکه VM جدا از PodCNI مشترک (با Multus/Kube-OVN)
vSphere lock-in برای همهopen source روی هر K8s

KubeVirt برای تیم‌هایی است که Kubernetes را باور دارند ولی VM را هنوز نمی‌توانند رها کنند — و آن را bug نمی‌بینند، بلکه واقعیت enterprise می‌دانند.

قدم بعدی

  1. روی staging cluster با KVM نصب کنید (راهنما)
  2. یک cirros VM با manifest بالا بالا بیاورید
  3. virtctl console و lifecycle (start/stop) را تست کنید
  4. CDI نصب کنید و یک image واقعی import کنید
  5. اگر multi-tenant network دارید — Kube-OVN + Multus را امتحان کنید

منابع:


منتشر شده در P30Light — بخش زیرساخت سرور و Cloud Native.

لینک گزارش با موفقیت کپی گردید!