9.2. NFV 워크로드에 RT-KVM 활성화

Red Hat Enterprise Linux 8.2 Real Time KVM(RT-KVM)을 쉽게 설치하고 구성할 수 있도록 Red Hat OpenStack Platform은 다음과 같은 기능을 제공합니다.

  • 실시간 Red Hat Enterprise Linux를 프로비저닝하는 실시간 컴퓨팅 노드 역할.
  • 추가 RT-KVM 커널 모듈.
  • 컴퓨팅 노드의 자동 구성입니다.

9.2.1. RT-KVM 컴퓨팅 노드 계획

RT-KVM 컴퓨팅 노드에 Red Hat 인증 서버를 사용해야 합니다. 자세한 내용은 다음을 참조하십시오. Red Hat Enterprise Linux for Real Time 7 인증 서버.

RT-KVM용 rhel-8-server-nfv-rpms 리포지토리를 활성화하고 시스템이 최신 상태인지 확인하는 방법에 대한 자세한 내용은 다음을 참조하십시오. 언더클라우드 등록 및 업데이트.

참고

이 리포지토리에 액세스하려면 별도의 Red Hat OpenStack Platform for Real Time SKU 서브스크립션이 필요합니다.

실시간 이미지 빌드

  1. 언더클라우드에 libguestfs-tools 패키지를 설치하여 virt-customize 툴을 가져옵니다.

    (undercloud) [stack@undercloud-0 ~]$ sudo dnf install libguestfs-tools
    중요

    언더클라우드에 libguestfs-tools 패키지를 설치하는 경우 iscsid.socket 을 비활성화하여 언더클라우드의 tripleo_iscsid 서비스와 포트 충돌을 방지합니다.

    $ sudo systemctl disable --now iscsid.socket
  2. 이미지를 추출합니다.

    (undercloud) [stack@undercloud-0 ~]$ tar -xf /usr/share/rhosp-director-images/overcloud-full.tar
    (undercloud) [stack@undercloud-0 ~]$ tar -xf /usr/share/rhosp-director-images/ironic-python-agent.tar
  3. 기본 이미지를 복사합니다.

    (undercloud) [stack@undercloud-0 ~]$ cp overcloud-full.qcow2 overcloud-realtime-compute.qcow2
  4. 이미지를 등록하여 사용자 지정과 관련된 Red Hat 리포지토리를 활성화합니다. [username][password] 를 다음 예에서 유효한 자격 증명으로 바꿉니다.

    virt-customize -a overcloud-realtime-compute.qcow2 --run-command \
    'subscription-manager register --username=[username] --password=[password]' \
    subscription-manager release --set 8.2
    참고

    보안을 위해 명령 프롬프트에서 사용되는 경우 기록 파일에서 자격 증명을 제거할 수 있습니다. history -d 명령 다음에 행 번호를 사용하여 기록에서 개별 행을 삭제할 수 있습니다.

  5. 계정 서브스크립션에서 풀 ID 목록을 찾아 해당 풀 ID를 이미지에 연결합니다.

    sudo subscription-manager list --all --available | less
    ...
    virt-customize -a overcloud-realtime-compute.qcow2 --run-command \
    'subscription-manager attach --pool [pool-ID]'
  6. NFV를 사용하여 Red Hat OpenStack Platform에 필요한 리포지토리를 추가합니다.

    virt-customize -a overcloud-realtime-compute.qcow2 --run-command \
    'sudo subscription-manager repos --enable=rhel-8-for-x86_64-baseos-eus-rpms \
    --enable=rhel-8-for-x86_64-appstream-eus-rpms \
    --enable=rhel-8-for-x86_64-highavailability-eus-rpms \
    --enable=ansible-2.9-for-rhel-8-x86_64-rpms \
    --enable=openstack-16.1-for-rhel-8-x86_64-rpms \
    --enable=rhel-8-for-x86_64-nfv-rpms \
    --enable=advanced-virt-for-rhel-8-x86_64-rpms \
    --enable=fast-datapath-for-rhel-8-x86_64-rpms'
  7. 스크립트를 생성하여 이미지에 실시간 기능을 구성합니다.

    (undercloud) [stack@undercloud-0 ~]$ cat <<'EOF' > rt.sh
      #!/bin/bash
    
      set -eux
    
      dnf -v -y --setopt=protected_packages= erase kernel.$(uname -m)
      dnf -v -y install kernel-rt kernel-rt-kvm tuned-profiles-nfv-host
      grubby --set-default /boot/vmlinuz*rt*
      EOF
  8. 스크립트를 실행하여 실시간 이미지를 구성합니다.

    (undercloud) [stack@undercloud-0 ~]$ virt-customize -a overcloud-realtime-compute.qcow2 -v --run rt.sh 2>&1 | tee virt-customize.log
    참고

    rt.sh 스크립트 출력에 다음 줄, "grubby fatal error: cannot find a suitable template" 이라는 줄이 표시되면 이 오류를 무시할 수 있습니다.

  9. 이전 명령에서 가져온 virt-customize.log 파일을 검사하여 rt.sh 스크립트를 사용하여 패키지가 올바르게 설치되었는지 확인합니다.

    (undercloud) [stack@undercloud-0 ~]$ cat virt-customize.log | grep Verifying
    
      Verifying  : kernel-3.10.0-957.el7.x86_64                                 1/1
      Verifying  : 10:qemu-kvm-tools-rhev-2.12.0-18.el7_6.1.x86_64              1/8
      Verifying  : tuned-profiles-realtime-2.10.0-6.el7_6.3.noarch              2/8
      Verifying  : linux-firmware-20180911-69.git85c5d90.el7.noarch             3/8
      Verifying  : tuned-profiles-nfv-host-2.10.0-6.el7_6.3.noarch              4/8
      Verifying  : kernel-rt-kvm-3.10.0-957.10.1.rt56.921.el7.x86_64            5/8
      Verifying  : tuna-0.13-6.el7.noarch                                       6/8
      Verifying  : kernel-rt-3.10.0-957.10.1.rt56.921.el7.x86_64                7/8
      Verifying  : rt-setup-2.0-6.el7.x86_64                                    8/8
  10. SELinux 레이블을 다시 지정합니다.

    (undercloud) [stack@undercloud-0 ~]$ virt-customize -a overcloud-realtime-compute.qcow2 --selinux-relabel
  11. vmlinuz 및 initrd를 추출합니다.

    (undercloud) [stack@undercloud-0 ~]$ mkdir image
    (undercloud) [stack@undercloud-0 ~]$ guestmount -a overcloud-realtime-compute.qcow2 -i --ro image
    (undercloud) [stack@undercloud-0 ~]$ cp image/boot/vmlinuz-3.10.0-862.rt56.804.el7.x86_64 ./overcloud-realtime-compute.vmlinuz
    (undercloud) [stack@undercloud-0 ~]$ cp image/boot/initramfs-3.10.0-862.rt56.804.el7.x86_64.img ./overcloud-realtime-compute.initrd
    (undercloud) [stack@undercloud-0 ~]$ guestunmount image
    참고

    vmlinuzinitramfs 파일 이름의 소프트웨어 버전은 커널 버전에 따라 다릅니다.

  12. 이미지를 업로드합니다.

    (undercloud) [stack@undercloud-0 ~]$ openstack overcloud image upload --update-existing --os-image-name overcloud-realtime-compute.qcow2

