Red Hat Training

A Red Hat training course is available for Red Hat OpenStack Platform

Open Virtual Network를 통한 네트워킹

Red Hat OpenStack Platform 13

OVN을 사용하는 OpenStack Networking

OpenStack Documentation Team

초록

OpenStack 네트워킹 작업에 OVN 사용 방법을 설명합니다.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 용어를 교체하기 위해 최선을 다하고 있습니다. 먼저 마스터(master), 슬레이브(slave), 블랙리스트(blacklist), 화이트리스트(whitelist) 등 네 가지 용어를 교체하고 있습니다. 이러한 변경 작업은 작업 범위가 크므로 향후 여러 릴리스에 걸쳐 점차 구현할 예정입니다. 자세한 내용은 CTO Chris Wright의 메시지를 참조하십시오.

1장. OVN(Open Virtual Network)

OVN(Open Virtual Network)은 인스턴스에 네트워크 서비스를 제공하는 Open vSwitch 기반 SDN(소프트웨어 정의 네트워킹) 솔루션입니다. OVN은 전체 OpenStack Networking API에 대한 플랫폼 중립 지원을 제공합니다. OVN을 사용하면 게스트 인스턴스 그룹을 프라이빗 L2 및 L3 네트워크에 프로그래밍 방식으로 연결할 수 있습니다. OVN은 다른 Red Hat 플랫폼 및 솔루션으로 확장할 수 있는 가상 네트워킹에 표준 접근법을 사용합니다.

이 RHOSP(Red Hat OpenStack Platform) 릴리스에서는 ML2/OVS 메커니즘 드라이버에서 ML2/OVN 메커니즘 드라이버로 지원되는 마이그레이션을 제공하지 않습니다. 이 RHOSP 릴리스에서는 OpenStack 커뮤니티 마이그레이션 전략을 지원하지 않습니다. 향후 RHOSP 릴리스에 대한 마이그레이션 지원이 계획되어 있습니다.

참고

필요한 최소 OVS 버전은 OVS 2.9입니다.

이 섹션에서는 director를 사용하여 OVN을 배포하는 데 필요한 단계를 설명합니다.

참고

OVN은 DVR(분산 가상 라우팅)이 있는 컨트롤러 노드가 3개 이상 있는 RHOSP HA(고가용성) 환경에서만 지원됩니다.

1.1. RHOSP OVN 아키텍처의 구성 요소 목록

RHOSP OVN 아키텍처는 네트워킹 API를 지원하기 위해 OVS Modular Layer 2(ML2) 메커니즘 드라이버를 OVN ML2 메커니즘 드라이버로 교체합니다. OVN은 Red Hat OpenStack 플랫폼을 위한 네트워킹 서비스를 제공합니다.

OVN 아키텍처는 다음 구성 요소 및 서비스로 구성됩니다.

OVN 메커니즘 드라이버를 사용하는 ML2 플러그인
ML2 플러그인은 OpenStack별 네트워킹 구성을 플랫폼 중립 OVN 논리 네트워킹 구성으로 변환합니다. 일반적으로 컨트롤러 노드에서 실행됩니다.
OVN Northbound(NB) 데이터베이스(ovn-nb)
이 데이터베이스는 OVN ML2 플러그인의 논리적 OVN 네트워킹 구성을 저장합니다. 일반적으로 컨트롤러 노드에서 실행되며 TCP 포트 6641 에서 수신 대기합니다.
OVN Northbound 서비스(ovn-northd)
이 서비스는 논리적 네트워킹 구성을 OVN NB 데이터베이스에서 논리 데이터 경로 흐름으로 변환하고 OVN Southbound 데이터베이스에서 이러한 구성을 채웁니다. 일반적으로 컨트롤러 노드에서 실행됩니다.
OVN Southbound(SB) 데이터베이스(ovn-sb)
이 데이터베이스는 변환된 논리 데이터 경로 흐름을 저장합니다. 일반적으로 컨트롤러 노드에서 실행되며 TCP 포트 6642 에서 수신 대기합니다.
OVN 컨트롤러(ovn-controller)
이 컨트롤러는 OVN SB 데이터베이스에 연결하고, Open vSwitch 컨트롤러 역할을 하여 네트워크 트래픽을 제어 및 모니터링합니다. OS::Tripleo::Services::OVNController 가 정의된 모든 컴퓨팅 및 게이트웨이 노드에서 실행됩니다.
OVN 메타데이터 에이전트(ovn-metadata-agent)
이 에이전트는 메타데이터 API 요청을 프록시하는 데 사용되는 OVS 인터페이스, 네트워크 네임스페이스 및 HAProxy 프로세스를 관리하기 위한 haproxy 인스턴스를 생성합니다. 이 에이전트는 OS::TripleO::Services::OVNMetadataAgent 가 정의된 모든 컴퓨팅 및 게이트웨이 노드에서 실행됩니다.
OVSDB(OVSDB)
OVN Northbound 및 Southbound 데이터베이스를 호스팅합니다. 또한 ovs-vswitchd 와 상호 작용하여 OVS 데이터베이스 conf.db 를 호스트합니다.
참고

