나에게 홈랩이 생겼다.

1. 홈랩의 필요성

대부분의 나같은 개발자들은 오픈소스에 의존도가 매우 높다. 개인의 생산성을 오픈소스를 사용하지 않는 사람에 비해 압도적으로 높여준다. mysql이나 postgresql을 사용해야하는 일이 생긴다면 우리는 그냥 설치하고 계정만 설정해도 동작에 문제가 없다. 심지어 파일을 쓰고 압축하고 색인을 생성하는 번거로운일을 SQL로 모두 해결할 수 있다.

하지만 수없이 많이 추상화된 오픈소스는 간혹 사용자를 어렵게한다. 만약 회사에서 쿠버네티스 클러스터를 사용중이라고 가정해보자. 어느날 나에게 ‘네트워크 관측 가능성’을 근거로 cni를 calico에서 cilium으로 변경해야하는 미션이 생겼다고 생각해보자. 뭘 해야할지 아는사람은 경험자뿐일것이다.

그래서 나는 여러 오픈소스를 설치해보고 설정해보면서 컨셉과 이론을 배워 보고싶었고 집에 클러스터를 만들어서 실험장처럼 써보고 덤으로 내가 만든 서비스(비영리)도 운영해보는것이 홈랩을 만들게된 이유다.

2. 하드웨어

나의 목적은 클러스터링이었다. 컴퓨터가 필요했다. 싸고 좋은 컴퓨터를 찾다보니 알리익스프레스에서 중고 제온과 출처모를 서킷의 메인보드를 구매하게되었다.

알리발 중고 제온 x99 combo

두개를 구매했는데 하나는 보드가 불량이었다.

개당 56달러였다. 가성비는 매우 좋은편이다. E5-2650v4에 ECC DDR4 16GB 사양이다. 메모리를 추가로 구매해서 대당 32기가로 구성했다.

구매를 원한다면 알리익스프레스에서 ‘x99 combo’ 또는 ‘x99 motherboard’등을 검색하면 된다. 데스크탑용 칩셋을 랜덤으로 사용중이고 불량 발생 시 “출고시 QC가 완료된것이므로 반품하면 상태 확인 후 환불해주겟다” 라고 하지만 내가 직접 우체국을 방문해서 중국으로 배송을 보내야하고 시간이 오래걸린다는건 인지하고 주문하라.

분산 스토리지도 계획에 있어 노드별 대역폭을 늘리기 위해 랜카드도 샀다.

알리발 랜카드

기가비트 2포트 랜카드다. 개당 14달러에 구매한것으로 기억한다. 이제 노드마다 nic본딩을 해서 노드당 총 3기가비트의 대역폭을 가진다.

노드쪽 포트가 많아졌으니 스위치도 구매해야했다.

switch 화웨이 L2 스위치

어쩌다보니 하웨이 48포트 기가비트 스위치를 구매하게되었다. 4개의 10Gbps sfp포트도 겸비한 과분한 사양이지만 중고나라에 너무나도 매혹적인 가격으로 올라와서 구매해버렸다. 아래의 노란색은 통풍 및 소음저감용으로 끼워둔 다이소 스펀지다.

외부망 연결은 단순하게 남는 공유기를 활용했다.

iptime사의 공유기를 사용했는데 규모에 맞게 아주 만족스러웠다. DMZ를 설정하고 나서 포트포워딩으로 특정 포트만 오버라이딩이 가능해서 트래픽을 받는 로드밸런서 노드를 DMZ 설정을 하고, kube-apiserver가 있는 control-plain만 포트포워딩을 설정했다.

완성된 모양새는 별로 멋있지않지만 나름 서버라는 티는 난다.

cluster 완성된 클러스터의 전체 모습

3. 쿠버네티스

쿠버네티스는 단일 바이너리 파일로 실행되지 않는다. etcd, cri, cni 등 다양한 의존 패키지가 필요하다. 또한, 쿠버네티스 클러스터는 여러 대의 서버에 걸쳐 구성되기 때문에 일일이 설정을 적용하는 것은 번거롭고 동일하지 않은 환경으로 구성되거나 오류가 발생하기 쉽다. Ansible과 kubeadm을 사용하면 쿠버네티스 클러스터를 구성하는 데 필요한 작업을 자동화하여 이러한 문제를 해결할 수 있다. cri는 containerd와 cri-o 둘중 선택 가능하도록 했고, cni는 cilium을 선택했다.

argocd, rook.io, redis 등 내가 개발중인 서비스에 있어 의존적인 요소들을 우선 실험중이다.

argocd argocd를통해 오픈소스 helm 프로젝트들을 설치해보는 모습

4. 해보고싶은것들

  • Metal provisioning
    사실 이번 홈랩 구성하다가 실패한 부분이다. 처음에는 MAAS를 사용하려했으나 초기화부터 잘 안된다는 문제가 있었고, Ansible을 통해 dhcp와 tftp서버를 열고 pxe부팅을 시도했으나 워커노드를 2대로 줄이거나 control-plain과 같이 실행했어야 했었다. 하지만 당장의 목표는 HA 구성을 테스트하고 트러블슈팅을 하는것에 있어서 건너뛰게 되었다.

  • vm or K8S in K8S
    kubernetes로 vm이나 kubernetes를 배포해보고싶다는 생각이 들었다. 내가 인프라쪽 지식이 많이 부족해서 네트워크를 어떻게 해야할지 고민이 크다.
    kubevirt

  • Thanos
    고가용성 Prometheus 오픈소스다. 한번 구성해본 경험이 있으나 VM 클라우드를 만든 후에 multi cluster를 대응하고자 하는 목표가 있다.

  • k6s
    QA, 성능, 안정성 테스트 자동화 툴이다. Grafana 생태계에서는 이만한 테스트 툴이 없는것으로 보인다.

  • Pyroscope
    프로파일링 툴이다. 내 코드 꼬라지를 적나라하게 보여줄 수 있다. 다른 프로파일링 툴도 많지만 grafana dashboard에서 바로 볼 수 있다는 Grafana 생태계에서의 큰 장점이 있다. Golang, js를 사용한다면 눈으로 봐가면서 성능 개선을 이뤄낼 수 있겠지만 rust나 c++같이 사람의 성능을 많이 탄다면 큰 도움이 될것이다. 사실 회사에서는 개선의 필요성과 개선 후 비용 절감의 계산 등을 수치화시켜서 윗분들에게 개선의 당위성을 제시하는데 큰 역할을한다.

  • Keycloak
    SSO 오픈소스다. OIDC를 제공하기에 홈랩을 지인에게 열어줄때 권한도 편하게 열어줄 수 있다. 사용해본 후기로는 완성도가 높아서 직원이 많은 회사에 내부망 sso로써도 훌륭하다는 생각이었다.

  • cilium service mesh
    istio를 사용해보았을 때 오버헤드가 결코 무시할만한 수치는 아니었다. 트래픽은 적고 배포할것이 많은 경우에 파드마다 사이드카가 일일이 붙는다는건 더욱 부담스럽다.

  • cilium cluster mesh
    Active Active DR을 구성하는것이 목표인데 클러스터간 네트워크 관리 요소를 추상화시켜주고, cilium service mesh와의 궁합을 통한 zero thrust와 fail over의 지름길로 보여진다. 나는 물리 네트워크만 잘 구성하면 될것같다.