10.15.10. PCI 패스스루 구성
PCI(Peripheral Component Interconnect) 패스스루 기능을 사용하면 가상 머신에서 하드웨어 장치에 액세스하고 관리할 수 있습니다. PCI 패스스루가 구성되면 PCI 장치는 게스트 운영 체제에 물리적으로 연결된 것처럼 작동합니다.
클러스터 관리자는 oc CLI(명령줄 인터페이스)를 사용하여 클러스터에서 사용할 수 있는 호스트 장치를 노출하고 관리할 수 있습니다.
10.15.10.1. PCI 패스스루를 위한 호스트 장치 준비 정보 링크 복사링크가 클립보드에 복사되었습니다!
CLI를 사용하여 PCI 패스스루를 위한 호스트 장치를 준비하려면 MachineConfig 오브젝트를 생성하고 커널 인수를 추가하여 IOMMU(Input-Output Memory Management Unit)를 활성화합니다. PCI 장치를 VFIO(가상 기능 I/O) 드라이버에 연결한 다음 HyperConverged CR(사용자 정의 리소스)의 allowedHostDevices 필드를 편집하여 클러스터에 노출합니다. OpenShift Virtualization Operator를 처음 설치할 때 permittedHostDevices 목록이 비어 있습니다.
CLI를 사용하여 클러스터에서 PCI 호스트 장치를 제거하려면 HyperConverged CR에서 PCI 장치 정보를 삭제합니다.
10.15.10.1.1. IOMMU 드라이버를 활성화하려면 커널 인수 추가 링크 복사링크가 클립보드에 복사되었습니다!
커널에서 IOMMU(Input-Output Memory Management Unit) 드라이버를 활성화하려면 MachineConfig 개체를 생성하고 커널 인수를 추가합니다.
사전 요구 사항
- OpenShift Container Platform 클러스터에 대한 관리자 권한을 보유하고 있어야 합니다.
- Intel 또는 AMD CPU 하드웨어.
- BIOS의 Directed I/O 확장용 Intel Virtualization Technology 또는 AMD IOMMU(Basic Input/Output System)가 활성화되어 있습니다.
절차
커널 인수를 식별하는
MachineConfig오브젝트를 만듭니다. 다음 예제에서는 Intel CPU에 대한 커널 인수를 보여줍니다.apiVersion: machineconfiguration.openshift.io/v1 kind: MachineConfig metadata: labels: machineconfiguration.openshift.io/role: worker1 name: 100-worker-iommu2 spec: config: ignition: version: 3.2.0 kernelArguments: - intel_iommu=on3 # ...새
MachineConfig오브젝트를 만듭니다.$ oc create -f 100-worker-kernel-arg-iommu.yaml
검증
새
MachineConfig오브젝트가 추가되었는지 확인합니다.$ oc get MachineConfig
10.15.10.1.2. VFIO 드라이버에 PCI 장치 바인딩 링크 복사링크가 클립보드에 복사되었습니다!
PCI 장치를 VFIO(Virtual Function I/O) 드라이버에 바인딩하려면 각 장치에서 vendor-ID 및 device-ID 값을 가져오고 값으로 목록을 생성합니다. MachineConfig 오브젝트에 이 목록을 추가합니다. MachineConfig Operator는 PCI 장치가 있는 노드에 /etc/modprobe.d/vfio.conf를 생성하고 PCI 장치를 VFIO 드라이버에 바인딩합니다.
사전 요구 사항
- CPU에 IOMMU를 사용하도록 커널 인수를 추가했습니다.
절차
lspci명령을 실행하여 PCI 장치의vendor-ID및device-ID를 가져옵니다.$ lspci -nnv | grep -i nvidia출력 예
02:01.0 3D controller [0302]: NVIDIA Corporation GV100GL [Tesla V100 PCIe 32GB] [10de:1eb8] (rev a1)Virtual config 파일
100-worker-vfiopci.bu를 생성하여 PCI 장치를 VFIO 드라이버에 바인딩합니다.참고Butane에 대한 자세한 내용은 “Butane 을 사용하여 머신 구성 생성”을 참조하십시오.
예
variant: openshift version: 4.13.0 metadata: name: 100-worker-vfiopci labels: machineconfiguration.openshift.io/role: worker1 storage: files: - path: /etc/modprobe.d/vfio.conf mode: 0644 overwrite: true contents: inline: | options vfio-pci ids=10de:1eb82 - path: /etc/modules-load.d/vfio-pci.conf3 mode: 0644 overwrite: true contents: inline: vfio-pciButane을 사용하여 작업자 노드로 전달할 구성이 포함된
MachineConfig오브젝트 파일100-worker-vfiopci.yaml을 생성합니다.$ butane 100-worker-vfiopci.bu -o 100-worker-vfiopci.yaml작업자 노드에
MachineConfig오브젝트를 적용합니다.$ oc apply -f 100-worker-vfiopci.yamlMachineConfig오브젝트가 추가되었는지 확인합니다.$ oc get MachineConfig출력 예
NAME GENERATEDBYCONTROLLER IGNITIONVERSION AGE 00-master d3da910bfa9f4b599af4ed7f5ac270d55950a3a1 3.2.0 25h 00-worker d3da910bfa9f4b599af4ed7f5ac270d55950a3a1 3.2.0 25h 01-master-container-runtime d3da910bfa9f4b599af4ed7f5ac270d55950a3a1 3.2.0 25h 01-master-kubelet d3da910bfa9f4b599af4ed7f5ac270d55950a3a1 3.2.0 25h 01-worker-container-runtime d3da910bfa9f4b599af4ed7f5ac270d55950a3a1 3.2.0 25h 01-worker-kubelet d3da910bfa9f4b599af4ed7f5ac270d55950a3a1 3.2.0 25h 100-worker-iommu 3.2.0 30s 100-worker-vfiopci-configuration 3.2.0 30s
검증
VFIO 드라이버가 로드되었는지 확인합니다.
$ lspci -nnk -d 10de:출력은 VFIO 드라이버가 사용 중인지 확인합니다.
출력 예
04:00.0 3D controller [0302]: NVIDIA Corporation GP102GL [Tesla P40] [10de:1eb8] (rev a1) Subsystem: NVIDIA Corporation Device [10de:1eb8] Kernel driver in use: vfio-pci Kernel modules: nouveau
10.15.10.1.3. CLI를 사용하여 클러스터에 PCI 호스트 장치 노출 링크 복사링크가 클립보드에 복사되었습니다!
클러스터에 PCI 호스트 장치를 노출하려면 PCI 장치에 대한 세부 정보를 HyperConverged CR(사용자 정의 리소스)의 spec.permittedHostDevices 배열에 추가합니다.
절차
다음 명령을 실행하여 기본 편집기에서
HyperConvergedCR을 편집합니다.$ oc edit hyperconverged kubevirt-hyperconverged -n openshift-cnvspec.permittedHostDevices.pciHostDevices어레이에 PCI 장치 정보를 추가합니다. 예를 들면 다음과 같습니다.설정 파일 예
apiVersion: hco.kubevirt.io/v1 kind: HyperConverged metadata: name: kubevirt-hyperconverged namespace: openshift-cnv spec: permittedHostDevices:1 pciHostDevices:2 - pciDeviceSelector: "10DE:1DB6"3 resourceName: "nvidia.com/GV100GL_Tesla_V100"4 - pciDeviceSelector: "10DE:1EB8" resourceName: "nvidia.com/TU104GL_Tesla_T4" - pciDeviceSelector: "8086:6F54" resourceName: "intel.com/qat" externalResourceProvider: true5 # ...참고위의 예제 스니펫은 이름이
nvidia.com/GV100GL_Tesla_V100이고nvidia.com/TU104GL_Tesla_T4가HyperConvergedCR에서 허용된 호스트 장치 목록에 추가된 두 개의 PCI 호스트 장치를 보여줍니다. 이러한 장치는 OpenShift Virtualization에서 작동하도록 테스트 및 검증되었습니다.- 변경 사항을 저장하고 편집기를 종료합니다.
검증
다음 명령을 실행하여 PCI 호스트 장치가 노드에 추가되었는지 확인합니다. 예제 출력에서는 각각
nvidia.com/GV100GL_Tesla_V100,nvidia.com/TU104GL_Tesla_T4,intel.com/qat리소스 이름과 연결된 하나의 장치가 있음을 보여줍니다.$ oc describe node <node_name>출력 예
Capacity: cpu: 64 devices.kubevirt.io/kvm: 110 devices.kubevirt.io/tun: 110 devices.kubevirt.io/vhost-net: 110 ephemeral-storage: 915128Mi hugepages-1Gi: 0 hugepages-2Mi: 0 memory: 131395264Ki nvidia.com/GV100GL_Tesla_V100 1 nvidia.com/TU104GL_Tesla_T4 1 intel.com/qat: 1 pods: 250 Allocatable: cpu: 63500m devices.kubevirt.io/kvm: 110 devices.kubevirt.io/tun: 110 devices.kubevirt.io/vhost-net: 110 ephemeral-storage: 863623130526 hugepages-1Gi: 0 hugepages-2Mi: 0 memory: 130244288Ki nvidia.com/GV100GL_Tesla_V100 1 nvidia.com/TU104GL_Tesla_T4 1 intel.com/qat: 1 pods: 250
10.15.10.1.4. CLI를 사용하여 클러스터에서 PCI 호스트 장치 제거 링크 복사링크가 클립보드에 복사되었습니다!
클러스터에서 PCI 호스트 장치를 제거하려면 HyperConverged CR(사용자 정의 리소스)에서 해당 장치의 정보를 삭제합니다.
절차
다음 명령을 실행하여 기본 편집기에서
HyperConvergedCR을 편집합니다.$ oc edit hyperconverged kubevirt-hyperconverged -n openshift-cnv적절한 장치의
pciDeviceSelector,resourceName및externalResourceProvider(해당되는 경우) 필드를 삭제하여spec.permittedHostDevices.pciHostDevices어레이에서 PCI 장치 정보를 제거합니다. 이 예에서는intel.com/qat리소스가 삭제되었습니다.설정 파일 예
apiVersion: hco.kubevirt.io/v1 kind: HyperConverged metadata: name: kubevirt-hyperconverged namespace: openshift-cnv spec: permittedHostDevices: pciHostDevices: - pciDeviceSelector: "10DE:1DB6" resourceName: "nvidia.com/GV100GL_Tesla_V100" - pciDeviceSelector: "10DE:1EB8" resourceName: "nvidia.com/TU104GL_Tesla_T4" # ...- 변경 사항을 저장하고 편집기를 종료합니다.
검증
다음 명령을 실행하여 PCI 호스트 장치가 노드에서 제거되었는지 확인합니다. 예제 출력에서는
intel.com/qat리소스 이름과 연결된 장치가 0개 있음을 보여줍니다.$ oc describe node <node_name>출력 예
Capacity: cpu: 64 devices.kubevirt.io/kvm: 110 devices.kubevirt.io/tun: 110 devices.kubevirt.io/vhost-net: 110 ephemeral-storage: 915128Mi hugepages-1Gi: 0 hugepages-2Mi: 0 memory: 131395264Ki nvidia.com/GV100GL_Tesla_V100 1 nvidia.com/TU104GL_Tesla_T4 1 intel.com/qat: 0 pods: 250 Allocatable: cpu: 63500m devices.kubevirt.io/kvm: 110 devices.kubevirt.io/tun: 110 devices.kubevirt.io/vhost-net: 110 ephemeral-storage: 863623130526 hugepages-1Gi: 0 hugepages-2Mi: 0 memory: 130244288Ki nvidia.com/GV100GL_Tesla_V100 1 nvidia.com/TU104GL_Tesla_T4 1 intel.com/qat: 0 pods: 250