NB 데이터베이스의 스키마 파일은 /usr/share/ovn/ovn-nb.ovsschema 에 있으며 SB 데이터베이스 스키마 파일은 /usr/share/ovn/ovn-sb.ovsschema 에 있습니다.

OVN 구성 요소

2장. OVN 배포 계획

컨트롤러 노드가 세 개 이상인 고가용성 RHOSP HA(고가용성) 환경에만 OVN을 배포합니다. DVR(분산 가상 라우팅)이 활성화된 OVN을 배포합니다.

DVR은 기본적으로 새로운 ML2/OVN 배포에서 활성화되어 있으며 새로운 ML2/OVS 배포에서 기본적으로 비활성화되어 있습니다. neutron-ovn-dvr-ha.yaml 환경 파일은 HA 환경에서 OVN을 사용하여 배포에 필요한 DVR별 매개변수를 구성합니다.

참고

OVN을 사용하려면 director 배포에서 VXLAN이 아닌 GRE(Generic Network Virtualization Encapsulation)를 사용해야 합니다. Geneve를 사용하면 OVN에서 24-bit Virtual Network Identifier(VNI) 필드를 사용하여 네트워크를 식별하고 추가 32비트 유형 길이 값(TLV)을 사용하여 소스 및 대상 논리 포트를 모두 지정할 수 있습니다. MTU 설정을 결정할 때 더 큰 프로토콜 헤더를 고려해야 합니다.

2.1. 컴퓨팅 노드의 ovn-controller 서비스

ovn-controller 서비스는 각 컴퓨팅 노드에서 실행되며 OVN southbound(SB) 데이터베이스 서버에 연결하여 논리 흐름을 검색합니다. ovn-controller 는 이러한 논리 흐름을 물리적 OpenFlow 흐름으로 변환하고 OVS 브리지(br-int)에 흐름을 추가합니다. ovs-vswitchd 와 통신하고 OpenFlow 흐름을 설치하기 위해 ovn-controllerovn-controller 가 시작될 때 전달된 UNIX 소켓 경로를 사용하여 로컬 ovsdb-server (호스트 conf.db)에 연결합니다(예: unix:/var/run/openvswitch/db.sock).

ovn-controller 서비스에는 Open_vSwitch 테이블의 external_ids 열에 특정 키-값 쌍이 필요합니다. puppet-ovnpuppet-vswitch 를 사용하여 이러한 필드를 채웁니다. 다음 예에서는 external_ids 열에서 puppet-vswitch 가 구성하는 키-값 쌍을 보여줍니다.

hostname=<HOST NAME>
ovn-encap-ip=<IP OF THE NODE>
ovn-encap-type=geneve
ovn-remote=tcp:OVN_DBS_VIP:6642

2.2. OVN 구성 가능 서비스

Red Hat OpenStack Platform은 일반적으로 컨트롤러 역할의 노드, 컴퓨팅 역할 및 다양한 스토리지 역할 유형과 같은 사전 정의된 역할로 노드로 구성됩니다. 이러한 각 기본 역할에는 코어 heat 템플릿 컬렉션에 정의된 일련의 서비스가 포함되어 있습니다.

기본 RHOSP ML2/OVN 배포에서 ML2/OVNable 서비스는 컨트롤러 노드에서 실행됩니다. 선택적으로 사용자 지정 Networker 역할을 생성하고 전용 Networker 노드에서 OVN 구성 가능 서비스를 실행할 수 있습니다.

OVN 구성 가능 서비스 ovn-dbs -bundle은 ovn-dbs-bundle이라는 컨테이너에 배포됩니다. 기본 설치 ovn-dbs 는 컨트롤러 역할에 포함되어 있으며 컨트롤러 노드에서 실행됩니다. 서비스는 구성 가능하므로 Networker 역할과 같은 다른 역할에 할당할 수 있습니다.

OVN 구성 가능 서비스를 다른 역할에 할당하는 경우 서비스가 pacemaker 서비스와 동일한 노드에 배치되어 OVN 데이터베이스 컨테이너를 제어하는지 확인합니다.

2.3. ML2/OVN으로 사용자 정의 역할 배포

기본 RHOSP ML2/OVN 배포에서 ML2/OVNable 서비스는 컨트롤러 노드에서 실행됩니다. 전용 네트워크 노드에서 OVN 구성 가능 서비스를 실행하는 Networker와 같은 지원되는 사용자 지정 역할을 선택적으로 사용할 수 있습니다.

