10.18. 가상 머신 네트워킹


10.18.1. 기본 Pod 네트워크의 가상 머신 구성

masquerade 바인딩 모드를 사용하도록 네트워크 인터페이스를 구성하여 가상 머신을 기본 내부 Pod 네트워크에 연결할 수 있습니다.

참고

기본 Pod 네트워크에 연결된 가상 네트워크 인터페이스 카드(vNIC)의 트래픽은 실시간 마이그레이션 중에 중단됩니다.

10.18.1.1. 명령줄에서 가상 모드 구성

가상 모드를 사용하여 Pod IP 주소를 통해 나가는 가상 머신의 트래픽을 숨길 수 있습니다. 가상 모드에서는 NAT(Network Address Translation)를 사용하여 가상 머신을 Linux 브리지를 통해 Pod 네트워크 백엔드에 연결합니다.

가상 머신 구성 파일을 편집하여 가상 모드를 사용하도록 설정하고 트래픽이 가상 머신에 유입되도록 허용하십시오.

사전 요구 사항

  • 가상 머신은 DHCP를 사용하여 IPv4 주소를 가져오도록 구성해야 합니다. 아래 예제는 DHCP를 사용하도록 구성되어 있습니다.

절차

  1. 가상 머신 구성 파일의 interfaces 스펙을 편집합니다.

    kind: VirtualMachine
    spec:
      domain:
        devices:
          interfaces:
            - name: default
              masquerade: {} 1
              ports: 2
                - port: 80
      networks:
      - name: default
        pod: {}
    1
    가상 모드를 사용하여 연결합니다.
    2
    선택 사항: 가상 머신에서 노출할 포트를 나열하며, 각각 포트 필드에서 지정합니다. 포트 값은 0에서 65536 사이의 숫자여야 합니다. ports 어레이를 사용하지 않으면 유효한 범위의 모든 포트가 들어오는 트래픽에 열려 있습니다. 이 예에서는 포트 80 에서 들어오는 트래픽이 허용됩니다.
    참고

    포트 49152 및 49153은 libvirt 플랫폼에서 사용하도록 예약되며 이러한 포트로 들어오는 다른 모든 트래픽은 삭제됩니다.

  2. 가상 머신을 생성합니다.

    $ oc create -f <vm-name>.yaml

10.18.1.2. 듀얼 스택(IPv4 및 IPv6)을 사용하여 가상 모드 구성

cloud-init를 사용하여 기본 Pod 네트워크에서 IPv6 및 IPv4를 둘 다 사용하도록 새 VM(가상 머신)을 구성할 수 있습니다.

가상 머신 인스턴스 구성의 Network.pod.vmIPv6NetworkCIDR 필드에는 VM의 정적 IPv6 주소와 게이트웨이 IP 주소가 결정됩니다. 이는 virt-launcher Pod에서 IPv6 트래픽을 가상 머신으로 라우팅하는 데 사용되며 외부적으로 사용되지 않습니다. Network.pod.vmIPv6NetworkCIDR 필드는 CIDR(Classless Inter-Domain Routing) 표기법으로 IPv6 주소 블록을 지정합니다. 기본값은 fd10:0:2::2/120 입니다. 네트워크 요구 사항에 따라 이 값을 편집할 수 있습니다.

가상 시스템이 실행 중이면 가상 시스템의 들어오고 나가는 트래픽이 virt-launcher Pod의 IPv4 주소와 고유한 IPv6 주소로 라우팅됩니다. 그런 다음 virt-launcher Pod는 IPv4 트래픽을 가상 시스템의 DHCP 주소로 라우팅하고 IPv6 트래픽을 가상 시스템의 IPv6 주소로 정적으로 설정합니다.

사전 요구 사항

  • OpenShift Container Platform 클러스터는 듀얼 스택용으로 구성된 OVN-Kubernetes CNI(Container Network Interface) 네트워크 플러그인을 사용해야 합니다.

절차

  1. 새 가상 시스템 구성에서 masquerade가 있는 인터페이스를 포함하고 cloud-init를 사용하여 IPv6 주소 및 기본 게이트웨이를 구성합니다.

    apiVersion: kubevirt.io/v1
    kind: VirtualMachine
    metadata:
      name: example-vm-ipv6
    # ...
              interfaces:
                - name: default
                  masquerade: {} 1
                  ports:
                    - port: 80 2
          networks:
          - name: default
            pod: {}
          volumes:
          - cloudInitNoCloud:
              networkData: |
                version: 2
                ethernets:
                  eth0:
                    dhcp4: true
                    addresses: [ fd10:0:2::2/120 ] 3
                    gateway6: fd10:0:2::1 4
    1
    가상 모드를 사용하여 연결합니다.
    2
    포트 80에서 가상 머신으로 들어오는 트래픽을 허용합니다.
    3
    가상 머신 인스턴스 구성의 Network.pod.vmIPv6NetworkCIDR 필드에 의해 결정되는 정적 IPv6 주소입니다. 기본값은 fd10:0:2::2/120 입니다.
    4
    가상 머신 인스턴스 구성의 Network.pod.vmIPv6NetworkCIDR 필드에 따라 결정되는 게이트웨이 IP 주소입니다. 기본값은 fd10:0:2::1 입니다.
  2. 네임스페이스에서 가상 머신을 생성합니다.

    $ oc create -f example-vm-ipv6.yaml

검증

  • IPv6가 구성되었는지 확인하려면 가상 시스템을 시작하고 가상 시스템 인스턴스의 인터페이스 상태를 확인하여 IPv6 주소가 있는지 확인합니다.
$ oc get vmi <vmi-name> -o jsonpath="{.status.interfaces[*].ipAddresses}"

10.18.1.3. 점보 프레임 지원 정보

OVN-Kubernetes CNI 플러그인을 사용하는 경우 기본 Pod 네트워크에 연결된 두 개의 VM(가상 머신) 간에 조각화되지 않은 점보 프레임 패킷을 보낼 수 있습니다. 점보 프레임은 최대 전송 단위(MTU) 값이 1500바이트보다 큽니다.

VM은 다음 방법 중 하나로 클러스터 관리자가 설정한 클러스터 네트워크의 MTU 값을 자동으로 가져옵니다.

  • libvirt: 게스트 OS에 에뮬레이션된 장치에 PCI(Peripheral Component Interconnect) 구성을 통해 들어오는 데이터를 해석할 수 있는 VirtIO 드라이버의 최신 버전이 있는 경우.
  • DHCP: 게스트 DHCP 클라이언트가 DHCP 서버 응답에서 MTU 값을 읽을 수 있는 경우
참고

VirtIO 드라이버가 없는 Windows VM의 경우 netsh 또는 유사한 툴을 사용하여 MTU를 수동으로 설정해야 합니다. 이는 Windows DHCP 클라이언트에서 MTU 값을 읽지 않기 때문입니다.

10.18.2. 가상 머신 노출 서비스 생성

Service 오브젝트를 사용하여 클러스터 내에서 또는 클러스터 외부에 가상 머신을 노출할 수 있습니다.

10.18.2.1. 서비스 정보

Kubernetes 서비스는 클라이언트가 일련의 pod에서 실행되는 애플리케이션에 대한 네트워크 액세스를 노출합니다. 서비스는 추상화, 로드 밸런싱, NodePort 및 LoadBalancer의 경우 외부 환경에 노출을 제공합니다.

웹 콘솔의 VirtualMachine details Details 탭에 서비스를 노출하거나 Service 오브젝트에 spec.type 을 지정하면 됩니다.

ClusterIP
내부 IP 주소의 서비스와 클러스터 내의 다른 애플리케이션에 DNS 이름으로 노출합니다. 단일 서비스는 여러 가상 머신에 매핑할 수 있습니다. 클라이언트가 서비스에 연결을 시도하면 클라이언트의 요청이 사용 가능한 백엔드 간에 부하 분산됩니다. ClusterIP 는 기본 서비스 유형 입니다.
NodePort
클러스터에서 선택한 각 노드의 동일한 포트에 서비스를 노출합니다. NodePort 를 사용하면 클러스터 외부에서 서비스에 액세스할 수 있습니다.
LoadBalancer
현재 클라우드에서 외부 로드 밸런서를 생성하고(지원되는 경우) 고정 외부 IP 주소를 서비스에 할당합니다.
참고

온프레미스 클러스터의 경우 MetalLB Operator를 배포하여 로드 밸런싱 서비스를 구성할 수 있습니다.

10.18.2.1.1. 듀얼 스택 지원

