10.21. 가상 머신 네트워킹

10.21.1. 기본 Pod 네트워크에 대한 가상 머신 구성

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

참고

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

10.21.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 사이의 숫자여야 합니다. 포트 배열을 사용하지 않으면 유효한 범위의 모든 포트가 들어오는 트래픽에 대해 열려 있습니다. 이 예에서 들어오는 트래픽은 포트 80 에서 허용됩니다.
    참고

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

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

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

10.21.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.21.2. 가상 머신 노출 서비스 생성

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

10.21.2.1. 서비스 정보

Kubernetes 서비스는 포드 집합에서 실행되는 애플리케이션을 네트워크 서비스로 노출하는 추상 방법입니다. 서비스를 사용하면 애플리케이션이 트래픽을 수신할 수 있습니다. Service 오브젝트에 spec.type 을 지정하여 다양한 방식으로 서비스를 노출할 수 있습니다.

ClusterIP
클러스터 내의 내부 IP 주소에 서비스를 노출합니다. ClusterIP 는 기본 서비스 유형 입니다.
NodePort
클러스터에서 선택한 각 노드의 동일한 포트에 서비스를 노출합니다. NodePort 를 사용하면 클러스터 외부에서 서비스에 액세스할 수 있습니다.
LoadBalancer

현재 클라우드에서 외부 로드 밸런서를 생성하고(지원되는 경우) 고정 외부 IP 주소를 서비스에 할당합니다.

참고

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

10.21.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.21.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.21.2.3. 추가 리소스

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

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

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

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

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

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

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

10.21.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.21.3.2. Linux 브리지 네트워크 연결 정의 생성

주의

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

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

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

절차

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

    참고

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

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

    참고

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

10.21.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.21.3.3. Linux 브리지 네트워크에 대한 가상 머신 구성

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

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

사전 요구 사항

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

절차

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

이름

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

모델

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

네트워크

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

유형

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

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

MAC 주소

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

10.21.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.21.4. SR-IOV 네트워크에 가상 머신 연결

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

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

10.21.4.1. 사전 요구 사항

10.21.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 수는 128보다 클 수 없습니다.
    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. 선택 사항: SriovNetworkNodePolicy.Spec.NodeSelector 로 레이블이 없는 경우 SR-IOV 가능 클러스터 노드에 레이블을 지정합니다. 노드에 레이블을 지정하는 방법에 대한 자세한 내용은 "노드에서 라벨을 업데이트하는 방법"을 참조하십시오.
  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.21.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.21.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.21.5. 서비스 메시에 가상 머신 연결

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

10.21.5.1. 사전 요구 사항

10.21.5.2. 서비스 메시에 대한 가상 머신 구성

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

사전 요구 사항

  • 포트 충돌을 방지하려면 Istio 사이드카 프록시에서 사용하는 포트를 사용하지 마십시오. 여기에는 포트 15000, 15001, 15006, 15008, 15020, 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
    서비스에서 대상으로 하는 Pod 세트를 결정하는 서비스 선택기입니다. 이 속성은 VM 구성 파일의 spec.metadata.labels 필드에 해당합니다. 위의 예에서 vm-istio라는 Service 오브젝트는 app= vm-istio 레이블이 있는 모든 포드에서 TCP 포트 8080을 대상으로 합니다.
  4. 서비스를 생성합니다.

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

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

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

10.21.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.21.7. 가상 머신에서 NIC의 IP 주소 보기

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

10.21.7.1. 사전 요구 사항

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

10.21.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.21.7.3. 웹 콘솔에서 가상 머신 인터페이스의 IP 주소 보기

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

절차

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

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

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

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

10.21.8.1. About KubeMacPool

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

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

참고

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

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

10.21.8.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.21.8.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-