사용자 지정 역할을 생성할 수도 있습니다.

사전 요구 사항

절차

  1. 언더클라우드 호스트에 stack 사용자로 로그인하고 stackrc 파일을 가져옵니다.

    $ source stackrc
  2. 배포에 적합한 사용자 지정 역할 파일을 선택합니다. 예를 들어 Networker 역할의 경우 Networker.yaml 을 선택합니다. 필요에 따라 배포 명령에서 직접 사용합니다. 또는 다른 사용자 지정 역할 파일을 결합하는 고유한 사용자 지정 역할 파일을 생성할 수 있습니다.
  3. [선택 사항] 이러한 사용자 지정 역할 파일 중 하나를 다른 사용자 지정 역할 파일과 결합하는 새 사용자 지정 역할 데이터 파일을 생성합니다. roles_data 파일 생성 의 지침을 따릅니다. 배포에 따라 적절한 소스 역할 파일을 포함합니다.
  4. [선택 사항] 역할의 특정 노드를 식별하려면 특정 하드웨어 플레이버를 생성하고 특정 노드에 플레이버를 할당할 수 있습니다. 그런 다음 환경 파일을 사용하여 역할에 대한 플레이버를 정의하고 노드 개수를 지정합니다. 자세한 내용은 새 역할 생성 예제를 참조하십시오.
  5. 배포에 적합한 환경 파일을 만듭니다. 예를 들어 Networker 역할의 경우 neutron-ovn-dvr-ha.yaml 이라는 파일을 생성합니다.
  6. 배포에 적합한 다음 설정을 포함합니다. 예를 들어 Networker 역할의 경우 다음 설정을 포함합니다.

    ControllerParameters:
        OVNCMSOptions: ""
    ControllerSriovParameters:
            OVNCMSOptions: ""
    NetworkerParameters:
        OVNCMSOptions: "enable-chassis-as-gw"
  7. 오버클라우드를 배포합니다. -e 옵션을 사용하여 배포 명령에 환경 파일을 포함합니다. 배포 명령에 -r 옵션을 사용하여 사용자 지정 역할 데이터 파일을 포함합니다. 예: ''-r Networker.yaml' 또는 '-r mycustomrolesfile.yaml'입니다.

검증 단계

  1. ovn_metadata_agent가 컨트롤러 및 네트워크 노드에서 실행 중인지 확인합니다.

    [heat-admin@controller-0 ~]$ sudo docker ps | grep ovn_metadata

    출력은 다음 예와 유사합니다.

    a65125d9588d  undercloud-0.ctlplane.localdomain:8787/rh-osbs/rhosp13-openstack-neutron-metadata-agent-ovn:13.1_20200813.1  kolla_start           23 hours ago  Up 21 hours ago         ovn_metadata_agent
  2. OVN 서비스 또는 전용 Networker 노드를 사용하는 컨트롤러 노드가 OVS의 게이트웨이로 구성되었는지 확인합니다.

    [heat-admin@controller-0 ~]$ sudo ovs-vsctl get Open_Vswitch .
    ...OS::TripleO::Services::NeutronDhcpAgent: OS::Heat::None

    출력은 다음 예와 유사합니다.

    external_ids:ovn-cms-options
        enable-chassis-as-gw

추가 리소스

2.4. Pacemaker 및 DVR을 통한 고가용성

기본 프로필인 ovn-dbs -container 및 pacemaker 고가용성(HA) 프로필인 ovn-dbs-container-puppet 중 하나를 선택할 수 있습니다.

pacemaker HA 프로필이 활성화된 상태에서 ovsdb-server 는 pacemaker 및 리소스 에이전트 Open Cluster Framework(OCF) 스크립트에서 관리하는 마스터-슬레이브 모드로 실행됩니다. OVN 데이터베이스 서버는 모든 컨트롤러에서 시작하고 pacemaker 에서 마스터 역할에 제공할 컨트롤러 1개를 선택합니다. master 모드에서 실행되는 ovsdb-server 인스턴스는 데이터베이스에 쓸 수 있지만 다른 모든 slave ovsdb-server 서비스는 마스터에서 데이터베이스를 로컬로 복제하고 데이터베이스에 쓸 수 없습니다.

이 프로필의 YAML 파일은 tripleo-heat-templates/environments/services-docker/neutron-ovn-dvr-ha.yaml 파일입니다. 활성화된 경우 OVN 데이터베이스 서버는 Pacemaker에서 관리하며 puppet-tripleoovn:ovndb-servers 라는 Pacemaker OCF 리소스를 생성합니다.

