베어메탈 Kubernetes 홈랩 구축 (A to Z)
PC 3대를 활용하여 MikroTik BGP+ECMP 네트워크, Cilium Gateway API, GPU 노드까지 갖춘 Kubernetes 클러스터를 베어메탈에 직접 구축해 상시 운영하는 사이드 프로젝트입니다.
Architecture
동기
빠르게 세우고 부수는 경험을 해 보고 싶었습니다. 남의 환경에서는 한번 올린 것을 지우기가 어려운데, 내 것이면 마음에 안 들면 지우고 다시 깔 수 있습니다. PC 세 대를 조립해 2024년 9월에 시작했습니다.
부수려고 만든 클러스터인데 지금은 실제로 뭔가를 돌리는 곳이 됐습니다. 이 사이트의 방문자 위젯이 여기서 응답하고, 디지털 사이니지 기기를 관제하는 Fleet Console 이 여기 얹혀 있고, 이 사이트를 빌드해 배포하는 러너도 여기 있습니다. 그래서 지금은 마음대로 부술 수 없는 상태이고, 그것 자체가 처음과 달라진 점입니다.
내가 담당한 트랙
혼자 하는 사이드 프로젝트라 하드웨어 조립부터 네트워크, 클러스터, 플랫폼, 관측·보안, 백업까지 전부 제 몫입니다. 항목별 내역은 오른쪽 「주요 업무」에 있습니다.
| 트랙 | 이 카드의 범위 |
|---|---|
| Fleet Console 애플리케이션 | 디지털 사이니지 카드의 산출물이고, 여기서는 호스팅만 합니다 |
| 방문자 API · 이 사이트 | 포트폴리오 사이트 쪽이고, 여기서는 호스팅만 합니다 |
라우터를 사고 나서야 알게 된 것
NGINX Ingress 지원 종료 소식을 듣고 Gateway API 로 옮기려 했는데, Cilium Gateway 를 켜도 외부에서 접속이 안 됐습니다. L2 Announcement 로 VIP 를 광고해도, kube-proxy 대체를 켜도 마찬가지였습니다.
라우팅 계층에서 직접 처리하는 BGP 라면 다를 것 같았습니다. 집에 있던 공유기가 BGP 를 지원하지 않아 MikroTik 을 주문했습니다.
라우터를 바꾸고도 안 됐습니다. hostNetwork 모드에서 ConfigMap 은 반영되는데 포트를 리슨하지 않았고, 원인은 Cilium v1.18.3 이후 hostNetwork reconciler 에 들어간 회귀 버그였습니다. v1.18.2 로 내리자 바로 떴습니다. 일곱 번째 시도였습니다.
돌이켜보면 두 번째 시도에서 버전을 내려 봤다면 라우터를 사기 전에 풀렸을 문제입니다. 다만 그 경우에도 옛 공유기는 포트포워딩 목적지를 하나만 지정할 수 있어서, 노드 한 대가 죽으면 전부 끊기는 구조는 그대로 남았습니다. ECMP 로 세 노드에 나누려면 라우터 교체가 필요했으니 산 것 자체가 헛일은 아니었습니다.
이 과정의 상세는 Cilium BGP+ECMP 구성 (feat. Cilium 1.18.5 버그 발견) 과 BGP 지원 라우터로의 여정 에 따로 적었습니다.
인증과 접근
도구가 늘어나면 계정도 같이 늘어납니다. Authentik 을 IdP 로 두고 한 곳에서 로그인하게 만들었는데, 앱마다 사정이 달라서 붙이는 방법이 두 가지가 됐습니다.
Grafana 처럼 OIDC 를 기본으로 지원하는 앱은 설정만 채우면 됩니다. 문제는 SSO 를 유료 기능으로 두거나 아예 지원하지 않는 앱입니다. 이쪽은 Authentik 의 Proxy Provider 를 앞에 세워, 앱에 도달하기 전에 게이트웨이가 인증 여부를 먼저 묻게 했습니다. 앱은 자기가 인증받았다는 사실을 모르지만 로그인 화면은 하나로 남습니다.
Teleport 는 또 달랐습니다. 다른 서비스는 게이트웨이가 TLS 를 끝내고 평문으로 넘기는데, Teleport 는 자기 인증서로 직접 TLS 를 끝내야 해서 그렇게 넘기면 연결이 즉시 끊깁니다. 그래서 이 하나만 TLSRoute 로 암호화된 채 통과시킵니다. 같은 게이트웨이에 성질이 다른 리스너가 둘 있는 셈입니다.
배운 점
- 아직 배우는 중입니다. 필요한 것이 생기면 PoC 를 하나 세워 보고, 되면 남기고 아니면 지웁니다. 이 클러스터에서 겪은 것으로 쓴 글이 여러 편인데 대부분 그렇게 나왔습니다.
- 원인을 잘못 짚어도 조치가 반드시 낭비가 되는 것은 아니었습니다. BGP 가 원인이라는 판단은 틀렸지만, 옛 공유기로는 노드 한 대에만 트래픽을 보낼 수 있어서 라우터는 어차피 필요했습니다. 다만 순서가 반대였다면 훨씬 쌌을 것이고, 그 순서를 정하는 게 결국 무엇부터 의심하느냐의 문제입니다.