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 waste | nodeهای نیمهخالی در دو 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-controller | watch روی VM/VMI؛ scheduling، replica، migration |
| virt-handler | DaemonSet روی هر node؛ اجرای VM محلی |
| virt-launcher | Pod یکبارمصرف که QEMU process را wrap میکند |
| virt-api | validation و subresource API |
| virtctl | CLI برای 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 VM | YAML در Git؛ ArgoCD/Flux مثل بقیه workloadها |
| Live migration | جابجایی VM بین node بدون downtime (با shared storage) |
| Snapshot / Restore | backup VM با VolumeSnapshot |
| Cloud-init / Ignition | bootstrap خودکار Linux VM |
| Windows VM | Server/Desktop با virtio drivers |
| GPU / SR-IOV | passthrough برای ML یا low-latency network |
| Fedora CoreOS، ISO boot | انعطاف boot source |
| Monitoring | metrics سازگار با 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) | Kata | KubeVirt (VM) | vSphere |
|---|---|---|---|---|
| واحد اجرا | container | microVM | VM کامل | VM |
| OS | shared kernel | kernel در guest | OS کامل guest | OS کامل |
| چگالی | عالی | خوب | متوسط | متوسط |
| Boot time | ثانیه | زیر ثانیه–ثانیه | دقیقه | دقیقه |
| Windows | ❌ | محدود | ✅ | ✅ |
| Live migration | N/A | محدود | ✅ | ✅ |
| Kubernetes native | ✅ | ✅ | ✅ | نیاز به Tanzu |
| Legacy app | ❌ | محدود | ✅ | ✅ |
خلاصه: KubeVirt وقتی VM واقعی میخواهید، نه فقط isolation container.
پیشنیازها
- 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-operatorvirtctl
# دانلود از 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 / gocubsgoVirtualMachine با 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-diskvirtctl start linux-vm
virtctl console linux-vm
virtctl stop linux-vm # graceful shutdown
virtctl stop linux-vm --grace-period 0 --force # power pullCDI: 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: 50Givirtctl image-upload windows-2022-dv --size=50Gi --image-path=./windows2022.qcow2شبکه VM
| حالت | کاربرد |
|---|---|
| masquerade (پیشفرض) | NAT ساده؛ VM به بیرون از IP Pod |
| bridge | VM روی L2 bridge؛ IP مستقیمتر |
| slirp | dev/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-100Live 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.ioper 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 خارج از GitOps | YAML + ArgoCD |
| شبکه VM جدا از Pod | CNI مشترک (با Multus/Kube-OVN) |
| vSphere lock-in برای همه | open source روی هر K8s |
KubeVirt برای تیمهایی است که Kubernetes را باور دارند ولی VM را هنوز نمیتوانند رها کنند — و آن را bug نمیبینند، بلکه واقعیت enterprise میدانند.
قدم بعدی
- روی staging cluster با KVM نصب کنید (راهنما)
- یک
cirrosVM با manifest بالا بالا بیاورید virtctl consoleو lifecycle (start/stop) را تست کنید- CDI نصب کنید و یک image واقعی import کنید
- اگر multi-tenant network دارید — Kube-OVN + Multus را امتحان کنید
منابع:
- KubeVirt — Official Site
- User Guide — Installation
- Quickstart (Cloud)
- Lifecycle (VM vs VMI)
- GitHub — kubevirt/kubevirt
- Containerized Data Importer
- KubeVirt + Kube-OVN
منتشر شده در P30Light — بخش زیرساخت سرور و Cloud Native.