OVN 데이터베이스 서버는 각 컨트롤러 노드에서 시작되며 가상 IP 주소(OVN_DBS_VIP)를 소유하는 컨트롤러에서 마스터 모드에서 OVN DB 서버를 실행합니다. OVN ML2 메커니즘 드라이버 및 ovn-controllerOVN_DBS_VIP 값을 사용하여 데이터베이스 서버에 연결합니다. 장애 조치(failover)가 발생하면 Pacemaker에서 가상 IP 주소(OVN_DBS_VIP)를 다른 컨트롤러로 이동하고 해당 노드에서 실행되는 OVN 데이터베이스 서버를 마스터 로 승격합니다.

2.5. OVN을 사용한 계층 3 고가용성

OVN은 특별한 구성 없이 계층 3의 고가용성(L3 HA)을 지원합니다. OVN은 지정된 외부 네트워크에서 L3 게이트웨이로 작동할 수 있는 사용 가능한 모든 게이트웨이 노드에 라우터 포트를 자동으로 예약합니다. OVN L3 HA는 OVN Logical_Router_Port 테이블의 gateway_chassis 열을 사용합니다. 대부분의 기능은 active_passive 출력이 번들된 OpenFlow 규칙에 의해 관리됩니다. ovn-controller 는 ARP(Address Resolution Protocol) 응답 및 라우터 사용 및 비활성화를 처리합니다. FIP 및 라우터 외부 주소에 대한 gratuitous ARPs는 ovn-controller 에서 주기적으로 전송합니다.

참고

L3HA는 OVN을 사용하여 라우터를 원래 게이트웨이 노드로 다시 분산시켜 노드가 병목 현상이 되지 않도록 합니다.

BFD 모니터링

OVN은 양방향 전달 탐지(BFD) 프로토콜을 사용하여 게이트웨이 노드의 가용성을 모니터링합니다. 이 프로토콜은 노드에서 노드로 설정된 Geneve 터널 상단에 캡슐화됩니다.

각 게이트웨이 노드는 배포의 별 토폴로지에 있는 다른 모든 게이트웨이 노드를 모니터링합니다. 또한 게이트웨이 노드는 계산 노드를 모니터링하여 게이트웨이가 패킷 및 ARP 응답 및 알림의 라우팅을 활성화 및 비활성화합니다.

각 계산 노드는 BFD를 사용하여 각 게이트웨이 노드를 모니터링하고 지정된 라우터의 활성 게이트웨이 노드를 통해 소스 및 대상 네트워크 주소 변환(SNAT 및 DNAT)과 같은 외부 트래픽을 자동으로 시작합니다. 컴퓨팅 노드는 다른 compute 노드를 모니터링할 필요가 없습니다.

참고

ML2-OVS 구성에서 발생하는 외부 네트워크 오류는 탐지되지 않습니다.

OVN의 L3 HA는 다음과 같은 오류 모드를 지원합니다.

  • 게이트웨이 노드는 네트워크에서 연결이 끊어집니다(터널 인터페이스).
  • OVS-vswitchd 중지 (ovs-switchd 는 BFD 신호링 담당)
  • OVN-controller 가 중지(ovn-controller 가 등록된 노드로 제거됨).
참고

이 BFD 모니터링 메커니즘은 링크 실패에서만 작동하며 라우팅 실패에는 적합하지 않습니다.

3장. director를 사용하여 OVN 배포

Red Hat OpenStack Platform에 OVN을 배포할 때 다음 이벤트가 트리거됩니다.

  1. OVN ML2 플러그인을 활성화하고 필요한 구성 옵션을 생성합니다.
  2. OVN 데이터베이스 및 ovn-northd 서비스를 컨트롤러 노드에 배포합니다.
  3. 각 컴퓨팅 노드에 ovn-controller 를 배포합니다.
  4. 각 컴퓨팅 노드에 neutron-ovn-metadata-agent 를 배포합니다.

3.1. DVR을 사용하여 ML2/OVN 배포

ML2/OVN 배포에서 DVR(분산 가상 라우팅)을 배포하고 관리하려면 heat 템플릿 및 환경 파일에서 설정을 구성합니다.

참고

이 가이드의 이 절차에서는 HA 환경에서 기본 DVR을 사용하여 OVN을 배포합니다.

기본 설정은 지침으로만 제공됩니다. 네트워크 격리, 전용 NIC 또는 기타 여러 변수 요인에 대한 사용자 지정이 필요할 수 있는 프로덕션 또는 테스트 환경에서는 작동하지 않습니다.

다음 예제 절차에서는 일반적인 기본값을 사용하여 ML2/OVN, HA, DVR의 개념 증명 배포를 구성하는 방법을 보여줍니다.

