에어갭 Kubernetes 플랫폼 구축 및 개발자 경험 혁신
VDI 리소스 부족으로 빌드조차 불가능했던 환경을 Kubernetes 기반 개인 개발환경으로 전환했습니다. 동적 와일드카드 도메인(*.dev.example.com)으로 10명 개발자별 독립 환경을 제공하고, JetBrains Remote Debug를 지원했습니다. PoC 도입 후 정식 사업으로 확대 결정되었습니다.
Architecture
동기
개발자가 자기 코드를 확인하려면 VDI 안에서 빌드를 돌려야 했는데, CPU 와 메모리가 모자라 한 번에 한 시간 넘게 걸렸습니다. 고쳐 보고 다시 돌리는 주기가 그 길이면 확인 자체를 미루게 됩니다.
VDI 를 키우는 쪽은 인프라 수준에서 막혀 있었습니다. 리소스를 떼어 줄 수 있는 권한은 Kubernetes 를 운영하는 팀에 있었고, 그래서 여유 있는 서버에서 빌드하고 결과만 개발자에게 돌려주는 그림이 나왔습니다.
요구가 하나 더 있었습니다. 개발자 열 명이 각자 자기 리뷰 환경을 띄울 수 있어야 한다는 것입니다. 같은 애플리케이션을 열 벌 띄우고 각각에 접근 경로를 주는 일이라, 한 대를 크게 만드는 것으로는 안 되고 여러 벌을 싸게 찍어 낼 수 있는 쪽이어야 했습니다.
내가 담당한 트랙
에어갭 클러스터 구축부터 진입 구성, 골든 이미지, Harbor, 관측 스택, GitLab CI 파이프라인, 개발자별 환경까지 전부 제가 했습니다. 항목별 내역은 오른쪽 「주요 업무」에 있습니다.
| 트랙 | 경계 |
|---|---|
| Jenkins 쪽 | 다른 담당이었습니다 |
폐쇄망에 클러스터를 세우는 일
가장 손이 많이 간 곳입니다. 평소에 한 줄로 끝나는 설치가 폐쇄망에서는 전부 반입 문제로 바뀝니다. kubeadm 이 받아 오려는 컨트롤 플레인 이미지, CNI, Ingress 컨트롤러, cert-manager, 관측 스택까지 필요한 것을 미리 세어서 들고 들어가야 하고, 하나가 빠지면 그 자리에서 멈춥니다. Harbor 를 먼저 세운 것도 그래서입니다. 반입한 이미지를 놓을 자리가 없으면 그다음 단계가 성립하지 않습니다.
이미 로드밸런서가 있는 망
베어메탈 Kubernetes 에서 LoadBalancer 타입 서비스를 쓰려면 그 IP 를 네트워크에 알려 줄 물건이 따로 있어야 합니다. 흔히 쓰는 MetalLB 는 그 방법이 둘인데, 노드 한 대가 ARP 로 해당 IP 의 소유권을 주장하거나(같은 L2 안이어야 하고 트래픽도 그 한 대로 몰립니다), 노드들이 라우터와 BGP 를 맺어 경로를 광고하는 것입니다. 둘 다 네트워크 쪽에서 무언가를 열어 줘야 열립니다.
고객사에는 이미 L4 스위치가 있었습니다. VIP 를 들고 헬스체크를 하고 분산까지 하던 장비라, 클러스터가 로드밸런서를 하나 더 만들어 내겠다고 하면 같은 일을 하겠다는 주체가 둘이 됩니다.
그래서 방향을 뒤집었습니다. 서비스를 NodePort 로 모든 노드의 같은 포트에 열고, 기존 L4 스위치가 그 노드들을 자기 서버 풀로 잡게 했습니다. 분산과 헬스체크는 원래 하던 장비가 그대로 하고, 클러스터는 똑같이 생긴 진입점을 여러 개 내주는 쪽이 됩니다.
여기서 시간이 걸린 건 설정이 아니라 이해였습니다. L4 는 제 담당 계층이 아니어서 그 장비가 무엇을 보장하고 무엇을 안 하는지를 먼저 알아야 했고, 그걸 알기 전까지는 어느 쪽으로 붙일지 결론이 안 났습니다.
개발자별 리뷰 환경
열 명에게 각자 네임스페이스를 주고, 접근은 와일드카드 도메인으로 갈랐습니다. *.dev.example.com 이 L4 의 VIP 로 떨어지고 NodePort 를 거쳐 NGINX Ingress 가 Host 헤더를 보고 해당 개발자의 네임스페이스로 넘깁니다.
인증서는 와일드카드 한 장으로 끝나는데, Ingress 는 TLS 시크릿을 자기 네임스페이스 안에서만 찾습니다. 개발자마다 인증서를 따로 발급하면 관리 대상이 열 배가 되므로, reflector 로 한 장을 각 네임스페이스에 복제해 넣었습니다.
디버깅도 열어 뒀습니다. 폐쇄망 안에서 컨테이너에 붙는 경로가 없으면 로그만 보고 추측하게 되는데, 개발자 네임스페이스에 pods/portforward 권한을 주면 JetBrains 가 포트포워딩으로 JDWP 에 붙어 브레이크포인트를 걸 수 있습니다. 그전까지 폐쇄망에서는 안 되던 일이라 반응이 컸습니다.
배운 점
- 폐쇄망에서 Kubernetes 를 세우고 개발자마다 리뷰 환경을 띄워 준 것, 그리고 그걸 쓴 개발자들이 좋아한 것이 이 프로젝트에서 제일 기억에 남습니다. 빌드 한 번에 한 시간을 쓰던 사람들이라 체감이 즉시 왔습니다.
- 결론이 제 담당 계층 밖에서 정해지는 경우가 있습니다. 여기서는 클러스터를 어떻게 짜느냐가 아니라 고객사 L4 가 이미 무엇을 하고 있느냐가 진입 구조를 정했고, 그쪽을 이해하기 전까지는 제 쪽에서 고를 수 있는 선택지가 뭔지도 몰랐습니다.