에어갭 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 가 이미 무엇을 하고 있느냐가 진입 구조를 정했고, 그쪽을 이해하기 전까지는 제 쪽에서 고를 수 있는 선택지가 뭔지도 몰랐습니다.