절차

  1. environments/services/neutron-ovn-dvr-ha.yaml 파일의 OS::TripleO::Compute::Net::SoftwareConfig 값이 사용 중인 OS::TripleO::Controller::SoftwareConfig 값과 동일한지 확인합니다. 일반적으로 환경 /net-multiple-nics.yaml 파일과 같이 오버클라우드를 배포하는 데 사용하는 네트워크 환경 파일에서 확인할 수 있습니다. 이렇게 하면 컴퓨팅 노드에 적절한 외부 네트워크 브리지가 생성됩니다.

    참고

    컴퓨팅 노드의 네트워크 구성을 사용자 지정하는 경우 사용자 지정 파일에 적절한 구성을 추가해야 할 수 있습니다.

  2. 오버클라우드를 배포할 때 환경/서비스/neutron-ovn-dvr-ha.yaml 을 환경 파일로 포함합니다. 예를 들면 다음과 같습니다.

    $ openstack overcloud deploy \
        --templates /usr/share/openstack-tripleo-heat-templates \
        ...
     -e /usr/share/openstack-tripleo-heat-templates/environments/services/neutron-ovn-dvr-ha.yaml
  3. roles_data.yaml 의 Compute 및 Controller 역할에 external_bridge 태그가 포함되어 있고 외부 네트워크 항목이 컴퓨팅 노드에 추가되었는지 확인합니다. 예를 들면 다음과 같습니다.

    - name: Compute
      description: |
        Basic Compute Node role
      CountDefault: 1
      # Create external Neutron bridge (unset if using ML2/OVS without DVR)
      tags:
        - external_bridge
      networks:
        External:
          subnet: external_subnet
    ...
    - name: Controller
      description: |
        Controller role that has all the controller services loaded and handles
        Database, Messaging and Network functions.
      CountDefault: 1
      tags:
        - primary
        - controller
        - external_bridge

3.2. 컴퓨팅 노드에 OVN 메타데이터 에이전트 배포

OVN 메타데이터 에이전트는 tripleo-heat-templates/docker/services/ovn-metadata.yaml 파일에 구성되며 OS::TripleO::Services::OVNMetadataAgent 를 통해 기본 Compute 역할에 포함됩니다. 따라서 기본 매개변수가 있는 OVN 메타데이터 에이전트는 OVN 배포의 일부로 배포됩니다. 3장. director를 사용하여 OVN 배포 을 참조하십시오.

OpenStack 게스트 인스턴스는 링크-로컬 IP 주소: 169.254.169.254에서 사용할 수 있는 네트워킹 메타데이터 서비스에 액세스합니다. neutron-ovn-metadata-agent 는 Compute 메타데이터 API가 존재하는 호스트 네트워크에 액세스할 수 있습니다. 각 HAProxy는 적절한 호스트 네트워크에 연결할 수 없는 네트워크 네임스페이스에 있습니다. HAProxy는 메타데이터 API 요청에 필요한 헤더를 추가한 다음 UNIX 도메인 소켓을 통해 요청을 neutron-ovn-metadata-agent 에 전달합니다.

OVN 네트워킹 서비스는 메타데이터 서비스를 활성화하는 각 가상 네트워크에 대해 고유한 네트워크 네임스페이스를 생성합니다. 컴퓨팅 노드의 인스턴스에서 액세스하는 각 네트워크에는 해당 메타데이터 네임스페이스(ovnmeta-<net_uuid>)가 있습니다.

3.2.1. 메타데이터 문제 해결

메타데이터 네임스페이스를 사용하여 컴퓨팅 노드의 로컬 인스턴스에 액세스하는 데 문제 해결을 수행할 수 있습니다. 메타데이터 네임스페이스 문제를 해결하려면 컴퓨팅 노드에서 root로 다음 명령을 실행합니다.

# ip netns exec ovnmeta-fd706b96-a591-409e-83be-33caea824114 ssh USER@INSTANCE_IP_ADDRESS

USER@INSTANCE_IP_ADDRESS 는 문제를 해결하려는 로컬 인스턴스의 사용자 이름과 IP 주소입니다.

3.3. OVN을 사용하여 내부 DNS 배포

east-west 트래픽에 대해 로컬 네트워크에서 IP 주소 대신 도메인 이름을 사용하려면 내부 도메인 이름 서비스(DNS)를 사용합니다. 내부 DNS를 사용하면 ovn-controller가 계산 노드에서 로컬로 DNS 쿼리에 응답합니다. 내부 DNS는 인스턴스의 /etc/resolv.conf 파일에 지정된 모든 사용자 지정 DNS 서버를 재정의합니다. 내부 DNS를 배포하면 인스턴스의 DNS 쿼리는 사용자 지정 DNS 서버 대신 ovn-controller에서 처리합니다.

