بصمة — منصة عربية لتعليم البرمجة والشبكات والإلكترونيات

Virtualization: hypervisor وVMs وvirtual switch وcontainers

بنجهّز الشبكة…
01 / ملخص التجربة

Virtualization: hypervisor وVMs وvirtual switch وcontainers

سيرفرين KVM عليهم VMs بتتقاسم الـ CPU والـ RAM، وسويتش افتراضي (Open vSwitch) بيحط كل VM في VLAN، وcontainer (nginx بـ Docker) جوه VM، وlive migration لـ VM من hypervisor لتاني من غير ما تقف — وتكتشف ليه الـ uplink لازم يبقى trunk.

مدة التجربة 35 دقيقة · 4 مهام

الأجهزة في بداية التجربة

  • DSW — سويتش L3
  • HV1 — Hypervisor
  • HV2 — Hypervisor
  • PC1 — كمبيوتر
  • WEB1 — سيرفر
  • DB1 — سيرفر
  • TEST — سيرفر

التوصيلات

  • DSW Gi1/0/1 ↔ HV1 eth0
  • DSW Gi1/0/2 ↔ HV2 eth0
  • DSW Gi1/0/3 ↔ PC1 eth0
  • WEB1 eth0 ↔ HV1 vnet0
  • DB1 eth0 ↔ HV1 vnet1
  • TEST eth0 ↔ HV1 vnet2

العناوين المضبوطة مسبقًا

  • DSW vlan: 10.0.0.1/24
  • DSW vlan: 10.10.10.1/24
  • DSW vlan: 10.20.20.1/24
  • DSW vlan: 10.30.30.1/24
02 / المهام التي ستطبقها
  1. 01
    الـ VMs بتتقاسم موارد الـ hypervisor: شغّل DB1

    يتحقق المعمل من على HV1: الأمر virsh list --all يظهر فيه «»

    تلميح / الحل المقترح
    على HV1: virsh list --all ثم virsh start DB1 — هيفشل: Cannot allocate memory. virsh nodeinfo (16 GiB) وvirsh dominfo لكل VM: WEB1 4G + TEST 8G = 12G، وDB1 محتاج 8G. الـ VMs بتاخد RAM حقيقي من السيرفر الفيزيائي. اقفل الـ VM اللي مش محتاجها: virsh shutdown TEST، وبعدين virsh start DB1
  2. 02
    الـ virtual switch: حط DB1 في VLAN 20

    يتحقق المعمل من على HV1: الأمر ovs-vsctl show يظهر فيه «»، DB1 يصل إلى 10.20.20.1 (ping)

    تلميح / الحل المقترح
    جوه الـ hypervisor فيه سويتش (Open vSwitch اسمه br0). ovs-vsctl show: vnet0 (WEB1) عليه tag: 10 لكن vnet1 (DB1) من غير tag. ovs-vsctl set port vnet1 tag=20 — نفس فكرة switchport access vlan بس على بورت افتراضي. الـ uplink eth0 من غير tag = trunk لكل الـ VLANs، وGi1/0/1 على DSW trunk
  3. 03
    Container جوه الـ VM: شغّل nginx على WEB1 ووصّله لـ PC1

    يتحقق المعمل من على WEB1: الأمر docker ps يظهر فيه «»

    تلميح / الحل المقترح
    على WEB1: docker run -d --name web -p 80:80 nginx هيفشل: port is already allocated — بورت 80 على WEB1 مستخدم (الـ web server بتاع السيرفر نفسه). انشر الـ container على بورت تاني: docker run -d --name web -p 8080:80 nginx (بورت 8080 على الـ VM ← بورت 80 جوه الـ container). docker ps يوريك 0.0.0.0:8080->80/tcp. من PC1: curl http://10.10.10.10:8080. قارن: uname -r على WEB1 وdocker exec web uname -r نفس الـ kernel (الـ container بيشارك kernel الـ VM)، لكن uname -r على HV1 مختلف (الـ VM ليها kernel خاص بيها). الـ container خفيف وبيقوم في ثانية، الـ VM نظام تشغيل كامل
  4. 04
    Live migration: انقل WEB1 لـ HV2 من غير ما تقف

    يتحقق المعمل من PC1 يصل إلى 10.10.10.10 (ping)، على WEB1: الأمر docker ps يظهر فيه «»

    تلميح / الحل المقترح
    على HV1: virsh migrate --live --verbose WEB1 qemu+ssh://HV2/system. الـ VM اتنقلت (virsh list على HV2) والـ container لسه شغال جواها، بس PC1 مش واصل! HV2 بيبعت VLAN 10 tagged على eth0 لكن Gi1/0/2 على DSW access VLAN 1. على DSW: interface gi1/0/2 ثم switchport mode trunk — أي hypervisor uplink لازم يشيل VLANs كل الـ VMs اللي ممكن تتنقل عليه