클러스터에 대해 IPv4 및 IPv6 이중 스택 네트워킹을 사용하도록 설정한 경우 Service 개체에 spec.ipFamilyPolicyspec.ipFamilies 필드를 정의하여 IPv4, IPv6 또는 둘 다 사용하는 서비스를 생성할 수 있습니다.

spec.ipFamilyPolicy 필드는 다음 값 중 하나로 설정할 수 있습니다.

SingleStack
컨트롤 플레인은 첫 번째 구성된 서비스 클러스터 IP 범위를 기반으로 서비스에 대한 클러스터 IP 주소를 할당합니다.
PreferDualStack
컨트롤 플레인은 듀얼 스택이 구성된 클러스터에서 서비스에 대해 IPv4 및 IPv6 클러스터 IP 주소를 모두 할당합니다.
RequireDualStack
이 옵션은 듀얼 스택 네트워킹이 활성화되지 않은 클러스터에 실패합니다. 듀얼 스택이 구성된 클러스터의 경우 해당 동작은 값이 PreferDualStack으로 설정된 경우와 동일합니다. 컨트롤 플레인은 IPv4 및 IPv6 주소 범위의 클러스터 IP 주소를 할당합니다.

spec.ipFamilies 필드를 다음 배열 값 중 하나로 설정하여 단일 스택에 사용할 IP 제품군을 정의하거나 이중 스택의 IP 제품군 순서를 정의할 수 있습니다.

  • [IPv4]
  • [IPv6]
  • [IPv4, IPv6]
  • [IPv6, IPv4]

10.18.2.2. 가상 머신을 서비스로 노출

클러스터 내부 또는 외부에서 실행 중인 VM(가상 머신)에 연결할 ClusterIP,NodePort LoadBalancer 서비스를 생성합니다.

절차

  1. VirtualMachine 매니페스트를 편집하여 서비스 생성을 위한 라벨을 추가합니다.

    apiVersion: kubevirt.io/v1
    kind: VirtualMachine
    metadata:
      name: vm-ephemeral
      namespace: example-namespace
    spec:
      running: false
      template:
        metadata:
          labels:
            special: key 1
    # ...
    1
    spec.template.metadata.labels 섹션에 special: key 라벨을 추가합니다.
    참고

    가상 머신의 라벨은 Pod로 전달됩니다. special: key 레이블은 서비스 매니페스트의 spec.selector 특성의 레이블과 일치해야 합니다.

  2. VirtualMachine 매니페스트 파일을 저장하여 변경 사항을 적용합니다.
  3. VM을 노출할 서비스 매니페스트를 생성합니다.

    apiVersion: v1
    kind: Service
    metadata:
      name: vmservice 1
      namespace: example-namespace 2
    spec:
      externalTrafficPolicy: Cluster 3
      ports:
      - nodePort: 30000 4
        port: 27017
        protocol: TCP
        targetPort: 22 5
      selector:
        special: key 6
      type: NodePort 7
    1
    Service 오브젝트의 이름입니다.
    2
    Service 오브젝트가 있는 네임스페이스입니다. 이는 VirtualMachine 매니페스트의 metadata.namespace 필드와 일치해야 합니다.
    3
    선택 사항: 노드에서 외부 IP 주소에서 수신되는 서비스 트래픽을 배포하는 방법을 지정합니다. 이는 NodePortLoadBalancer 서비스 유형에만 적용됩니다. 기본값은 Cluster 로 트래픽을 모든 클러스터 끝점으로 균등하게 라우팅합니다.
    4
    선택 사항: 설정하면 nodePort 값이 모든 서비스에서 고유해야 합니다. 지정하지 않으면 30000 이상의 범위의 값이 동적으로 할당됩니다.
    5
    선택 사항: 서비스에서 노출할 VM 포트입니다. 포트 목록이 VM 매니페스트에 정의된 경우 열려 있는 포트를 참조해야 합니다. targetPort 를 지정하지 않으면 포트 와 동일한 값을 사용합니다.
    6
    VirtualMachine 매니페스트의 spec.template.metadata.labels 스탠자에 추가한 라벨 참조입니다.
    7
    서비스 유형입니다. 가능한 값은 ClusterIP,NodePortLoadBalancer 입니다.
  4. 서비스 매니페스트 파일을 저장합니다.
  5. 다음 명령을 실행하여 서비스를 생성합니다.

    $ oc create -f <service_name>.yaml
  6. VM을 시작합니다. VM이 이미 실행 중인 경우 다시 시작합니다.

검증

  1. Service 오브젝트를 쿼리하여 사용할 수 있는지 확인합니다.

    $ oc get service -n example-namespace

    ClusterIP 서비스의 출력 예

    NAME        TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)     AGE
    vmservice   ClusterIP   172.30.3.149   <none>        27017/TCP   2m

    NodePort 서비스의 출력 예

    NAME        TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)            AGE
    vmservice   NodePort    172.30.232.73   <none>       27017:30000/TCP    5m

    LoadBalancer 서비스의 출력 예

    NAME        TYPE            CLUSTER-IP     EXTERNAL-IP                    PORT(S)           AGE
    vmservice   LoadBalancer    172.30.27.5   172.29.10.235,172.29.10.235     27017:31829/TCP   5s

  2. 가상 머신에 연결하는 적절한 방법을 선택합니다.

    • ClusterIP 서비스의 경우 서비스 IP 주소와 서비스 포트를 사용하여 클러스터 내에서 VM에 연결합니다. 예를 들면 다음과 같습니다.

      $ ssh fedora@172.30.3.149 -p 27017
    • NodePort 서비스의 경우 노드 IP 주소와 클러스터 네트워크 외부의 노드 포트를 지정하여 VM에 연결합니다. 예를 들면 다음과 같습니다.

      $ ssh fedora@$NODE_IP -p 30000
    • LoadBalancer 서비스의 경우 vinagre 클라이언트를 사용하여 공용 IP 주소 및 포트를 사용하여 가상 머신에 연결합니다. 외부 포트는 동적으로 할당됩니다.

10.18.2.3. 추가 리소스

10.18.3. Linux 브리지 네트워크에 가상 머신 연결

기본적으로 OpenShift Virtualization은 하나의 내부 Pod 네트워크로 설치됩니다.

추가 네트워크에 연결하려면 Linux 브리지NAD(네트워크 연결 정의)를 생성해야 합니다.

가상 머신을 추가 네트워크에 연결하려면 다음을 수행합니다.

  1. Linux 브리지 노드 네트워크 구성 정책을 만듭니다.
  2. Linux 브리지 네트워크 연결 정의를 만듭니다.
  3. 가상 머신에서 네트워크 연결 정의를 인식할 수 있도록 가상 머신을 구성합니다.

스케줄링, 인터페이스 유형 및 기타 노드 네트워킹 활동에 대한 자세한 내용은 노드 네트워킹 섹션을 참조하십시오.

10.18.3.1. 네트워크 연결 정의를 통해 네트워크에 연결

10.18.3.1.1. Linux 브리지 노드 네트워크 구성 정책 생성

NodeNetworkConfigurationPolicy 매니페스트 YAML 파일을 사용하여 Linux 브리지를 생성합니다.

사전 요구 사항

  • Kubernetes NMState Operator를 설치했습니다.

절차

  • NodeNetworkConfigurationPolicy 매니페스트를 생성합니다. 이 예제에는 해당 정보로 교체해야 하는 샘플 값이 포함되어 있습니다.

    apiVersion: nmstate.io/v1
    kind: NodeNetworkConfigurationPolicy
    metadata:
      name: br1-eth1-policy 1
    spec:
      desiredState:
        interfaces:
          - name: br1 2
            description: Linux bridge with eth1 as a port 3
            type: linux-bridge 4
            state: up 5
            ipv4:
              enabled: false 6
            bridge:
              options:
                stp:
                  enabled: false 7
              port:
                - name: eth1 8
    1
    정책 이름입니다.
    2
    인터페이스 이름입니다.
    3
    선택 사항: 사람이 읽을 수 있는 인터페이스 설명입니다.
    4
    인터페이스 유형입니다. 이 예제에서는 브리지를 만듭니다.
    5
    생성 후 인터페이스에 요청되는 상태입니다.
    6
    이 예제에서는 IPv4를 비활성화합니다.
    7
    이 예제에서는 STP를 비활성화합니다.
    8
    브리지가 연결된 노드 NIC입니다.

10.18.3.2. Linux 브리지 네트워크 연결 정의 생성

주의

