K8s Network
    Cilium CNI는 eBPF 프로그래밍 기술을 활용한 고성능 네트워크 솔루션입니다.
eBPF는 Linux OS의 커널단과 같이 권한이 존재하는 Context에서 샌드박스 프로그램을 실행할 수 있는 기술입니다.
iptables를 eBPF로 전환하는 이유가 무엇일까요?
이는 iptables의 몇가지 단점에서 비롯됩니다.
iptables
첫번째 단점
iptables는 클라이언트가 요청한 사항에 대하여, iptables에 설정된 규칙들을 찾을 때까지 평가합니다.
즉, 컨테이너 환경과 같이 무수한 파드, 서비스가 존재할 수록 iptables의 규칙은 늘어나며, 네트워크 성능이 하락합니다.
두번째 단점
iptables는 규칙 추가 시, iptables의 전체 규칙을 수정해야합니다.
이는 파드, 서비스가 많아질 수록 수정되는 시간이 증가됩니다.
k8s 환경에서, 컨테이너는 빈번하게 배포되고, 사라집니다. 즉, 파드에 할당된 IP 주소또한 매번 달라지기에, 위와 같은 단점들로 인하여 현대 워크로드에서는 지양됩니다.
eBPF
그렇다면, eBPF는 어떤 장점이 있어서 전환되고 있는 것일까요?
바로, 샌드박스 형태의 프로그램이기에 그렇습니다.
샌드박스 형태로 인하여, 파일 및 시스템이 다른 부분에 영향을 끼치지 않습니다.
즉, 커널 소스 코드 변경 및 커널 모듈을 로드할 필요없이 기능을 확장할 수 있는 것입니다.
Cilium CNI는 eBPF 기술을 통한 컨테이너 라우팅을 사용자가 쉽게 적용하도록 합니다.

cilium은 네트워크, 보안, 관찰 가능성(Observability)와 같이 3가지의 강력한 기능을 제공합니다.
이때, 3가지의 기능을 안정적이게 수행하기 위해서 고안된 4가지의 구성요소가 존재합니다.
cillum 설치시, envoy, operator 등의 컴포넌트들이 설치됨을 확인 가능합니다.

Cilium은 Overlay(VXLAN) 및 Underlay(Native-routing) 모드를 둘 다 지원합니다.

여러가지 자료들을 취합하여 정리한 VXLAN/Native-routing Use case입니다.
참고용으로 살펴보시면 좋을 것 같습니다.
VXLAN
Native-routing
Cilium 설치시, 기본적으로 아래 3개의 NIC가 생성됩니다.
이때, cilium_net, cilium_host는 veth 쌍이며, 파드의 게이트웨이 역할을 수행합니다.

Cilium은 파드가 생성되면, lxc 인터페이스를 생성하여 파드에 할당합니다.
해당 인터페이스를 통해 파드는 통신이 가능해지게 됩니다.

Cilium은 Pod가 생성되면 자동적으로 lxc NIC를 생성한다고 했었습니다.
정말로 그런지 검증해보도록 하겠습니다.
테스트 파드를 생성합니다.
kubectl run testpod --image=nginx --restart=Never
파드의 ip와 생성된 node 위치를 파악합니다.
kubectl get pod testpod -o wide
파드가 생성된 노드의 할당된 cilium pod를 확인합니다.
#본인의 경우 kubectl -n kube-system get pod -l k8s-app=cilium -owide
cilium pod로 접근합니다.
kubectl -n kube-system exec -it cilium-kwtz9 -- bash
파드의 ip와 동일한 엔드포인트 리스트를 확인합니다.
cilium endpoint list
엔드포인트의 정보를 불러옵니다.
networking 항목에서 엔드포인트와 연결된 lxc NIC 명 확인 가능
cilium endpoint get <endpoint>
worker2 node로 접근하여, lxc NIC를 확인해보니 확인된 정보로 Pod와 매핑됨을 알 수 있습니다.

파드 삭제시,

매핑된 lxc NIC가 삭제됨을 확인 가능합니다.

