[Home-K8S] #22 FluxCD 계층과 분리 / 다중 클러스터 리소스 공유와 설정 분리
FluxCD - yaml 앞서 fluxcd 를 이용해서 helm chart 를 구성했습니다. 그 외에 일반적인 yaml
NIC은 기본적으로 모든 프레임을 읽고, 자신의 MAC, 브로드/멀티캐스트에 해당하는 프레임만 가져옵니다.
(Promiscuous mode 에서는 모든 프레임을 가져옵니다. ex. TCPDUMP, Wireshark)
일반 NIC은 프로세서가 없기에 NIC 자체 처리는 한계가 있고, 일단 프레임을 수신하면 저장을 해야 처리를 할 수 있습니다.
(프로세서·메모리·HW 가속기를 추가한 프로그래밍 가능한 Smart NIC 도 있습니다. )
NIC이 부팅되면서 드라이버가 메모리에 페이지를 할당하고, 그 주소를 NIC 레지스터에 등록합니다. 이 페이지들의 배열을 Rx ring 이라고 합니다.
Rx Ring에 직접 데이터를 저장하는 것은 아니고, Rx Ring에는 패킷을 저장할 페이지의 주소, 길이, 플래그가 저장되어 있습니다. 패킷의 CRC를 확인하고 페이지에 저장하고 나면 플래그에 Done을 입력해서 알게 합니다.
RX ring은 DMA를 이용해서 직접 데이터를 복사했지요. RX ring의 플래그 값에 Done이후에 memcpy로 CPU가 skb를 만들게 됩니다. NAPI poll 에서 batch로 할당하기도 합니다.
만들어진 skb 값은 페이지에 대한 값과 패킷의 헤더를 찾기 위한 길이, 오프셋 등 메타데이터가 들어가게 됩니다. 보통 1 Rx descriptor -> 1 sk_buff로 descriptor, page, sk_buff는 재사용 됩니다.
이렇게 저장된 sk_buff를 라우팅, NAT, netfilter, QoS, TCP 스택까지 전부 사용하게 됩니다.
NIC에서 저장한 DMA Data Buffer는 커널이 아닌 User(Bash,Python 등)에서 접근할 수 없어서 User 버퍼로 복사하는 과정이 하나 더 필요합니다.
이 과정 없이 유저 버퍼로 보내는 기술이 몇가지 있는데, AF_XDP zero-copy, io_uring ZC Rx, DPDK 입니다.
직접 구현하기 위해서는 프로토콜 처리, 보안/필터링, 메모리 접근 등의 처리가 필요합니다. 향후 다른 포스팅을 이용해서 작성하겠습니다.
NIC에서 받은 패킷들의 실제 데이터는 DMA Data Buffer에 저장되고, sk_buff에 위치, 크기 등 메타데이터를 가지고 있게 됩니다.
Comments