이제 선택한 컴퓨팅 노드에서 ComputeOvsDpdkRT 구성 가능 역할과 함께 사용할 수 있는 실시간 이미지가 있습니다.

RT-KVM 컴퓨팅 노드에서 BIOS 설정 수정

RT-KVM 컴퓨팅 노드의 대기 시간을 줄이려면 컴퓨팅 노드 BIOS 설정에서 다음 매개변수의 모든 옵션을 비활성화합니다.

  • 전원 관리
  • 하이퍼-스레딩
  • CPU 절전 상태
  • 논리 프로세서

이러한 설정에 대한 설명 및 비활성화에 미치는 영향은 BIOS 매개 변수 설정을 참조하십시오. BIOS 설정을 변경하는 방법에 대한 자세한 내용은 하드웨어 제조업체 설명서를 참조하십시오.

9.2.2. RT-KVM을 사용하여 OVS-DPDK 구성

참고

OVS-DPDK에 대해 OpenStack 네트워크를 최적화하려면 network-environment.yaml 파일에 설정한 OVS- DPDK 매개변수에 가장 적합한 값을 결정해야 합니다. 자세한 내용은 8.1절. “워크플로우를 사용하여 DPDK 매개변수 비활성화” 의 내용을 참조하십시오.

9.2.2.1. ComputeOvsDpdk 구성 가능 역할 생성

ComputeOvsDpdkRT 역할을 사용하여 실시간 컴퓨팅 이미지의 Compute 노드를 지정합니다.

ComputeOvsDpdkRT 역할에 대한 roles_data.yaml 을 생성합니다.