절차

  1. NeutronPluginExtensions 매개변수를 사용하여 DNS를 활성화합니다.

    parameter_defaults:
      NeutronPluginExtensions: "dns"
  2. 오버클라우드를 배포하기 전에 DNS 도메인을 설정합니다.

      NeutronDnsDomain: "mydns-example.org"
  3. 오버클라우드를 배포합니다.

    $ openstack overcloud deploy \
        --templates /usr/share/openstack-tripleo-heat-templates \
        ...
     -e /usr/share/openstack-tripleo-heat-templates/environments/services-docker/neutron-ovn-dvr-ha.yaml

4장. OVN 모니터링

ovn-trace 명령을 사용하여 OVN 논리 흐름을 모니터링하고 문제를 해결할 수 있으며 ovs-ofctl dump-flows 명령을 사용하여 OpenFlow를 모니터링하고 문제를 해결할 수 있습니다.

4.1. OVN 문제 해결 명령에 대한 별칭 생성

OVN 데이터베이스 명령(예: ovn-nbctl show)은 ovn_controller 컨테이너에서 실행됩니다. 컨테이너는 컨트롤러 노드 및 계산 노드에서 실행됩니다. 명령에 대한 액세스를 단순화하려면 별칭을 정의하는 스크립트를 생성하고 소싱합니다.

사전 요구 사항

  • ML2/OVN을 메커니즘 드라이버로 사용하여 Red Hat OpenStack Platform 13 배포.

OVN 데이터베이스 명령 별칭 생성 및 사용

  1. ovn 명령을 실행할 오버클라우드 노드의 적절한 디렉터리에 쉘 스크립트 파일을 생성합니다. 예를 들어 controller 노드에 heat-admin으로 로그인하고 heat-admin 사용자의 ~/bin 디렉터리에 ovn-alias.sh 파일을 생성합니다.
  2. 스크립트 파일에 다음 명령을 저장합니다.

    EXTERNAL_ID=\
    $(sudo ovs-vsctl get open . external_ids:ovn-remote | awk -F: '{print $2}')
    export NBDB=tcp:${EXTERNAL_ID}:6641
    export SBDB=tcp:${EXTERNAL_ID}:6642
    
    alias ovn-sbctl="sudo docker exec ovn_controller ovn-sbctl --db=$SBDB"
    alias ovn-nbctl="sudo docker exec ovn_controller ovn-nbctl --db=$NBDB"
    alias ovn-trace="sudo docker exec ovn_controller ovn-trace --db=$SBDB"
  3. 스크립트 파일을 가져옵니다. 예를 들어 컨트롤러 노드에 heat-admin으로 로그인하고 다음 명령을 실행합니다.

    # source ovn-alias.sh
  4. 별칭의 유효성을 검사합니다. 예를 들어 northbound 데이터베이스를 표시합니다.

    ovn-nbctl show

    출력 예

    switch 26ce22db-1795-41bd-b561-9827cbd81778 (neutron-f8e79863-6c58-43d0-8f7d-8ec4a423e13b) (aka internal_network)
    	port 1913c3ae-8475-4b60-a479-df7bcce8d9c8
        	addresses: ["fa:16:3e:33:c1:fc 192.168.254.76"]
    	port 1aabaee3-b944-4da2-bf0a-573215d3f3d9
        	addresses: ["fa:16:3e:16:cb:ce 192.168.254.74"]
    	port 7e000980-59f9-4a0f-b76a-4fdf4e86f27b
        	type: localport
        	addresses: ["fa:16:3e:c9:30:ed 192.168.254.2"]

4.2. OVN 논리 흐름 모니터링

OVN은 우선 순위, 일치 및 작업이 있는 흐름 테이블인 논리 흐름을 사용합니다. 이러한 논리 흐름은 각 컴퓨팅 노드에서 실행되는 ovn-controller 에 배포됩니다. 컨트롤러 노드에서 ovn-sbctl lflow-list 명령을 사용하여 이 예와 같이 전체 논리 흐름 세트를 볼 수 있습니다.

