9.4. 커널 액세스를 통해 루트리스 DPDK 워크로드를 실행하기 위해 TAP CNI 사용


DPDK 애플리케이션은 virtio-user를 예외 경로로 사용하여 로그 메시지와 같은 특정 유형의 패킷을 커널에 주입하여 처리할 수 있습니다. 이 기능에 대한 자세한 내용은 Virtio_user를 예외 경로로 참조하세요.

OpenShift Container Platform 버전 4.14 이상에서는 권한이 없는 Pod를 사용하여 Tap CNI 플러그인과 함께 DPDK 애플리케이션을 실행할 수 있습니다. 이 기능을 사용하려면 SriovNetworkNodePolicy 개체 내에서 needVhostNet 매개변수를 true 로 설정하여 vhost-net 장치를 마운트해야 합니다.

그림 9.1. DPDK 및 TAP 구성 예시

사전 요구 사항

  • OpenShift CLI(oc)가 설치되어 있습니다.
  • SR-IOV Network Operator가 설치되어 있습니다.
  • cluster-admin 권한이 있는 사용자로 로그인했습니다.
  • 모든 노드에서 setsebools container_use_devices=on 이 루트로 설정되어 있는지 확인하세요.

    참고

    SELinux 부울 값을 설정하려면 Machine Config Operator를 사용하세요.