가상 머신의 네트워크 연결 정의에 IP 주소 관리(IPAM) 구성은 지원되지 않습니다.

10.18.3.2.1. 웹 콘솔에서 Linux 브리지 네트워크 연결 정의 생성

네트워크 연결 정의를 생성하여 Pod 및 가상 머신에 계층 2 네트워킹을 제공할 수 있습니다.

Linux 브리지 네트워크 연결 정의는 가상 머신을 VLAN에 연결하는 가장 효율적인 방법입니다.

절차

  1. 웹 콘솔에서 네트워킹 NetworkAttachmentDefinitions 를 클릭합니다.
  2. 네트워크 연결 정의 생성 을 클릭합니다.

    참고

    네트워크 연결 정의는 Pod 또는 가상 머신과 동일한 네임스페이스에 있어야 합니다.

  3. 고유한 이름과 선택적 설명을 입력합니다.
  4. 네트워크 유형 목록에서 CNV Linux 브리지 를 선택합니다.
  5. 브리지 이름 필드에 브리지 이름을 입력합니다.
  6. 선택 사항: 리소스에 VLAN ID가 구성된 경우 VLAN 태그 번호 필드에 ID 번호를 입력합니다.
  7. 선택 사항: MAC 스푸핑 확인 을 선택하여 MAC 스푸핑 필터링을 활성화합니다. 이 기능은 단일 MAC 주소만 Pod를 종료할 수 있으므로 MAC 스푸핑 공격에 대한 보안을 제공합니다.
  8. 생성을 클릭합니다.
10.18.3.2.2. CLI에서 Linux 브리지 네트워크 연결 정의 생성

네트워크 관리자는 cnv-bridge 유형의 네트워크 연결 정의를 구성하여 Pod 및 가상 머신에 계층 2 네트워킹을 제공할 수 있습니다.

사전 요구 사항

  • 노드는 nftables를 지원해야 하며 MAC 스푸핑 검사를 사용하려면 nft 바이너리를 배포해야 합니다.

절차

  1. 가상 머신과 동일한 네임스페이스에 네트워크 연결 정의를 생성합니다.
  2. 다음 예와 같이 네트워크 연결 정의에 가상 머신을 추가합니다.

    apiVersion: "k8s.cni.cncf.io/v1"
    kind: NetworkAttachmentDefinition
    metadata:
      name: <bridge-network> 1
      annotations:
        k8s.v1.cni.cncf.io/resourceName: bridge.network.kubevirt.io/<bridge-interface> 2
    spec:
      config: '{
        "cniVersion": "0.3.1",
        "name": "<bridge-network>", 3
        "type": "cnv-bridge", 4
        "bridge": "<bridge-interface>", 5
        "macspoofchk": true, 6
        "vlan": 100, 7
        "preserveDefaultVlan": false 8
      }'
    1
    NetworkAttachmentDefinition 개체의 이름입니다.
    2
    선택 사항: 노드 선택의 주석 키-값 쌍입니다. 여기서 bridge-interface 는 일부 노드에 구성된 브리지 이름과 일치해야 합니다. 네트워크 연결 정의에 이 주석을 추가하면 bridge-interface 브리지가 연결된 노드에서만 가상 머신 인스턴스가 실행됩니다.
    3
    구성의 이름입니다. 구성 이름이 네트워크 연결 정의의 name 값과 일치하는 것이 좋습니다.
    4
    이 네트워크 연결 정의에 대한 네트워크를 제공하는 CNI(컨테이너 네트워크 인터페이스) 플러그인의 실제 이름입니다. 다른 CNI를 사용하려는 경우를 제외하고 이 필드를 변경하지 마십시오.
    5
    노드에 구성된 Linux 브리지의 이름입니다.
    6
    선택 사항: MAC 스푸핑 검사를 활성화하는 플래그입니다. true로 설정하면 Pod 또는 게스트 인터페이스의 MAC 주소를 변경할 수 없습니다. 이 속성은 단일 MAC 주소만 Pod를 종료할 수 있도록 허용하여 MAC 스푸핑 공격에 대한 보안을 제공합니다.
    7
    선택 사항: VLAN 태그. 노드 네트워크 구성 정책에 추가 VLAN 구성이 필요하지 않습니다.
    8
    선택 사항: VM이 기본 VLAN을 통해 브리지에 연결되는지 여부를 나타냅니다. 기본값은 true입니다.
    참고

    Linux 브리지 네트워크 연결 정의는 가상 머신을 VLAN에 연결하는 가장 효율적인 방법입니다.

  3. 네트워크 연결 정의를 만듭니다.

    $ oc create -f <network-attachment-definition.yaml> 1
    1
    여기서 <network-attachment-definition.yaml>은 네트워크 연결 정의 매니페스트의 파일 이름입니다.

검증

  • 다음 명령을 실행하여 네트워크 연결 정의가 생성되었는지 확인합니다.

    $ oc get network-attachment-definition <bridge-network>

10.18.3.3. Linux 브리지 네트워크용 가상 머신 구성

10.18.3.3.1. 웹 콘솔에서 가상 머신의 NIC를 생성

웹 콘솔에서 추가 NIC를 생성하고 가상 머신에 연결합니다.

사전 요구 사항

  • 네트워크 연결 정의를 사용할 수 있어야 합니다.

절차

  1. OpenShift Container Platform 콘솔의 올바른 프로젝트에서 사이드 메뉴에서 가상화 VirtualMachines 를 클릭합니다.
  2. 가상 머신을 선택하여 VirtualMachine 세부 정보 페이지를 엽니다.
  3. 구성 네트워크 인터페이스를 클릭하여 가상 머신에 이미 연결된 NIC를 확인합니다.
  4. 네트워크 인터페이스 추가를 클릭하여 목록에 새 슬롯을 만듭니다.
  5. 추가 네트워크의 네트워크 목록에서 네트워크 연결 정의를 선택합니다.
  6. 새 NIC의 이름, 모델, 유형, MAC 주소를 입력합니다.
  7. 저장을 클릭하여 NIC를 저장하고 가상 머신에 연결합니다.
10.18.3.3.2. 네트워킹 필드
이름설명

이름

네트워크 인터페이스 컨트롤러의 이름입니다.

모델

네트워크 인터페이스 컨트롤러의 모델을 나타냅니다. 지원되는 값은 e1000evirtio입니다.

네트워크

사용 가능한 네트워크 연결 정의 목록입니다.

유형

사용 가능한 바인딩 방법 목록입니다. 네트워크 인터페이스에 적합한 바인딩 방법을 선택합니다.

  • 기본 Pod 네트워크: masquerade
  • Linux 브리지 네트워크: bridge
  • SR-IOV 네트워크: SR-IOV

MAC 주소

네트워크 인터페이스 컨트롤러의 MAC 주소입니다. MAC 주소를 지정하지 않으면 주소가 자동으로 할당됩니다.

10.18.3.3.3. CLI의 추가 네트워크에 가상 머신 연결

브리지 인터페이스를 추가하고 가상 머신 구성에서 네트워크 연결 정의를 지정하여 가상 머신을 추가 네트워크에 연결합니다.

이 절차에서는 YAML 파일을 사용하여 구성을 편집하고 업데이트된 파일을 클러스터에 적용하는 방법을 시연합니다. 또는 oc edit <object> <name> 명령을 사용하여 기존 가상 머신을 편집할 수도 있습니다.

사전 요구 사항

  • 구성을 편집하기 전에 가상 머신을 종료합니다. 실행 중인 가상 머신을 편집하는 경우 변경 사항을 적용하려면 가상 머신을 다시 시작해야 합니다.

절차

  1. 브리지 네트워크에 연결하려는 가상 머신 구성을 생성하거나 편집합니다.
  2. spec.template.spec.domain.devices.interfaces 목록에 브리지 인터페이스를 추가하고 spec.template.spec.networks 목록에 네트워크 연결 정의를 추가합니다. 이 예제에서는 a-bridge-network 네트워크 연결 정의에 연결하는 bridge-net 이라는 브릿지 인터페이스를 추가합니다.

    apiVersion: kubevirt.io/v1
    kind: VirtualMachine
    metadata:
        name: <example-vm>
    spec:
      template:
        spec:
          domain:
            devices:
              interfaces:
                - masquerade: {}
                  name: <default>
                - bridge: {}
                  name: <bridge-net> 1
    # ...
          networks:
            - name: <default>
              pod: {}
            - name: <bridge-net> 2
              multus:
                networkName: <network-namespace>/<a-bridge-network> 3
    # ...
    1
    브리지 인터페이스의 이름입니다.
    2
    네트워크의 이름입니다. 이 값은 해당 spec.template.spec.domain.devices.interfaces 항목의 name 값과 일치해야 합니다.
    3
    네트워크 연결 정의의 이름, 존재하는 네임스페이스가 접두사로 지정됩니다. 네임스페이스는 default 네임스페이스 또는 VM을 생성할 동일한 네임스페이스여야 합니다. 이 경우에는 multus 가 사용됩니다. Multus는 Pod 또는 가상 머신에서 필요한 인터페이스를 사용할 수 있도록 여러 CNI가 존재할 수 있는 클라우드 네트워크 인터페이스(CNI) 플러그인입니다.
  3. 설정을 적용합니다.

    $ oc apply -f <example-vm.yaml>
  4. 선택 사항: 실행 중인 가상 머신을 편집한 경우 변경 사항을 적용하려면 가상 머신을 다시 시작해야 합니다.