$ ovn-sbctl --db=tcp:172.17.1.10:6642 lflow-list
    Datapath: "sw0" (d7bf4a7b-e915-4502-8f9d-5995d33f5d10)  Pipeline: ingress
      table=0 (ls_in_port_sec_l2  ), priority=100  , match=(eth.src[40]), action=(drop;)
      table=0 (ls_in_port_sec_l2  ), priority=100  , match=(vlan.present), action=(drop;)
      table=0 (ls_in_port_sec_l2  ), priority=50   , match=(inport == "sw0-port1" && eth.src == {00:00:00:00:00:01}), action=(next;)
      table=0 (ls_in_port_sec_l2  ), priority=50   , match=(inport == "sw0-port2" && eth.src == {00:00:00:00:00:02}), action=(next;)
      table=1 (ls_in_port_sec_ip  ), priority=0    , match=(1), action=(next;)
      table=2 (ls_in_port_sec_nd  ), priority=90   , match=(inport == "sw0-port1" && eth.src == 00:00:00:00:00:01 && arp.sha == 00:00:00:00:00:01), action=(next;)
      table=2 (ls_in_port_sec_nd  ), priority=90   , match=(inport == "sw0-port1" && eth.src == 00:00:00:00:00:01 && ip6 && nd && ((nd.sll == 00:00:00:00:00:00 || nd.sll == 00:00:00:00:00:01) || ((nd.tll == 00:00:00:00:00:00 || nd.tll == 00:00:00:00:00:01)))), action=(next;)
      table=2 (ls_in_port_sec_nd  ), priority=90   , match=(inport == "sw0-port2" && eth.src == 00:00:00:00:00:02 && arp.sha == 00:00:00:00:00:02), action=(next;)
      table=2 (ls_in_port_sec_nd  ), priority=90   , match=(inport == "sw0-port2" && eth.src == 00:00:00:00:00:02 && ip6 && nd && ((nd.sll == 00:00:00:00:00:00 || nd.sll == 00:00:00:00:00:02) || ((nd.tll == 00:00:00:00:00:00 || nd.tll == 00:00:00:00:00:02)))), action=(next;)
      table=2 (ls_in_port_sec_nd  ), priority=80   , match=(inport == "sw0-port1" && (arp || nd)), action=(drop;)
      table=2 (ls_in_port_sec_nd  ), priority=80   , match=(inport == "sw0-port2" && (arp || nd)), action=(drop;)
      table=2 (ls_in_port_sec_nd  ), priority=0    , match=(1), action=(next;)
      table=3 (ls_in_pre_acl      ), priority=0    , match=(1), action=(next;)
      table=4 (ls_in_pre_lb       ), priority=0    , match=(1), action=(next;)
      table=5 (ls_in_pre_stateful ), priority=100  , match=(reg0[0] == 1), action=(ct_next;)
      table=5 (ls_in_pre_stateful ), priority=0    , match=(1), action=(next;)
      table=6 (ls_in_acl          ), priority=0    , match=(1), action=(next;)
      table=7 (ls_in_qos_mark     ), priority=0    , match=(1), action=(next;)
      table=8 (ls_in_lb           ), priority=0    , match=(1), action=(next;)
      table=9 (ls_in_stateful     ), priority=100  , match=(reg0[1] == 1), action=(ct_commit(ct_label=0/1); next;)
      table=9 (ls_in_stateful     ), priority=100  , match=(reg0[2] == 1), action=(ct_lb;)
      table=9 (ls_in_stateful     ), priority=0    , match=(1), action=(next;)
      table=10(ls_in_arp_rsp      ), priority=0    , match=(1), action=(next;)
      table=11(ls_in_dhcp_options ), priority=0    , match=(1), action=(next;)
      table=12(ls_in_dhcp_response), priority=0    , match=(1), action=(next;)
      table=13(ls_in_l2_lkup      ), priority=100  , match=(eth.mcast), action=(outport = "_MC_flood"; output;)
      table=13(ls_in_l2_lkup      ), priority=50   , match=(eth.dst == 00:00:00:00:00:01), action=(outport = "sw0-port1"; output;)
      table=13(ls_in_l2_lkup      ), priority=50   , match=(eth.dst == 00:00:00:00:00:02), action=(outport = "sw0-port2"; output;)
    Datapath: "sw0" (d7bf4a7b-e915-4502-8f9d-5995d33f5d10)  Pipeline: egress
      table=0 (ls_out_pre_lb      ), priority=0    , match=(1), action=(next;)
      table=1 (ls_out_pre_acl     ), priority=0    , match=(1), action=(next;)
      table=2 (ls_out_pre_stateful), priority=100  , match=(reg0[0] == 1), action=(ct_next;)
      table=2 (ls_out_pre_stateful), priority=0    , match=(1), action=(next;)
      table=3 (ls_out_lb          ), priority=0    , match=(1), action=(next;)
      table=4 (ls_out_acl         ), priority=0    , match=(1), action=(next;)
      table=5 (ls_out_qos_mark    ), priority=0    , match=(1), action=(next;)
      table=6 (ls_out_stateful    ), priority=100  , match=(reg0[1] == 1), action=(ct_commit(ct_label=0/1); next;)
      table=6 (ls_out_stateful    ), priority=100  , match=(reg0[2] == 1), action=(ct_lb;)
      table=6 (ls_out_stateful    ), priority=0    , match=(1), action=(next;)
      table=7 (ls_out_port_sec_ip ), priority=0    , match=(1), action=(next;)
      table=8 (ls_out_port_sec_l2 ), priority=100  , match=(eth.mcast), action=(output;)
      table=8 (ls_out_port_sec_l2 ), priority=50   , match=(outport == "sw0-port1" && eth.dst == {00:00:00:00:00:01}), action=(output;)
      table=8 (ls_out_port_sec_l2 ), priority=50   , match=(outport == "sw0-port2" && eth.dst == {00:00:00:00:00:02}), action=(output;)

