[Cloud]/OpenShift

KVM 환경에서 Nested Virtualization 구성

ByoungHee Lee 2022. 12. 8. 10:20

가상화 환경을 구성하다 보면, Baremetal 환경외에도 VM에서 가상화를 지원해야 하는 경우가 많습니다. 이번 장에서는 KVM 가상화 환경에서 가상화된 VM에서 다시 가상화를 지원할 수 있는 KVM Nested Virtualization 구성 방법에 대해서 설명을 하겠습니다. 

# Baremetal KVM에서 Nested Virtualization 환경 설정

kvm_intel 모듈 파라미터 설정에서 options kvm_intel nested=1 설정을 합니다. 이 설정을 통해 KVM에서 가상화된 VM에서도 VM을 생성할 수 있도록 해 줍니다.  설정이 완료가 되면 OS 재부팅을 통해서 kvm_intel 모듈이 반영 되도록 합니다. 

[root@kvmhost ~]# cat /etc/modprobe.d/kvm.conf
# Setting modprobe kvm_intel/kvm_amd nested = 1
# only enables Nested Virtualization until the next reboot or
# module reload. Uncomment the option applicable
# to your system below to enable the feature permanently.
#
# User changes in this file are preserved across upgrades.
#
# For Intel
#options kvm_intel nested=1
#
# For AMD
#options kvm_amd nested=1
options kvm_intel nested=1

# Nested Virtualization 적용되었는지 확인

kvm_intel nested 모듈이 잘 적용이 되었다면 아래 command를 통해서 적용 여부를 확인 합니다. 1 or Y인 경우, 정상적으로 반영이 된것이고 0 or N 인 경우, 정상적으로 반영이 되지 않은 것입니다. 아래에서는 결과 값이 1이기 때문에 잘 반영이 된 것을 확인하실 수 있습니다.  

[root@kvmhost ~]# cat /sys/module/kvm_intel/parameters/nested
1

 

# VM에서 가상화 활성화

virt-manager를 통해 VM 목록을 확인하고 가상화 활성화 하고자 하는 VM의 CPUs 메뉴에서 Model을 host-passthrough 변경 합니다. 

 

# VM에서 가상화 지원여부 확인

VM에서 가상화를 지원하기 위해서는 CPU Flag에서 vmx가 활성화 되어야 합니다. 아래와 같이 확인이 가능합니다. 

[root@worker1 ~]# lscpu
Architecture:        x86_64
CPU op-mode(s):      32-bit, 64-bit
Byte Order:          Little Endian
CPU(s):              4
On-line CPU(s) list: 0-3
Thread(s) per core:  1
Core(s) per socket:  1
Socket(s):           4
NUMA node(s):        1
Vendor ID:           GenuineIntel
BIOS Vendor ID:      Red Hat
CPU family:          6
Model:               63
Model name:          Intel(R) Core(TM) i7-5820K CPU @ 3.30GHz
BIOS Model name:     RHEL 7.6.0 PC (i440FX + PIIX, 1996)
Stepping:            2
CPU MHz:             3298.088
BogoMIPS:            6596.17
Virtualization:      VT-x
Hypervisor vendor:   KVM
Virtualization type: full
L1d cache:           32K
L1i cache:           32K
L2 cache:            4096K
L3 cache:            16384K
NUMA node0 CPU(s):   0-3
Flags:               fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon rep_good nopl xtopology cpuid tsc_known_freq pni pclmulqdq vmx ssse3 fma cx16 pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm cpuid_fault invpcid_single pti ssbd ibrs ibpb stibp tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid xsaveopt arat umip md_clear arch_capabilities

[root@worker1 ~]# lscpu  | grep vmx
Flags:               fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon rep_good nopl xtopology cpuid tsc_known_freq pni pclmulqdq vmx ssse3 fma cx16 pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm cpuid_fault invpcid_single pti ssbd ibrs ibpb stibp tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid xsaveopt arat umip md_clear arch_capabilities

# openshift 에서 kvm 가상화 지원하는 노드 찾기

kvm 값이 null 인 경우는 가상화를 지원하지 않는 노드이고 1 이상인 경우는 가상화를 지원하는 노드 입니다. 

[root@bastion ~]# oc get nodes -o json|jq '.items[]|{"name": .metadata.name, "kvm": .status.allocatable["devices.kubevirt.io/kvm"]}'
{
  "name": "master1.ov-dc.lbh.com",
  "kvm": "null"
}
{
  "name": "master2.ov-dc.lbh.com",
  "kvm": "null"
}
{
  "name": "master3.ov-dc.lbh.com",
  "kvm": "null"
}
{
  "name": "worker1.ov-dc.lbh.com",
  "kvm": "1k"
}
{
  "name": "worker2.ov-dc.lbh.com",
  "kvm": "1k"
}
{