10.18.3.4. 다음 단계

10.18.4. SR-IOV 네트워크에 가상 머신 연결

다음 단계를 수행하여 VM(가상 머신)을 SR-IOV(Single Root I/O Virtualization) 네트워크에 연결할 수 있습니다.

  1. SR-IOV 네트워크 장치를 구성합니다.
  2. SR-IOV 네트워크를 구성합니다.
  3. VM을 SR-IOV 네트워크에 연결합니다.

10.18.4.1. 사전 요구 사항

10.18.4.2. SR-IOV 네트워크 장치 구성

SR-IOV Network Operator는 SriovNetworkNodePolicy.sriovnetwork.openshift.io CustomResourceDefinition을 OpenShift Container Platform에 추가합니다. SriovNetworkNodePolicy CR(사용자 정의 리소스)을 만들어 SR-IOV 네트워크 장치를 구성할 수 있습니다.

참고

SriovNetworkNodePolicy 오브젝트에 지정된 구성을 적용하면 SR-IOV Operator가 노드를 비우고 경우에 따라 노드를 재부팅할 수 있습니다.

구성 변경 사항을 적용하는 데 몇 분이 걸릴 수 있습니다.

사전 요구 사항

  • OpenShift CLI(oc)를 설치합니다.
  • cluster-admin 역할의 사용자로 클러스터에 액세스할 수 있어야 합니다.
  • SR-IOV Network Operator가 설치되어 있습니다.
  • 비운 노드에서 제거된 워크로드를 처리하기 위해 클러스터에 사용 가능한 노드가 충분합니다.
  • SR-IOV 네트워크 장치 구성에 대한 컨트롤 플레인 노드를 선택하지 않았습니다.

절차

  1. SriovNetworkNodePolicy 오브젝트를 생성한 후 YAML을 <name>-sriov-node-network.yaml 파일에 저장합니다. <name>을 이 구성의 이름으로 바꿉니다.

    apiVersion: sriovnetwork.openshift.io/v1
    kind: SriovNetworkNodePolicy
    metadata:
      name: <name> 1
      namespace: openshift-sriov-network-operator 2
    spec:
      resourceName: <sriov_resource_name> 3
      nodeSelector:
        feature.node.kubernetes.io/network-sriov.capable: "true" 4
      priority: <priority> 5
      mtu: <mtu> 6
      numVfs: <num> 7
      nicSelector: 8
        vendor: "<vendor_code>" 9
        deviceID: "<device_id>" 10
        pfNames: ["<pf_name>", ...] 11
        rootDevices: ["<pci_bus_id>", "..."] 12
      deviceType: vfio-pci 13
      isRdma: false 14
    1
    CR 오브젝트의 이름을 지정합니다.
    2
    SR-IOV Operator가 설치된 네임스페이스를 지정합니다.
    3
    SR-IOV 장치 플러그인의 리소스 이름을 지정합니다. 리소스 이름에 대해 여러 SriovNetworkNodePolicy 오브젝트를 생성할 수 있습니다.
    4
    구성할 노드를 선택하려면 노드 선택기를 지정합니다. 선택한 노드의 SR-IOV 네트워크 장치만 구성됩니다. SR-IOV CNI(Container Network Interface) 플러그인 및 장치 플러그인은 선택한 노드에만 배포됩니다.
    5
    선택 사항: 0에서 99 사이의 정수 값을 지정합니다. 숫자가 작을수록 우선 순위가 높아지므로 우선 순위 10은 우선 순위 99보다 높습니다. 기본값은 99입니다.
    6
    선택 사항: 가상 기능의 최대 전송 단위(MTU) 값을 지정합니다. 최대 MTU 값은 NIC 모델마다 다를 수 있습니다.
    7
    SR-IOV 물리적 네트워크 장치에 생성할 가상 기능(VF) 수를 지정합니다. Intel NIC(Network Interface Controller)의 경우 VF 수는 장치에서 지원하는 총 VF보다 클 수 없습니다. Mellanox NIC의 경우 VF 수는 127 보다 클 수 없습니다.
    8
    nicSelector 매핑은 Operator가 구성할 이더넷 장치를 선택합니다. 모든 매개변수에 값을 지정할 필요는 없습니다. 의도하지 않게 이더넷 장치를 선택할 가능성을 최소화하기 위해 이더넷 어댑터를 충분히 정밀하게 식별하는 것이 좋습니다. rootDevices를 지정하면 vendor, deviceID 또는 pfNames의 값도 지정해야 합니다. pfNamesrootDevices를 동시에 지정하는 경우 동일한 장치를 가리키는지 확인하십시오.
    9
    선택 사항: SR-IOV 네트워크 장치의 공급업체 16진 코드를 지정합니다. 허용되는 유일한 값은 8086 또는 15b3입니다.
    10
    선택 사항: SR-IOV 네트워크 장치의 장치 16진수 코드를 지정합니다. 허용되는 값은 158b, 1015, 1017입니다.
    11
    선택 사항:이 매개변수는 이더넷 장치에 대한 하나 이상의 PF(물리적 기능) 이름 배열을 허용합니다.
    12
    이 매개변수는 이더넷 장치의 물리적 기능을 위해 하나 이상의 PCI 버스 주소 배열을 허용합니다. 주소를 0000:02: 00.1 형식으로 입력합니다.
    13
    vfio-pci 드라이버 유형은 OpenShift Virtualization의 가상 기능에 필요합니다.
    14
    선택 사항: 원격 직접 메모리 액세스(RDMA) 모드 사용 여부를 지정합니다. Mellanox 카드의 경우 isRdmafalse로 설정합니다. 기본값은 false입니다.
    참고

    isRDMA 플래그가 true로 설정된 경우 RDMA 가능 VF를 일반 네트워크 장치로 계속 사용할 수 있습니다. 어느 모드에서나 장치를 사용할 수 있습니다.

  2. 선택 사항: SR-IOV 가능 클러스터 노드에 아직 레이블이 지정되지 않은 경우 SriovNetworkNodePolicy.Spec.NodeSelector 로 레이블을 지정합니다. 노드에 레이블 지정에 대한 자세한 내용은 "노드에서 라벨을 업데이트하는 방법"을 참조하십시오.
  3. SriovNetworkNodePolicy 오브젝트를 생성합니다.

    $ oc create -f <name>-sriov-node-network.yaml

    <name>은 이 구성의 이름을 지정합니다.

    구성 업데이트를 적용하면 sriov-network-operator 네임스페이스의 모든 Pod가 Running 상태로 전환됩니다.

  4. SR-IOV 네트워크 장치가 구성되어 있는지 확인하려면 다음 명령을 입력합니다. <node_name>을 방금 구성한 SR-IOV 네트워크 장치가 있는 노드 이름으로 바꿉니다.

    $ oc get sriovnetworknodestates -n openshift-sriov-network-operator <node_name> -o jsonpath='{.status.syncStatus}'

10.18.4.3. SR-IOV 추가 네트워크 구성

SriovNetwork 오브젝트를 생성하여 SR-IOV 하드웨어를 사용하는 추가 네트워크를 구성할 수 있습니다.

SriovNetwork 오브젝트를 생성하면 SR-IOV Network Operator가 NetworkAttachmentDefinition 오브젝트를 자동으로 생성합니다.

참고

SriovNetwork 오브젝트가 Pod 또는 가상 머신에 running 상태의 경우 수정하거나 삭제하지 마십시오.

사전 요구 사항

  • OpenShift CLI(oc)를 설치합니다.
  • cluster-admin 권한이 있는 사용자로 로그인합니다.

