How to run DPDK in k8s - A single container in a pod

Page content

How to run DPDK application in Kubernetes environment

Kubernetes에서 DPDK application을 실행하기 위해서는 DPDK application이 포함된 container에 runtime config 파일이 저장될 /var/run/dpdk 디렉토리와 hugetlbfs 형태로 hugepage가 존재해야 한다. 이 중 /var/run/dpdk는 container 가 갖는 file system에 생성되는 기본 linux directory인 /var/run 아래 위치하므로, DPDK application이 실행되면서 디렉토리를 생성한다.

반면, hugetblfs 디렉토리은 kubernetes의 volume 에서 제공하는 emptyDir을 사용하면 Pod와 lifecycle을 함께 하는 hugepage를 만들어 사용할 수 있다.

2022-03-14-dpdk-hugepage-1c-1p-1.png

Container에서 hugepage를 할당받기 위해서는 다음과 같이 container spec에 요구하는 hugepage 크기를 명시한다.

containers:
  resource:
    limits:
      hugepage-2Mi: 100Mi

다음과 같이 pod에서만 사용할 emptyDir 종류의 Hugepage volume을 만든다.

volume:  
 - name: hugepage
   emptryDir: 
     medium: HugePages

emptyDir 종류의 volume은 위와 같이 명시적으로 medium을 지정하지 않으면 기본값인 tmpfs를 사용한다. (tmpfs는 ram disk 기반)

hugepage volume을 container에 mount하는 방법은 일반적인 volume mount와 동일하다.

volumeMounts:
 - mountPath: /hugepages
   name: hugepage

위 예에서는 hugepage volume을 /hugepages 위치에 마운트 시키는 것으로, pod에서 확인하면 다음과 같이 hugetlbfs 파일시스템으로 마운트 된 것을 알 수 있다.

root@hugepage-1c-1p:/# grep hugetlbfs /proc/mounts 
nodev /hugepages hugetlbfs rw,relatime,pagesize=2M 0 0

Two DPDK applications in the same container

두 개의 DPDK process를 하나의 container에서 실행하는 것은 하나의 DPDK process를 하나의 container에서 실행하는 것과 동일하다.

2022-03-14-dpdk-hugepage-1c-1p-2.png

Simplified view

2022-03-14-dpdk-hugepage-1c-1p-3.png

2022-03-14-dpdk-hugepage-1c-1p-4.png

Reference

https://github.com/cychong47/how-to-share-hugepage-in-k8s/tree/main/one-container-in-a-single-pod

#til #dpdk #hugepage #kubernetes