OVN과 OpenFlow의 주요 차이점은 다음과 같습니다.

  • OVN 포트는 단일 스위치의 물리적 포트가 아닌 네트워크에 있는 논리적 엔터티입니다.
  • OVN은 파이프라인의 각 테이블에 해당 번호 외에 이름을 지정합니다. name은 파이프라인에서 해당 단계의 목적을 설명합니다.
  • OVN 일치 구문은 복잡한 부울 식을 지원합니다.
  • OVN 논리 흐름에서 지원되는 작업은 OpenFlow보다 확장됩니다. OVN 논리 흐름 구문에서 DHCP와 같은 상위 수준 기능을 구현할 수 있습니다.

OVN-trace

ovn-trace 명령은 OVN 논리 흐름을 통해 패킷이 이동하는 방법을 시뮬레이션하거나 패킷이 삭제된 이유를 결정하는 데 도움이 될 수 있습니다. 다음 매개변수를 사용하여 ovn-trace 명령을 제공합니다.

DATAPATH
시뮬레이션된 패킷이 시작되는 논리 스위치 또는 논리 라우터입니다.
MICROFLOW
ovn-sb 데이터베이스에서 사용하는 구문의 시뮬레이션된 패킷입니다.

이 예에서는 시뮬레이션된 패킷의 --minimal 출력 옵션을 표시하고 패킷이 대상에 도달했음을 표시합니다.

$ ovn-trace --minimal sw0 'inport == "sw0-port1" && eth.src == 00:00:00:00:00:01 && eth.dst == 00:00:00:00:00:02'
    # reg14=0x1,vlan_tci=0x0000,dl_src=00:00:00:00:00:01,dl_dst=00:00:00:00:00:02,dl_type=0x0000
    output("sw0-port2");

자세한 내용은 이 동일한 시뮬레이션된 패킷의 --summary 출력은 전체 실행 파이프라인을 보여줍니다.

$ ovn-trace --summary sw0 'inport == "sw0-port1" && eth.src == 00:00:00:00:00:01 && eth.dst == 00:00:00:00:00:02'
# reg14=0x1,vlan_tci=0x0000,dl_src=00:00:00:00:00:01,dl_dst=00:00:00:00:00:02,dl_type=0x0000
ingress(dp="sw0", inport="sw0-port1") {
    outport = "sw0-port2";
    output;
    egress(dp="sw0", inport="sw0-port1", outport="sw0-port2") {
        output;
        /* output to "sw0-port2", type "" */;
    };
};

예제 출력에는 다음이 표시됩니다.

  • 패킷은 sw0-port1 포트에서 sw0 네트워크를 입력하고 Ingress 파이프라인을 실행합니다.
  • outport 변수는 이 패킷의 의도한 대상이 sw0-port2 임을 나타내는 sw0-port2 로 설정됩니다.
  • 패킷이 수신 파이프라인의 출력이며, outport 변수가 sw0-port2 로 설정된 상태에서 sw0 의 송신 파이프라인으로 가져옵니다.
  • 출력 작업은 출력 파이프라인에서 실행되며, 이 파이프라인은 패킷을 sw0-port2outport 변수의 현재 값으로 출력합니다.

자세한 내용은 ovn-trace man 페이지를 참조하십시오.

4.3. Monitoring OpenFlows

ovs-ofctl dump-flows 명령을 사용하여 네트워크의 논리 스위치에서 OpenFlow 흐름을 모니터링할 수 있습니다.

$ ovs-ofctl dump-flows br-int
NXST_FLOW reply (xid=0x4):
 cookie=0x0, duration=72.132s, table=0, n_packets=0, n_bytes=0, idle_age=72, priority=10,in_port=1,dl_src=00:00:00:00:00:01 actions=resubmit(,1)
 cookie=0x0, duration=60.565s, table=0, n_packets=0, n_bytes=0, idle_age=60, priority=10,in_port=2,dl_src=00:00:00:00:00:02 actions=resubmit(,1)
 cookie=0x0, duration=28.127s, table=0, n_packets=0, n_bytes=0, idle_age=28, priority=0 actions=drop
 cookie=0x0, duration=13.887s, table=1, n_packets=0, n_bytes=0, idle_age=13, priority=0,in_port=1 actions=output:2
 cookie=0x0, duration=4.023s, table=1, n_packets=0, n_bytes=0, idle_age=4, priority=0,in_port=2 actions=output:1

법적 공지

Copyright © 2023 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.