절차

  1. 다음 SriovNetwork 오브젝트를 생성한 후 YAML을 <name>-sriov-network.yaml 파일에 저장합니다. <name>을 이 추가 네트워크의 이름으로 변경합니다.
apiVersion: sriovnetwork.openshift.io/v1
kind: SriovNetwork
metadata:
  name: <name> 1
  namespace: openshift-sriov-network-operator 2
spec:
  resourceName: <sriov_resource_name> 3
  networkNamespace: <target_namespace> 4
  vlan: <vlan> 5
  spoofChk: "<spoof_check>" 6
  linkState: <link_state> 7
  maxTxRate: <max_tx_rate> 8
  minTxRate: <min_rx_rate> 9
  vlanQoS: <vlan_qos> 10
  trust: "<trust_vf>" 11
  capabilities: <capabilities> 12
1
<name>을 오브젝트의 이름으로 바꿉니다. SR-IOV Network Operator는 동일한 이름으로 NetworkAttachmentDefinition 오브젝트를 생성합니다.
2
SR-IOV Network Operator가 설치된 네임스페이스를 지정합니다.
3
<sriov_resource_name>을 이 추가 네트워크에 대한 SR-IOV 하드웨어를 정의하는 SriovNetworkNodePolicy 오브젝트의 spec.resourceName 매개변수 값으로 바꿉니다.
4
<target_namespace>를 SriovNetwork의 대상 네임스페이스로 바꿉니다. 대상 네임스페이스의 pod 또는 가상 머신만 SriovNetwork에 연결할 수 있습니다.
5
선택 사항: <vlan>을 추가 네트워크의 VLAN(Virtual LAN) ID로 바꿉니다. 정수 값은 0에서 4095 사이여야 합니다. 기본값은 0입니다.
6
선택 사항: <spoof_check>를 VF의 위조 확인 모드로 바꿉니다. 허용되는 값은 문자열 "on""off"입니다.
중요

SR-IOV Network Operator가 지정한 값을 따옴표로 묶거나 CR을 거부해야 합니다.

7
선택 사항: <link_state>를 가상 기능(VF)의 링크 상태로 바꿉니다. 허용되는 값은 enable, disableauto입니다.
8
선택 사항: VF의 경우 <max_tx_rate>를 최대 전송 속도(Mbps)로 바꿉니다.
9
선택 사항: VF의 경우 <min_tx_rate>를 최소 전송 속도(Mbps)로 바꿉니다. 이 값은 항상 최대 전송 속도보다 작거나 같아야 합니다.
참고

인텔 NIC는 minTxRate 매개변수를 지원하지 않습니다. 자세한 내용은 BZ#1772847에서 참조하십시오.

10
선택 사항: <vlan_qos>를 VF의 IEEE 802.1p 우선 순위 레벨로 바꿉니다. 기본값은 0입니다.
11
선택 사항: <trust_vf>를 VF의 신뢰 모드로 바꿉니다. 허용되는 값은 문자열 "on""off"입니다.
중요

SR-IOV Network Operator가 지정한 값을 따옴표로 묶거나 CR을 거부해야 합니다.

12
선택 사항: <capabilities>를 이 네트워크에 구성할 수 있는 기능으로 바꿉니다.
  1. 오브젝트를 생성하려면 다음 명령을 입력합니다. <name>을 이 추가 네트워크의 이름으로 변경합니다.

    $ oc create -f <name>-sriov-network.yaml
  2. 선택 사항: 이전 단계에서 생성한 SriovNetwork 오브젝트에 연결된 NetworkAttachmentDefinition 오브젝트가 존재하는지 확인하려면 다음 명령을 입력합니다. <namespace>SriovNetwork 오브젝트에 지정한 네임스페이스로 바꿉니다.

    $ oc get net-attach-def -n <namespace>

10.18.4.4. SR-IOV 네트워크에 가상 머신 연결

VM 구성에 네트워크 세부 정보를 포함하여 VM(가상 머신)을 SR-IOV 네트워크에 연결할 수 있습니다.

절차

  1. VM 구성의 spec.domain.devices.interfacesspec.networks 에 SR-IOV 네트워크 세부 정보를 포함합니다.

    kind: VirtualMachine
    # ...
    spec:
      domain:
        devices:
          interfaces:
          - name: <default> 1
            masquerade: {} 2
          - name: <nic1> 3
            sriov: {}
      networks:
      - name: <default> 4
        pod: {}
      - name: <nic1> 5
        multus:
            networkName: <sriov-network> 6
    # ...
    1
    Pod 네트워크에 연결된 인터페이스의 고유 이름입니다.
    2
    기본 Pod 네트워크에 대한 masquerade 바인딩입니다.
    3
    SR-IOV 인터페이스의 고유 이름입니다.
    4
    Pod 네트워크 인터페이스의 이름입니다. 이전에 정의한 interfaces.name과 동일해야 합니다.
    5
    SR-IOV 인터페이스의 이름입니다. 이전에 정의한 interfaces.name과 동일해야 합니다.
    6
    SR-IOV 네트워크 연결 정의의 이름입니다.
  2. 가상 머신 구성을 적용합니다.

    $ oc apply -f <vm-sriov.yaml> 1
    1
    가상 머신 YAML 파일의 이름입니다.

10.18.4.5. DPDK 워크로드를 위한 클러스터 구성

다음 절차에 따라 DPDK(Data Plane Development Kit) 워크로드를 실행하도록 OpenShift Container Platform 클러스터를 구성할 수 있습니다.

중요

DPDK 워크로드용 클러스터를 구성하는 것은 기술 프리뷰 기능 전용입니다. 기술 프리뷰 기능은 Red Hat 프로덕션 서비스 수준 계약(SLA)에서 지원되지 않으며 기능적으로 완전하지 않을 수 있습니다. 따라서 프로덕션 환경에서 사용하는 것은 권장하지 않습니다. 이러한 기능을 사용하면 향후 제품 기능을 조기에 이용할 수 있어 개발 과정에서 고객이 기능을 테스트하고 피드백을 제공할 수 있습니다.

Red Hat 기술 프리뷰 기능의 지원 범위에 대한 자세한 내용은 기술 프리뷰 기능 지원 범위를 참조하십시오.

사전 요구 사항

  • cluster-admin 권한이 있는 사용자로 클러스터에 액세스할 수 있습니다.
  • OpenShift CLI(oc)가 설치되어 있습니다.
  • SR-IOV Network Operator가 설치되어 있습니다.
  • Node Tuning Operator가 설치되어 있습니다.

절차

  1. 컴퓨팅 노드 토폴로지를 매핑하여 DPDK 애플리케이션에 대해 격리된 NUMA(Non-Uniform Memory Access) CPU와 운영 체제(OS)용으로 예약된 CPU를 결정합니다.
  2. 사용자 지정 역할을 사용하여 컴퓨팅 노드의 하위 집합에 레이블을 지정합니다(예: worker-dpdk ).

    $ oc label node <node_name> node-role.kubernetes.io/worker-dpdk=""
  3. spec.machineConfigSelector 오브젝트에 worker-dpdk 라벨이 포함된 새 MachineConfigPool 매니페스트를 만듭니다.

    MachineConfigPool 매니페스트의 예

    apiVersion: machineconfiguration.openshift.io/v1
    kind: MachineConfigPool
    metadata:
      name: worker-dpdk
      labels:
        machineconfiguration.openshift.io/role: worker-dpdk
    spec:
      machineConfigSelector:
        matchExpressions:
          - key: machineconfiguration.openshift.io/role
            operator: In
            values:
              - worker
              - worker-dpdk
      nodeSelector:
        matchLabels:
          node-role.kubernetes.io/worker-dpdk: ""

  4. 레이블이 지정된 노드 및 이전 단계에서 생성한 머신 구성 풀에 적용되는 PerformanceProfile 매니페스트를 생성합니다. 성능 프로필은 DPDK 애플리케이션용으로 분리된 CPU와 하우스 보관용으로 예약된 CPU를 지정합니다.

    PerformanceProfile 매니페스트 예

    apiVersion: performance.openshift.io/v2
    kind: PerformanceProfile
    metadata:
      name: profile-1
    spec:
      cpu:
        isolated: 4-39,44-79
        reserved: 0-3,40-43
      hugepages:
        defaultHugepagesSize: 1G
        pages:
        - count: 32
          node: 0
          size: 1G
      net:
        userLevelNetworking: true
      nodeSelector:
        node-role.kubernetes.io/worker-dpdk: ""
      numa:
        topologyPolicy: single-numa-node

    참고

    MachineConfigPoolPerformanceProfile 매니페스트를 적용한 후 컴퓨팅 노드가 자동으로 재시작됩니다.

  5. PerformanceProfile 오브젝트의 status.runtimeClass 필드에서 생성된 RuntimeClass 리소스의 이름을 검색합니다.

    $ oc get performanceprofiles.performance.openshift.io profile-1 -o=jsonpath='{.status.runtimeClass}{"\n"}'
  6. HyperConverged CR(사용자 정의 리소스)에 다음 주석을 추가하여 이전에 가져온 RuntimeClass 이름을 virt-launcher Pod의 기본 컨테이너 런타임 클래스로 설정합니다.

    $ oc annotate --overwrite -n openshift-cnv hco kubevirt-hyperconverged \
        kubevirt.kubevirt.io/jsonpatch='[{"op": "add", "path": "/spec/configuration/defaultRuntimeClass", "value": <runtimeclass_name>}]'
    참고

    HyperConverged CR에 주석을 추가하면 주석을 적용한 후 생성된 모든 VM에 영향을 주는 글로벌 설정이 변경됩니다. OpenShift Virtualization 인스턴스의 이 주석 위반 지원을 설정하며 테스트 클러스터에서만 사용해야 합니다. 최상의 성능을 위해서는 지원 예외를 적용합니다.

  7. spec.deviceType 필드가 vfio-pci 로 설정된 SriovNetworkNodePolicy 오브젝트를 생성합니다.

    SriovNetworkNodePolicy 매니페스트 예

    apiVersion: sriovnetwork.openshift.io/v1
    kind: SriovNetworkNodePolicy
    metadata:
      name: policy-1
      namespace: openshift-sriov-network-operator
    spec:
      resourceName: intel_nics_dpdk
      deviceType: vfio-pci
      mtu: 9000
      numVfs: 4
      priority: 99
      nicSelector:
        vendor: "8086"
        deviceID: "1572"
        pfNames:
          - eno3
        rootDevices:
          - "0000:19:00.2"
      nodeSelector:
        feature.node.kubernetes.io/network-sriov.capable: "true"

