GitHub가 eBPF로 배포 안전성을 높이는 방법
핵심 내용
GitHub는 eBPF로 배포 스크립트의 숨은 의존성을 차단해 장애 복구를 안전하게 만들었다.
자세히 보기
GitHub는 자체 코드가 모두 github.com에 올라가 있는 구조에서 생기는 순환 의존성 문제를 줄이기 위해, 배포 스크립트의 네트워크 동작을 eBPF로 통제했다.
가장 큰 문제는 단순히 GitHub에 접근할 수 없을 때만이 아니라, 배포 스크립트가 내부 서비스나 외부 바이너리에 기대며 직접 의존성, 숨은 의존성, 일시적 의존성을 만들어 내는 경우였다. 특히 상태가 있는 호스트는 고객 트래픽도 처리하므로, github.com 전체를 막는 방식은 사용할 수 없었다.
이를 해결하기 위해 GitHub는 특정 프로세스만 격리한 cGroup에 eBPF 프로그램을 붙여, 배포 스크립트의 egress 트래픽을 선택적으로 감시하고 차단하는 방식을 만들었다. PoC는 cilium/ebpf를 사용한 Go 코드로 구성됐고, BPF_PROG_TYPE_CGROUP_SKB를 통해 패킷을 추적하는 형태였다.
DNS 차단은 한 단계 더 정교하게 처리했다. BPF_PROG_TYPE_CGROUP_SOCK_ADDR로 connect4 호출을 가로채 DNS 요청을 localhost:53의 사용자 공간 DNS 프록시로 돌린 뒤, 프록시가 블록리스트를 기준으로 허용 여부를 판단하고 eBPF Maps와 연동해 차단을 수행했다.
여기에 더해 GitHub는 차단된 요청이 어떤 명령에서 비롯됐는지도 추적했다.
- DNS transaction ID와 PID를 eBPF Map에 기록
/proc/{PID}/cmdline에서 실제 실행 명령을 확인WARN DNS BLOCKED ...형식의 로그로 팀에 원인 전달
이 방식으로 배포 중 접촉한 도메인 감사 목록을 남기고, 문제를 일으키는 의존성을 팀에 바로 알려줄 수 있게 됐다. 동시에 cGroup을 이용해 CPU와 memory 제한까지 적용해, 배포 스크립트가 워크로드에 악영향을 주는 것도 막는다.
이 순환 의존성 탐지 체계는 6개월 롤아웃을 거쳐 운영 중이며, 새로운 의존성이 생기거나 기존 도구가 외부 의존성을 추가해도 자동으로 감지해 팀에 알린다. 결과적으로 GitHub는 더 안정적으로 배포할 수 있고, 장애 시 복구 시간도 줄어들었다.
이 한국어 요약은 AI가 자동으로 만들었습니다. 원문의 주장과 맥락은 원문에서 확인해 주세요. 저작권은 원저작자에게 있습니다.