KubeVirt, Kubernetes üzerinde sanal makine çalıştırmak için tasarlanmış bir operatör. Geleneksel VM dünyasıyla container orchestrator arasında köprü kuruyor. Temelinde KVM hipervizörünü kullanıyor, libvirt üzerinden yönetiyor.
Dört pod, bir hipervizör
Kurulum için önce operator'ü dağıtmak gerekiyor. KubeVirt operator, cluster genelinde VM yaşam döngüsünü yöneten bileşenleri içinde barındırıyor. Kurulum sonrası virt-operator, virt-controller, virt-handler ve virt-launcher podları çalışmaya başlıyor. Her node üzerinde virt-handler, kubelet'in yanında koşup KVM modüllerine erişerek sanal makine oluşturma işlemlerini yürütüyor. Çalışan her VM için ayrı bir virt-launcher podu başlatılıyor; libvirt ve qemu katmanı bu podun içinde yaşıyor.
VirtualMachine manifesti
Sanal makine tanımlamak için VirtualMachine custom resource kullanılıyor. YAML ile tanımlanan bu kaynak, CPU, bellek, disk ve ağ yapılandırmasını içeriyor. CPU olarak 2 core, bellek olarak 4GiB tanımlanabiliyor. Disk kısmında PVC veya container disk kullanılabilir. Container disk, VM imajını içinde taşıyan bir container imajının virt-launcher poduna mount edilmesiyle çalışıyor; ephemeral olduğu için kalıcı veri için PVC şart.
CDI ile disk importu
Disk import işlemi için Containerized Data Importer devreye giriyor. CDI, HTTP, S3, registry veya mevcut bir PVC üzerinden disk imajlarını hedef PVC'ye aktarabiliyor. Özellikle Windows veya Linux ISO dosyalarından VM oluştururken bu mekanizma kullanılıyor. Importer pod, kaynak imajı okuyup hedef PVC'ye yazıyor. İlerleme DataVolume durum alanından takip edilebiliyor.
Ağ tarafı
Ağ yapılandırması Kubernetes CNI ile entegre çalışıyor. VM'ler pod ağına dahil edilebilir, Service ile dışarıya açılabilir. Multus ile birden fazla ağ arayüzü eklemek mümkün. LoadBalancer tipi Service veya MetalLB gibi çözümlerle VM dış dünyaya açılabiliyor.
virtctl günlük işler
VM yönetimi için virtctl komut satırı aracı kullanılıyor. VM başlatmak için virtctl start vm-adi komutu veriliyor. Durdurmak için virtctl stop vm-adi kullanılıyor. Serial console erişimi virtctl console vm-adi ile, grafiksel VNC konsolu virtctl vnc vm-adi ile sağlanıyor. Live migration işlemi virtctl migrate vm-adi komutuyla başlatılabiliyor. Migration sırasında VM çalışmaya devam ediyor; PVC kullanan VM'lerde volume erişim modunun ReadWriteMany olması gerekiyor.
Node placement
VM'ler, node selector, affinity veya toleration ile belirli nodelara schedule edilebiliyor. Bu özellik, GPU node'ları veya yüksek performanslı donanımlara sahip makinalar için kritik.
Yetki modeli
Güvenlik tarafında KubeVirt, RBAC entegrasyonu sağlıyor. VM kaynaklarına erişim Kubernetes RBAC politikalarıyla kontrol ediliyor. Pod security admission ile VM podlarının yetenekleri sınırlandırılabiliyor. Secret yönetimi Kubernetes native mekanizmalarıyla yapılıyor.
Sıcak ekleme sınırları
Çalışan VM'e disk veya network arayüzü eklemek mümkün. CPU hotplug KubeVirt v1.0'dan, bellek hotplug v1.1'den itibaren destekleniyor; her iki işlem de arka planda live migration tetikliyor ve x86_64 mimarisi gerektiriyor. Bellek tarafında Linux guestlerde 5.8 ve üzeri çekirdek tam destekleniyor. Eski sürümlerde kaynak değişikliği için VM'i yeniden başlatmak gerekiyordu.
VirtualMachineInstanceReplicaSet
Yüksek kullanılabilirlik için VirtualMachineInstanceReplicaSet kullanılıyor. Bu kaynak, şablondan ephemeral VMI'ler üretiyor ve belirtilen replica sayısını koruyor. Bir node devre dışı kalınca eksilen VMI'ler başka bir node üzerinde yeniden oluşturuluyor.
KubeVirt, hybrid cloud senaryolarında öne çıkıyor. Mevcut VM workloadlarını container platformuna taşımak veya container ve VM karışık workload çalıştırmak isteyen ekipler için ideal çözüm sunuyor. Özellikle legacy uygulamaları Kubernetes ortamında tutmak isteyen kurumlar bu teknolojiyi tercih ediyor.
Küçük ölçekli test ortamları için nested virtualization açık olması yeterli. Üretim ortamlarında ise bare metal nodelar ve donanım sanallaştırma desteği şiddetle öneriliyor. Performans beklentileri container'lara göre daha yüksek olsa da KVM katmanı sayesinde neredeyse native performansa yaklaşılıyor.