10.18.4.6. DPDK 워크로드에 대한 프로젝트 구성

SR-IOV 하드웨어에서 DPDK 워크로드를 실행하도록 프로젝트를 구성할 수 있습니다.

사전 요구 사항

  • 클러스터는 DPDK 워크로드를 실행하도록 구성되어 있습니다.

절차

  1. DPDK 애플리케이션의 네임스페이스를 생성합니다.

    $ oc create ns dpdk-checkup-ns
  2. SriovNetwork NodePolicy 오브젝트를 참조하는 SriovNetwork 오브젝트를 생성합니다. SriovNetwork 오브젝트를 생성하면 SR-IOV Network Operator에서 NetworkAttachmentDefinition 오브젝트를 자동으로 생성합니다.

    SriovNetwork 매니페스트 예

    apiVersion: sriovnetwork.openshift.io/v1
    kind: SriovNetwork
    metadata:
      name: dpdk-sriovnetwork
      namespace: openshift-sriov-network-operator
    spec:
      ipam: |
        {
          "type": "host-local",
          "subnet": "10.56.217.0/24",
          "rangeStart": "10.56.217.171",
          "rangeEnd": "10.56.217.181",
          "routes": [{
            "dst": "0.0.0.0/0"
          }],
          "gateway": "10.56.217.1"
        }
      networkNamespace: dpdk-checkup-ns 1
      resourceName: intel_nics_dpdk 2
      spoofChk: "off"
      trust: "on"
      vlan: 1019

    1
    NetworkAttachmentDefinition 오브젝트가 배포된 네임스페이스입니다.
    2
    DPDK 워크로드의 클러스터를 구성할 때 생성된 SriovNetworkNodePolicy 오브젝트의 spec.resourceName 속성 값입니다.
  3. 선택 사항: 가상 머신 대기 시간 검사를 실행하여 네트워크가 올바르게 구성되었는지 확인합니다.
  4. 선택 사항: DPDK 검사를 실행하여 네임스페이스가 DPDK 워크로드에 준비되었는지 확인합니다.

10.18.4.7. DPDK 워크로드를 위한 가상 머신 구성

VM(가상 머신)에서 DPDK(Data Packet Development Kit) 워크로드를 실행하여 사용자 공간에서 더 빠른 패킷 처리를 위해 대기 시간을 줄이고 처리량을 높일 수 있습니다. DPDK는 하드웨어 기반 I/O 공유에 SR-IOV 네트워크를 사용합니다.

사전 요구 사항

  • 클러스터는 DPDK 워크로드를 실행하도록 구성되어 있습니다.
  • VM을 실행할 프로젝트를 생성하고 구성했습니다.

절차

  1. SR-IOV 네트워크 인터페이스, CPU 토폴로지, CRI-O 주석 및 대규모 페이지에 대한 정보를 포함하도록 VirtualMachine 매니페스트를 편집합니다.

    VirtualMachine 매니페스트 예

    apiVersion: kubevirt.io/v1
    kind: VirtualMachine
    metadata:
      name: rhel-dpdk-vm
    spec:
      running: true
      template:
        metadata:
          annotations:
            cpu-load-balancing.crio.io: disable 1
            cpu-quota.crio.io: disable 2
            irq-load-balancing.crio.io: disable 3
        spec:
          domain:
            cpu:
              sockets: 1 4
              cores: 5 5
              threads: 2
              dedicatedCpuPlacement: true
              isolateEmulatorThread: true
            interfaces:
              - masquerade: {}
                name: default
              - model: virtio
                name: nic-east
                pciAddress: '0000:07:00.0'
                sriov: {}
              networkInterfaceMultiqueue: true
              rng: {}
          memory:
            hugepages:
              pageSize: 1Gi 6
              guest: 8Gi
          networks:
            - name: default
              pod: {}
            - multus:
                networkName: dpdk-net 7
              name: nic-east
    # ...

    1
    이 주석은 컨테이너에서 사용하는 CPU에 대해 로드 밸런싱이 비활성화되도록 지정합니다.
    2
    이 주석은 컨테이너에서 사용하는 CPU에 대해 CPU 할당량을 비활성화하도록 지정합니다.
    3
    이 주석은 컨테이너에서 사용하는 CPU에 대해IRQ(interrupt Request) 로드 밸런싱이 비활성화되도록 지정합니다.
    4
    VM 내부의 소켓 수입니다. 동일한 NUMA(Non-Uniform Memory Access) 노드에서 CPU를 예약하려면 이 필드를 1 로 설정해야 합니다.
    5
    VM 내부의 코어 수입니다. 이 값은 1 보다 크거나 같아야 합니다. 이 예에서 VM은 5개의 하이퍼 스레드 또는 10개의 CPU로 예약됩니다.
    6
    대규모 페이지의 크기입니다. x86-64 아키텍처에서 가능한 값은 1Gi 및 2Mi입니다. 이 예에서 요청은 크기가 1Gi인 8개의 대규모 페이지입니다.
    7
    SR-IOV NetworkAttachmentDefinition 오브젝트의 이름입니다.
  2. 편집기를 저장한 후 종료합니다.
  3. VirtualMachine 매니페스트를 적용합니다.

    $ oc apply -f <file_name>.yaml
  4. 게스트 운영 체제를 구성합니다. 다음 예제에서는 RHEL 8 OS의 구성 단계를 보여줍니다.

    1. GRUB 부트로더 명령줄 인터페이스를 사용하여 대규모 페이지를 구성합니다. 다음 예에서는 8G 대규모 페이지가 지정됩니다.

      $ grubby --update-kernel=ALL --args="default_hugepagesz=1GB hugepagesz=1G hugepages=8"
    2. TuneD 애플리케이션에서 cpu-partitioning 프로필을 사용하여 대기 시간이 짧은 튜닝을 수행하려면 다음 명령을 실행합니다.

      $ dnf install -y tuned-profiles-cpu-partitioning
      $ echo isolated_cores=2-9 > /etc/tuned/cpu-partitioning-variables.conf

      처음 두 개의 CPU (0 및 1)는 하우스 보관 작업을 위해 별도로 설정되며 나머지는 DPDK 애플리케이션용으로 분리됩니다.

      $ tuned-adm profile cpu-partitioning
    3. driverctl 장치 드라이버 제어 유틸리티를 사용하여 SR-IOV NIC 드라이버를 재정의합니다.

      $ dnf install -y driverctl
      $ driverctl set-override 0000:07:00.0 vfio-pci
  5. VM을 다시 시작하여 변경 사항을 적용합니다.

