How to run DPDK in k8s - A single container in a pod
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를 만들어 사용할 수 있다.
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에서 실행하는 것과 동일하다.
Simplified view
Reference
https://github.com/cychong47/how-to-share-hugepage-in-k8s/tree/main/one-container-in-a-single-pod
#til #dpdk #hugepage #kubernetes