프로세스

  1. 다음 예시와 같은 내용을 포함하는 test-namespace.yaml 과 같은 파일을 만듭니다.

    apiVersion: v1
    kind: Namespace
    metadata:
      name: test-namespace
      labels:
        pod-security.kubernetes.io/enforce: privileged
        pod-security.kubernetes.io/audit: privileged
        pod-security.kubernetes.io/warn: privileged
        security.openshift.io/scc.podSecurityLabelSync: "false"
    Copy to Clipboard Toggle word wrap
  2. 다음 명령을 실행하여 새 네임스페이스 객체를 만듭니다.

    $ oc apply -f test-namespace.yaml
    Copy to Clipboard Toggle word wrap
  3. 다음 예시와 같은 내용을 포함하는 sriov-node-network-policy.yaml 과 같은 파일을 만듭니다.

    apiVersion: sriovnetwork.openshift.io/v1
    kind: SriovNetworkNodePolicy
    metadata:
     name: sriovnic
     namespace: openshift-sriov-network-operator
    spec:
     deviceType: netdevice 
    1
    
     isRdma: true 
    2
    
     needVhostNet: true 
    3
    
     nicSelector:
       vendor: "15b3" 
    4
    
       deviceID: "101b" 
    5
    
       rootDevices: ["00:05.0"]
     numVfs: 10
     priority: 99
     resourceName: sriovnic
     nodeSelector:
        feature.node.kubernetes.io/network-sriov.capable: "true"
    Copy to Clipboard Toggle word wrap
    1
    이는 해당 프로필이 Mellanox 네트워크 인터페이스 컨트롤러(NIC)에 맞게 특별히 제작되었음을 나타냅니다.
    2
    isRdma를 true 로 설정하는 것은 Mellanox NIC에만 필요합니다.
    3
    이렇게 하면 /dev/net/tun/dev/vhost-net 장치가 컨테이너에 마운트되어 애플리케이션이 탭 장치를 생성하고 해당 탭 장치를 DPDK 워크로드에 연결할 수 있습니다.
    4
    선택 사항: SR-IOV 네트워크 장치의 벤더 16진수 코드입니다. 값 15b3은 Mellanox NIC와 연결됩니다.
    5
    선택사항: SR-IOV 네트워크 장치의 장치 16진수 코드입니다.
  4. 다음 명령을 실행하여 SriovNetworkNodePolicy 오브젝트를 생성합니다.

    $ oc create -f sriov-node-network-policy.yaml
    Copy to Clipboard Toggle word wrap
  5. 다음 SriovNetwork 객체를 만든 다음 YAML을 sriov-network-attachment.yaml 파일에 저장합니다.

    apiVersion: sriovnetwork.openshift.io/v1
    kind: SriovNetwork
    metadata:
     name: sriov-network
     namespace: openshift-sriov-network-operator
    spec:
     networkNamespace: test-namespace
     resourceName: sriovnic
     spoofChk: "off"
     trust: "on"
    Copy to Clipboard Toggle word wrap
    참고

    SriovNetwork의 각 옵션에 대한 자세한 설명은 " SR-IOV 추가 네트워크 구성" 섹션을 참조하십시오.

    선택적 라이브러리인 app-netutil은 컨테이너의 상위 pod에 대한 네트워크 정보를 수집하기 위한 여러 API 메서드를 제공합니다.

  6. 다음 명령을 실행하여 SriovNetwork 오브젝트를 생성합니다.

    $ oc create -f sriov-network-attachment.yaml
    Copy to Clipboard Toggle word wrap
  7. 다음 예시와 같은 내용으로 네트워크 연결 정의를 정의하는 tap-example.yaml 과 같은 파일을 만듭니다.

    apiVersion: "k8s.cni.cncf.io/v1"
    kind: NetworkAttachmentDefinition
    metadata:
     name: tap-one
     namespace: test-namespace 
    1
    
    spec:
     config: '{
       "cniVersion": "0.4.0",
       "name": "tap",
       "plugins": [
         {
            "type": "tap",
            "multiQueue": true,
            "selinuxcontext": "system_u:system_r:container_t:s0"
         },
         {
           "type":"tuning",
           "capabilities":{
             "mac":true
           }
         }
       ]
     }'
    Copy to Clipboard Toggle word wrap
    1
    SriovNetwork 개체가 생성된 것과 동일한 target_namespace를 지정합니다.
  8. 다음 명령을 실행하여 NetworkAttachmentDefinition 객체를 만듭니다.

    $ oc apply -f tap-example.yaml
    Copy to Clipboard Toggle word wrap
  9. 다음 예시와 같은 내용을 포함하는 dpdk-pod-rootless.yaml 과 같은 파일을 만듭니다.

    apiVersion: v1
    kind: Pod
    metadata:
      name: dpdk-app
      namespace: test-namespace 
    1
    
      annotations:
        k8s.v1.cni.cncf.io/networks: '[
          {"name": "sriov-network", "namespace": "test-namespace"},
          {"name": "tap-one", "interface": "ext0", "namespace": "test-namespace"}]'
    spec:
      nodeSelector:
        kubernetes.io/hostname: "worker-0"
      securityContext:
          fsGroup: 1001 
    2
    
          runAsGroup: 1001 
    3
    
          seccompProfile:
            type: RuntimeDefault
      containers:
      - name: testpmd
        image: <DPDK_image> 
    4
    
        securityContext:
          capabilities:
            drop: ["ALL"] 
    5
    
            add: 
    6
    
              - IPC_LOCK
              - NET_RAW #for mlx only 
    7
    
          runAsUser: 1001 
    8
    
          privileged: false 
    9
    
          allowPrivilegeEscalation: true 
    10
    
          runAsNonRoot: true 
    11
    
        volumeMounts:
        - mountPath: /mnt/huge 
    12
    
          name: hugepages
        resources:
          limits:
            openshift.io/sriovnic: "1" 
    13
    
            memory: "1Gi"
            cpu: "4" 
    14
    
            hugepages-1Gi: "4Gi" 
    15
    
          requests:
            openshift.io/sriovnic: "1"
            memory: "1Gi"
            cpu: "4"
            hugepages-1Gi: "4Gi"
        command: ["sleep", "infinity"]
      runtimeClassName: performance-cnf-performanceprofile 
    16
    
      volumes:
      - name: hugepages
        emptyDir:
          medium: HugePages
    Copy to Clipboard Toggle word wrap
    1
    SriovNetwork 개체가 생성된 것과 동일한 target_namespace를 지정합니다. 다른 네임스페이스에 Pod를 만들려면 Pod 사양과 SriovNetwork 개체 모두에서 target_namespace를 변경합니다.
    2
    볼륨에 마운트된 디렉토리와 해당 볼륨에 생성된 파일의 그룹 소유권을 설정합니다.
    3
    컨테이너를 실행하는 데 사용되는 기본 그룹 ID를 지정합니다.
    4
    애플리케이션이 포함된 DPDK 이미지와 애플리케이션에서 사용하는 DPDK 라이브러리를 지정합니다.
    5
    컨테이너의 securityContext에서 모든 기능( ALL )을 제거한다는 것은 컨테이너가 일반 작업에 필요한 것 이상의 특별한 권한을 갖지 않는다는 것을 의미합니다.
    6
    hugepage 할당, 시스템 리소스 할당 및 네트워크 인터페이스 액세스를 위해 컨테이너 내부의 애플리케이션에 필요한 추가 기능을 지정합니다. 이러한 기능도 setcap 명령을 사용하여 바이너리 파일에 설정해야 합니다.
    7
    Mellanox 네트워크 인터페이스 컨트롤러(NIC)에는 NET_RAW 기능이 필요합니다.
    8
    컨테이너를 실행하는 데 사용되는 사용자 ID를 지정합니다.
    9
    이 설정은 포드 내의 컨테이너에 호스트 시스템에 대한 특권 액세스 권한이 부여되지 않아야 함을 나타냅니다.
    10
    이 설정을 사용하면 컨테이너가 처음에 할당받은 루트가 아닌 권한보다 더 높은 권한으로 권한을 확대할 수 있습니다.
    11
    이 설정은 컨테이너가 루트가 아닌 사용자로 실행되도록 보장합니다. 이를 통해 최소 권한의 원칙을 강화하고 컨테이너가 손상될 수 있는 잠재적 영향을 제한하며 공격 표면을 줄이는 데 도움이 됩니다.
    12
    DPDK 포드의 /mnt/huge 아래에 hugepage 볼륨을 마운트합니다. hugepage 볼륨은 매체가 Hugepages인 emptyDir 볼륨 유형으로 지원됩니다.
    13
    선택 사항: DPDK 포드에 할당된 DPDK 장치 수를 지정합니다. 명시적으로 지정하지 않으면 이 리소스 요청 및 제한은 SR-IOV 네트워크 리소스 인젝터에 의해 자동으로 추가됩니다. SR-IOV 네트워크 리소스 인젝터는 SR-IOV Operator에서 관리하는 승인 컨트롤러 구성 요소입니다. 기본적으로 활성화되어 있으며 기본 SriovOperatorConfig CR에서 enableInjector 옵션을 false로 설정하여 비활성화할 수 있습니다.
    14
    CPU 수를 지정합니다. DPDK pod는 일반적으로 kubelet에서 배타적 CPU를 할당해야 합니다. 이를 위해 CPU 관리자 정책을 static으로 설정하고 QoS가 보장된 Pod를 생성합니다.
    15
    hugepage 크기 hugepages-1Gi 또는 hugepages-2Mi를 지정하고 DPDK Pod에 할당할 hugepage 수량을 지정합니다. 2Mi1Gi hugepage를 별도로 구성합니다. 1Gi hugepage를 구성하려면 커널 인수를 노드에 추가해야 합니다. 예를 들어, 커널 인수 default_hugepagesz = 1GB, hugepagesz = 1Ghugepages = 16을 추가하면 시스템 부팅 시 16 * 1Gi hugepage가 할당됩니다.
    16
    성능 프로필 이름이 cnf-performance profile 이 아닌 경우 해당 문자열을 올바른 성능 프로필 이름으로 바꾸세요.
  10. 다음 명령을 실행하여 DPDK Pod를 생성합니다.

    $ oc create -f dpdk-pod-rootless.yaml
    Copy to Clipboard Toggle word wrap
맨 위로 이동
Red Hat logoGithubredditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

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

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

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

Red Hat 소개

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

Theme

© 2025 Red Hat