# (undercloud) [stack@undercloud-0 ~]$ openstack overcloud roles generate -o roles_data.yaml Controller ComputeOvsDpdkRT

9.2.2.2. OVS-DPDK 매개변수 구성

중요

배포를 최적화하기 위해 network- environment.yaml 파일에서 OVS- DPDK 매개 변수에 가장 적합한 값을 확인합니다. 자세한 내용은 8.1절. “워크플로우를 사용하여 DPDK 매개변수 비활성화”의 내용을 참조하십시오.

  1. resource_registry 에서 사용하는 OVS-DPDK 역할에 대한 NIC 구성을 추가합니다.

    resource_registry:
      # Specify the relative/absolute path to the config files you want to use for override the default.
      OS::TripleO::ComputeOvsDpdkRT::Net::SoftwareConfig: nic-configs/compute-ovs-dpdk.yaml
      OS::TripleO::Controller::Net::SoftwareConfig: nic-configs/controller.yaml
  2. parameter_defaults 에서 OVS-DPDK 및 RT-KVM 매개변수를 설정합니다.

      # DPDK compute node.
      ComputeOvsDpdkRTParameters:
        KernelArgs: "default_hugepagesz=1GB hugepagesz=1G hugepages=32 iommu=pt intel_iommu=on isolcpus=1-7,17-23,9-15,25-31"
        TunedProfileName: "realtime-virtual-host"
        IsolCpusList: "1,2,3,4,5,6,7,9,10,17,18,19,20,21,22,23,11,12,13,14,15,25,26,27,28,29,30,31"
        NovaComputeCpuDedicatedSet: ['2,3,4,5,6,7,18,19,20,21,22,23,10,11,12,13,14,15,26,27,28,29,30,31']
        NovaReservedHostMemory: 4096
        OvsDpdkSocketMemory: "1024,1024"
        OvsDpdkMemoryChannels: "4"
        OvsPmdCoreList: "1,17,9,25"
        VhostuserSocketGroup: "hugetlbfs"
      ComputeOvsDpdkRTImage: "overcloud-realtime-compute"

9.2.2.3. 오버클라우드 배포

ML2-OVS의 오버클라우드를 배포합니다.

(undercloud) [stack@undercloud-0 ~]$ openstack overcloud deploy \
--templates \
-r /home/stack/ospd-16-vlan-dpdk-ctlplane-bonding-rt/roles_data.yaml \
-e /usr/share/openstack-tripleo-heat-templates/environments/network-isolation.yaml \
-e /usr/share/openstack-tripleo-heat-templates/environments/services/neutron-ovs.yaml \
-e /usr/share/openstack-tripleo-heat-templates/environments/services/neutron-ovs-dpdk.yaml \
-e /home/stack/ospd-16-vxlan-dpdk-data-bonding-rt-hybrid/containers-prepare-parameter.yaml \
-e /home/stack/ospd-16-vxlan-dpdk-data-bonding-rt-hybrid/network-environment.yaml

9.2.3. RT-KVM 인스턴스 시작

실시간 활성화된 컴퓨팅 노드에서 RT-KVM 인스턴스를 시작하려면 다음 단계를 수행합니다.

  1. 오버클라우드에 RT-KVM 플레이버를 생성합니다.

    # openstack flavor create  r1.small 99 4096 20 4
    # openstack flavor set --property hw:cpu_policy=dedicated 99
    # openstack flavor set --property hw:cpu_realtime=yes 99
    # openstack flavor set --property hw:mem_page_size=1GB 99
    # openstack flavor set --property hw:cpu_realtime_mask="^0-1" 99
    # openstack flavor set --property hw:cpu_emulator_threads=isolate 99
  2. RT-KVM 인스턴스를 시작합니다.

    # openstack server create  --image <rhel> --flavor r1.small --nic net-id=<dpdk-net> test-rt
  3. 인스턴스에서 할당된 에뮬레이터 스레드를 사용하는지 확인하려면 다음 명령을 실행합니다.

    # virsh dumpxml <instance-id> | grep vcpu -A1
    <vcpu placement='static'>4</vcpu>
    <cputune>
      <vcpupin vcpu='0' cpuset='1'/>
      <vcpupin vcpu='1' cpuset='3'/>
      <vcpupin vcpu='2' cpuset='5'/>
      <vcpupin vcpu='3' cpuset='7'/>
      <emulatorpin cpuset='0-1'/>
      <vcpusched vcpus='2-3' scheduler='fifo'
      priority='1'/>
    </cputune>