10.18.4.8. 다음 단계

10.18.5. 서비스 메시에 가상 머신 연결

OpenShift Virtualization이 이제 OpenShift Service Mesh와 통합되었습니다. IPv4를 사용하여 기본 Pod 네트워크에서 가상 머신 워크로드를 실행하는 Pod 간 트래픽을 모니터링, 시각화 및 제어할 수 있습니다.

10.18.5.1. 사전 요구 사항

10.18.5.2. 서비스 메시의 가상 머신 구성

서비스 메시에 VM(가상 머신) 워크로드를 추가하려면 sidecar.istio.io/inject 주석을 true 로 설정하여 VM 구성 파일에서 자동 사이드카 삽입을 활성화합니다. 그런 다음 VM을 서비스로 노출하여 메시에서 애플리케이션을 확인합니다.

사전 요구 사항

  • 포트 충돌을 방지하려면 Istio 사이드카 프록시에서 사용하는 포트를 사용하지 마십시오. 여기에는 포트 15000, 15001, 15006, 15008, 15021, 15090이 포함됩니다.

절차

  1. VM 구성 파일을 편집하여 sidecar.istio.io/inject: "true" 주석을 추가합니다.

    설정 파일 예

    apiVersion: kubevirt.io/v1
    kind: VirtualMachine
    metadata:
      labels:
        kubevirt.io/vm: vm-istio
      name: vm-istio
    spec:
      runStrategy: Always
      template:
        metadata:
          labels:
            kubevirt.io/vm: vm-istio
            app: vm-istio 1
          annotations:
            sidecar.istio.io/inject: "true" 2
        spec:
          domain:
            devices:
              interfaces:
              - name: default
                masquerade: {} 3
              disks:
              - disk:
                  bus: virtio
                name: containerdisk
              - disk:
                  bus: virtio
                name: cloudinitdisk
            resources:
              requests:
                memory: 1024M
          networks:
          - name: default
            pod: {}
          terminationGracePeriodSeconds: 180
          volumes:
          - containerDisk:
              image: registry:5000/kubevirt/fedora-cloud-container-disk-demo:devel
            name: containerdisk

    1
    서비스 선택기 특성과 일치해야 하는 키/값 쌍(라벨)입니다.
    2
    자동 사이드카 삽입을 활성화하는 주석입니다.
    3
    기본 Pod 네트워크에 사용할 바인딩 방법(masquerade 모드)입니다.
  2. VM 구성을 적용합니다.

    $ oc apply -f <vm_name>.yaml 1
    1
    가상 머신 YAML 파일의 이름입니다.
  3. VM을 서비스 메시에 노출하는 Service 오브젝트를 생성합니다.

      apiVersion: v1
      kind: Service
      metadata:
        name: vm-istio
      spec:
        selector:
          app: vm-istio 1
        ports:
          - port: 8080
            name: http
            protocol: TCP
    1
    서비스의 대상 포드 집합을 결정하는 서비스 선택기입니다. 이 속성은 VM 구성 파일의 spec.metadata.labels 필드에 해당합니다. 위 예에서 vm-istio라는 Service 오브젝트는 app= vm-istio 레이블이 있는 모든 포드에서 TCP 포트 8080을 대상으로 합니다.
  4. 서비스를 생성합니다.

    $ oc create -f <service_name>.yaml 1
    1
    서비스 YAML 파일의 이름입니다.

10.18.6. 가상 머신용 IP 주소 구성

가상 머신의 고정 및 동적 IP 주소를 구성할 수 있습니다.

10.18.6.1. cloud-init를 사용하여 새 가상 머신의 IP 주소 구성

VM(가상 머신)을 생성할 때 cloud-init를 사용하여 보조 NIC의 IP 주소를 구성할 수 있습니다. IP 주소는 동적으로 또는 정적으로 프로비저닝될 수 있습니다.

참고

VM이 Pod 네트워크에 연결되어 있으면 업데이트하지 않는 한 Pod 네트워크 인터페이스가 기본 경로입니다.

사전 요구 사항

  • 가상 머신이 보조 네트워크에 연결되어 있습니다.
  • 가상 머신의 동적 IP를 구성하기 위해 보조 네트워크에 DHCP 서버를 사용할 수 있습니다.

절차

  • 가상 머신 구성의 spec.template.spec.volumes.cloudInitNoCloud.networkData 스탠자를 편집합니다.

    • 동적 IP 주소를 구성하려면 인터페이스 이름을 지정하고 DHCP를 활성화합니다.

      kind: VirtualMachine
      spec:
      # ...
        template:
        # ...
          spec:
            volumes:
            - cloudInitNoCloud:
                networkData: |
                  version: 2
                  ethernets:
                    eth1: 1
                      dhcp4: true
      1
      인터페이스 이름을 지정합니다.
    • 고정 IP를 구성하려면 인터페이스 이름과 IP 주소를 지정합니다.

      kind: VirtualMachine
      spec:
      # ...
        template:
        # ...
          spec:
            volumes:
            - cloudInitNoCloud:
                networkData: |
                  version: 2
                  ethernets:
                    eth1: 1
                      addresses:
                      - 10.10.10.14/24 2
      1
      인터페이스 이름을 지정합니다.
      2
      고정 IP 주소를 지정합니다.

10.18.7. 가상 머신에서 NIC의 IP 주소 보기

웹 콘솔 또는 oc 클라이언트를 사용하여 NIC(네트워크 인터페이스 컨트롤러)의 IP 주소를 볼 수 있습니다. QEMU 게스트 에이전트 는 가상 머신의 보조 네트워크에 대한 추가 정보를 표시합니다.

10.18.7.1. 사전 요구 사항

  • 가상 머신에 QEMU 게스트 에이전트를 설치합니다.

10.18.7.2. CLI에서 가상 머신 인터페이스의 IP 주소 보기

네트워크 인터페이스 구성은 oc describe vmi <vmi_name> 명령에 포함되어 있습니다.

가상 머신에서 ip addr을 실행하거나 oc get vmi <vmi_name> -o yaml을 실행하여 IP 주소 정보를 볼 수도 있습니다.

절차

  • oc describe 명령을 사용하여 가상 머신 인터페이스 구성을 표시합니다.

    $ oc describe vmi <vmi_name>

    출력 예

    # ...
    Interfaces:
       Interface Name:  eth0
       Ip Address:      10.244.0.37/24
       Ip Addresses:
         10.244.0.37/24
         fe80::858:aff:fef4:25/64
       Mac:             0a:58:0a:f4:00:25
       Name:            default
       Interface Name:  v2
       Ip Address:      1.1.1.7/24
       Ip Addresses:
         1.1.1.7/24
         fe80::f4d9:70ff:fe13:9089/64
       Mac:             f6:d9:70:13:90:89
       Interface Name:  v1
       Ip Address:      1.1.1.1/24
       Ip Addresses:
         1.1.1.1/24
         1.1.1.2/24
         1.1.1.4/24
         2001:de7:0:f101::1/64
         2001:db8:0:f101::1/64
         fe80::1420:84ff:fe10:17aa/64
       Mac:             16:20:84:10:17:aa

10.18.7.3. 웹 콘솔에서 가상 머신 인터페이스의 IP 주소 보기

IP 정보는 가상 머신의 VirtualMachine 세부 정보 페이지에 표시됩니다.

절차

  1. OpenShift Container Platform 콘솔의 사이드 메뉴에서 가상화 VirtualMachines 를 클릭합니다.
  2. 가상 머신 이름을 선택하여 VirtualMachine 세부 정보 페이지를 엽니다.

연결된 각 NIC에 대한 정보는 세부 정보 탭의 IP 주소 아래에 표시됩니다.

10.18.8. 클러스터 도메인 이름을 사용하여 보조 네트워크의 가상 머신에 액세스

클러스터의 FQDN(정규화된 도메인 이름)을 사용하여 클러스터 외부에서 보조 네트워크 인터페이스에 연결된 VM(가상 머신)에 액세스할 수 있습니다.

중요

클러스터 FQDN을 사용하여 VM에 액세스하는 것은 기술 프리뷰 기능 전용입니다. 기술 프리뷰 기능은 Red Hat 프로덕션 서비스 수준 계약(SLA)에서 지원되지 않으며 기능적으로 완전하지 않을 수 있습니다. 따라서 프로덕션 환경에서 사용하는 것은 권장하지 않습니다. 이러한 기능을 사용하면 향후 제품 기능을 조기에 이용할 수 있어 개발 과정에서 고객이 기능을 테스트하고 피드백을 제공할 수 있습니다.

