eBPF 데이터패스 소개
eBPF 데이터패스 소개 (Introduction)
Linux 커널은 네트워킹 스택에 BPF 훅 집합을 제공하며, Cilium 데이터패스는 이 훅들을 사용해 BPF 프로그램을 로드합니다. 이 글에서는 Cilium이 사용하는 각 BPF 훅과 그 위에 구축되는 네트워킹 객체들을 설명할게요.
출처: Introduction
본문
Linux 커널은 네트워킹 스택에 BPF 프로그램을 실행하는 데 사용할 수 있는 BPF 훅 집합을 지원합니다. Cilium 데이터패스는 이 훅들을 사용해 함께 사용할 때 더 높은 수준의 네트워킹 구성을 만드는 BPF 프로그램을 로드해요.
다음은 Cilium이 사용하는 훅 목록과 간단한 설명입니다. 각 훅의 특수성에 대한 더 자세한 문서는 BPF and XDP Reference Guide를 참고하세요.
- XDP: XDP BPF 훅은 네트워킹 드라이버에서 가능한 가장 이른 지점에 있으며 패킷 수신 시 BPF 프로그램 실행을 트리거합니다. 프로그램이 다른 처리가 발생하기 전에 패킷 데이터에서 직접 실행되므로 최상의 패킷 처리 성능을 달성합니다. 이 훅은 악의적이거나 예기치 않은 트래픽을 드롭하는 필터링 프로그램과 일반적인 DDOS 보호 메커니즘을 실행하는 데 이상적입니다.
- Traffic Control Ingress/Egress: traffic control (tc) ingress 훅에 연결된 BPF 프로그램은 XDP와 마찬가지로 네트워킹 인터페이스에 연결되지만, 네트워킹 스택이 패킷의 초기 처리를 수행한 후 실행됩니다. 이 훅은 스택의 L3 계층 전에 실행되지만 패킷과 관련된 대부분의 메타데이터에 접근할 수 있어요. 로컬 노드 처리를 수행하는 데 이상적이며, 예를 들어 L3/L4 엔드포인트 정책을 적용하고 트래픽을 엔드포인트로 리다이렉트할 수 있습니다. 네트워크 대면 장치의 경우 tc ingress 훅은 위의 XDP 훅과 결합할 수 있습니다. 이렇게 하면 이 시점의 트래픽 대부분이 정상이고 호스트로 향한다고 가정하는 것이 합리적입니다.
- Socket operations: socket operations 훅은 특정 cgroup에 연결되고 TCP 이벤트에서 실행됩니다. Cilium은 루트 cgroup에 BPF socket operations 프로그램을 연결하고 이를 사용해 TCP 상태 전환, 특히 ESTABLISHED 상태 전환을 모니터링합니다. 소켓이 ESTABLISHED 상태로 전환될 때 TCP 소켓에 노드 로컬 피어(아마도 로컬 프록시)가 있으면 socket send/recv 프로그램이 연결됩니다.
- Socket send/recv: socket send/recv 훅은 TCP 소켓이 수행하는 모든 send 작업에서 실행됩니다. 이 시점에서 훅은 메시지를 검사하고 메시지를 드롭하거나, TCP 계층으로 보내거나, 다른 소켓으로 리다이렉트할 수 있어요. Cilium은 이를 사용해 아래 설명된 대로 데이터패스 리다이렉트를 가속화합니다.
위 훅들을 가상 인터페이스(cilium_host, cilium_net), 선택적 오버레이 인터페이스(cilium_vxlan), Linux 커널 암호화 지원, 사용자 공간 프록시(Envoy)와 결합해 Cilium은 다음 네트워킹 객체를 만듭니다.
- Prefilter: prefilter 객체는 XDP 프로그램을 실행하고 최고 성능을 위해 네트워크에서 트래픽을 필터링하는 데 사용되는 prefilter 규칙 집합을 제공합니다. 구체적으로 Cilium 에이전트가 공급하는 CIDR 맵 집합이 조회에 사용되고, 패킷은 예를 들어 목적지가 유효한 엔드포인트가 아닐 때 드롭되거나 스택이 처리하도록 허용됩니다. 필요에 따라 쉽게 확장해 새 prefilter 기준/능력을 구축할 수 있어요.
- Endpoint Policy: endpoint policy 객체는 Cilium 엔드포인트 적용을 구현합니다. 맵을 사용해 패킷의 연관된 아이덴티티와 정책을 조회하며, 이 계층은 많은 엔드포인트에 잘 확장됩니다. 정책에 따라 이 계층은 패킷을 드롭하거나, 로컬 엔드포인트로 전달하거나, service 객체로 전달하거나, 추가 L7 규칙을 위해 L7 Policy 객체로 전달할 수 있어요. 이것은 패킷을 아이덴티티에 매핑하고 L3 및 L4 정책을 적용하는 역할을 담당하는 Cilium 데이터패스의 기본 객체입니다.
- Service: Service 객체는 객체가 수신하는 모든 패킷에 대해 목적지 IP와 선택적으로 목적지 포트에 대한 맵 조회를 수행합니다. 일치하는 항목이 발견되면 패킷은 구성된 L3/L4 엔드포인트 중 하나로 전달됩니다. Service 블록은 TC ingress 훅을 사용해 모든 인터페이스에서 독립형 로드 밸런서를 구현하거나 endpoint policy 객체에 통합될 수 있어요.
- L3 Encryption: 인그레스에서 L3 Encryption 객체는 복호화를 위해 패킷을 표시하고, 복호화를 위해 패킷을 Linux xfrm(transform) 계층으로 전달하며, 패킷이 복호화된 후 객체가 패킷을 받아 다른 객체가 추가 처리할 수 있도록 스택 위로 전달합니다. 모드(직접 라우팅 또는 오버레이)에 따라 BPF 꼬리 호출 또는 패킷을 다음 객체로 전달하는 Linux 라우팅 스택일 수 있어요. 복호화에 필요한 키는 IPsec 헤더에 인코딩되어 있어 인그레스에서 복호화 키를 찾기 위한 맵 조회를 할 필요가 없습니다. 이그레스에서는 먼저 목적지 IP를 사용해 맵 조회를 수행해 패킷을 암호화해야 하는지, 그렇다면 목적지 노드에서 어떤 키를 사용할 수 있는지 확인합니다. 두 노드 모두에서 사용 가능한 가장 최근 키가 선택되고 패킷이 암호화로 표시됩니다. 그런 다음 패킷은 암호화되는 Linux xfrm 계층으로 전달됩니다. 이제 암호화된 패킷을 받으면 라우팅을 위해 Linux 스택으로 보내거나 오버레이가 사용 중이면 직접 꼬리 호출을 수행해 다음 계층으로 전달합니다.
- Socket Layer Enforcement: 소켓 계층 적용은 두 개의 훅(socket operations 훅과 socket send/recv 훅)을 사용해 L7 프록시를 포함한 Cilium이 관리하는 엔드포인트와 연관된 모든 TCP 소켓을 모니터링하고 연결합니다. socket operations 훅은 가속화할 후보 소켓을 식별합니다. 여기에는 모든 로컬 노드 연결(엔드포인트 간)과 Cilium 프록시에 대한 모든 연결이 포함됩니다. 식별된 연결은 모든 메시지가 socket send/recv 훅에 의해 처리됩니다. 빠른 리다이렉트는 Cilium에 구현된 모든 정책이 연관된 소켓/엔드포인트 매핑에 유효하도록 보장하며, 유효하다고 가정하면 메시지를 피어 소켓에 직접 보냅니다.
- L7 Policy: L7 Policy 객체는 프록시 트래픽을 Cilium 사용자 공간 프록시 인스턴스로 리다이렉트합니다. Cilium은 Envoy 인스턴스를 사용자 공간 프록시로 사용합니다. Envoy는 구성된 L7 정책에 따라 트래픽을 전달하거나 적절한 거부 메시지를 생성합니다.
이 구성 요소들은 연결되어 Cilium이 사용하는 유연하고 효율적된 데이터패스를 만듭니다. 아래에서는 단일 노드의 엔드포인트 연결, 엔드포인트로의 인그레스, 엔드포인트에서 egress 네트워킹 장치로의 가능한 흐름을 보여 줍니다. 각 경우에 소켓 계층 적용이 활성화될 때 사용 가능한 TCP 가속 경로를 보여주는 추가 다이어그램이 있어요.