Red Hat 기술 프리뷰 기능의 지원 범위에 대한 자세한 내용은 기술 프리뷰 기능 지원 범위를 참조하십시오.

10.18.8.1. 보조 네트워크의 DNS 서버 구성

CNO(Cluster Network Addons Operator)는 HyperConverged CR(사용자 정의 리소스)에서 KubeSecondaryDNS 기능 게이트를 활성화할 때 DNS(Domain Name Server) 서버 및 모니터링 구성 요소를 배포합니다.

사전 요구 사항

  • OpenShift CLI(oc)를 설치합니다.
  • cluster-admin 권한이 있는 OpenShift Container Platform 클러스터에 액세스할 수 있습니다.

절차

  1. cluster 외부에 DNS 서버를 노출하기 위해 ScanSetting 또는 기타 로드 밸런서를 사용하여 LoadBalancer 서비스를 생성합니다. 서비스는 포트 53에서 수신 대기하고 포트 5353을 대상으로 합니다. 예를 들면 다음과 같습니다.

    $ oc expose -n openshift-cnv deployment/secondary-dns --name=dns-lb --type=LoadBalancer --port=53 --target-port=5353 --protocol='UDP'
  2. Service 오브젝트를 쿼리하여 서비스의 공용 IP 주소를 검색합니다.

    $ oc get service -n openshift-cnv

    출력 예

    NAME        TYPE            CLUSTER-IP     EXTERNAL-IP      PORT(S)          AGE
    dns-lb   LoadBalancer       172.30.27.5    10.46.41.94      53:31829/TCP     5s

  3. HyperConverged CR을 편집하여 DNS 서버 및 모니터링 구성 요소를 배포합니다.

    apiVersion: hco.kubevirt.io/v1beta1
    kind: HyperConverged
    metadata:
      name: kubevirt-hyperconverged
      namespace: openshift-cnv
    spec:
        featureGates:
          deployKubeSecondaryDNS: true 1
        kubeSecondaryDNSNameServerIP: "10.46.41.94" 2
    # ...
    1
    KubeSecondaryDNS 기능 게이트를 true 로 설정합니다.
    2
    서비스의 IP 주소를 2단계에서 검색한 값으로 설정합니다.
  4. 다음 명령을 사용하여 OpenShift Container Platform 클러스터의 FQDN을 검색합니다.

    $ oc get dnses.config.openshift.io cluster -o json | jq .spec.baseDomain

    출력 예

    openshift.example.com

  5. 다음 방법 중 하나를 사용하여 DNS 서버를 가리킵니다.

    • 로컬 머신의 resolv.conf 파일에 kubeSecondaryDNSNameServerIP 값을 추가합니다.

      참고

      resolv.conf 파일을 편집하면 기존 DNS 설정을 덮어씁니다.

    • 엔터프라이즈 DNS 서버 레코드에 kubeSecondaryDNSNameServerIP 값과 클러스터 FQDN을 추가합니다. 예를 들면 다음과 같습니다.

      vm.<FQDN>. IN NS ns.vm.<FQDN>.
      ns.vm.<FQDN>. IN A 10.46.41.94

10.18.8.2. 클러스터 FQDN을 사용하여 보조 네트워크의 가상 머신에 연결

클러스터의 FQDN(정규화된 도메인 이름)을 사용하여 클러스터 외부에서 보조 네트워크 인터페이스에 연결된 VM(가상 머신)에 액세스할 수 있습니다.

사전 요구 사항

  • QEMU 게스트 에이전트가 가상 머신에서 실행 중이어야 합니다.
  • DNS 클라이언트를 사용하여 연결할 VM의 IP 주소는 공용이어야 합니다.
  • 보조 네트워크에 대해 DNS 서버를 구성했습니다.
  • 클러스터의 FQDN(정규화된 도메인 이름)을 검색했습니다.

절차

  1. 다음 명령을 사용하여 VM 구성을 검색합니다.

    $ oc get vm -n <namespace> <vm_name> -o yaml

    출력 예

    apiVersion: kubevirt.io/v1
    kind: VirtualMachine
    metadata:
      labels:
        kubevirt.io/vm: example-vm
      name: example-vm
      namespace: example-namespace
    spec:
      running: true
      template:
        metadata:
          labels:
            kubevirt.io/vm: example-vm
        spec:
          domain:
            devices:
    # ...
              interfaces:
                - bridge: {}
                  name: example-nic
    # ...
          networks:
          - multus:
              networkName: bridge-conf
            name: example-nic 1
    # ...

    1
    보조 네트워크 인터페이스의 이름을 지정합니다.
  2. ssh 명령을 사용하여 VM에 연결합니다.

    $ ssh <user_name>@<interface_name>.<vm_name>.<namespace>.vm.<FQDN> 1
    1
    사용자 이름, 인터페이스 이름, VM 이름, VM 네임스페이스, FQDN을 지정합니다.

    $ ssh you@example-nic.example-vm.example-namespace.vm.openshift.example.com

10.18.8.3. 추가 리소스

10.18.9. 가상 머신의 MAC 주소 풀 사용

KubeMacPool 구성 요소는 네임스페이스의 가상 머신 NIC에 대한 MAC 주소 풀 서비스를 제공합니다.

10.18.9.1. About KubeMacPool

KubeMacPool은 네임스페이스당 MAC 주소 풀을 제공하고 풀의 가상 머신 NIC에 MAC 주소를 할당합니다. 이렇게 하면 다른 가상 머신의 MAC 주소와 충돌하지 않는 고유한 MAC 주소가 NIC에 할당됩니다.

해당 가상 머신에서 생성된 가상 머신 인스턴스에서는 재부팅 시 할당되는 MAC 주소가 유지됩니다.

참고

KubeMacPool은 가상 머신과 독립적으로 생성된 가상 머신 인스턴스는 처리하지 않습니다.

OpenShift Virtualization을 설치할 때 KubeMacPool은 기본적으로 활성화됩니다. 네임스페이스에 mutatevirtualmachines.kubemacpool.io=ignore 레이블을 추가하여 네임스페이스의 MAC 주소 풀을 비활성화합니다. 레이블을 제거하여 네임스페이스에 대해 KubeMacPool을 다시 활성화합니다.

10.18.9.2. CLI에서 네임스페이스의 MAC 주소 풀 비활성화

mutatevirtualmachines.kubemacpool.io=allocate 레이블을 네임스페이스에 추가하여 네임스페이스에서 가상 머신의 MAC 주소 풀을 비활성화합니다.

절차

  • mutatevirtualmachines.kubemacpool.io=ignore 레이블을 네임스페이스에 추가합니다. 다음 예제에서는 <namespace1><namespace2> 네임스페이스에 KubeMacPool 라벨을 추가합니다.

    $ oc label namespace <namespace1> <namespace2> mutatevirtualmachines.kubemacpool.io=ignore

10.18.9.3. CLI에서 네임스페이스의 MAC 주소 풀을 다시 활성화

네임스페이스에 대해 KubeMacPool을 비활성화하고 다시 활성화하려면 네임스페이스에서 mutatevirtualmachines.kubemacpool.io=ignore 레이블을 제거합니다.

참고

이전 버전의 OpenShift Virtualization에서는 mutatevirtualmachines.kubemacpool.io=allocate 레이블을 사용하여 네임스페이스에 KubeMacPool을 활성화했습니다. 이는 여전히 지원되지만 KubeMacPool의 중복은 기본적으로 활성화되어 있습니다.

절차

  • 네임스페이스에서 KubeMacPool 라벨을 제거합니다. 다음 예제에서는 <namespace1><namespace2> 네임스페이스에 KubeMacPool을 다시 사용하도록 설정합니다.

    $ oc label namespace <namespace1> <namespace2> mutatevirtualmachines.kubemacpool.io-
Red Hat logoGithubRedditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

Red Hat을 사용하는 고객은 신뢰할 수 있는 콘텐츠가 포함된 제품과 서비스를 통해 혁신하고 목표를 달성할 수 있습니다.

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

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 언어를 교체하기 위해 최선을 다하고 있습니다. 자세한 내용은 다음을 참조하세요.Red Hat 블로그.

Red Hat 소개

Red Hat은 기업이 핵심 데이터 센터에서 네트워크 에지에 이르기까지 플랫폼과 환경 전반에서 더 쉽게 작업할 수 있도록 강화된 솔루션을 제공합니다.

© 2024 Red Hat, Inc.