어제는 100G 네트워크에서 인터페이스 설정을 하는 팁을 팀장님으로부터 전수받았다. 신규 클러스터에도 적용되지 않은 부분들이 있었는데, 다음주에 마저 반영할 예정이다.
손에 잡히는 일, 입사할 때부터 원래 하고 싶었던 일, 낮은 레이어에서 직접 개념을 조립하고 계산할 수 있는 일. 그게 지금 일이다. 코드 스타일이 어쩌고 저쩌고 자기 맘대로 평가할 수 있는 영역도 아니다. 되면 되는 것. 안되면 안되는 것일 뿐이다.
게다가 금융쪽은 속도가 생명과 같다. HFT 영역에서는 어디가 병목인지를 세부적으로 찾아내서 요청을 하신다. 어제도 그 병목을 해결하기 위한 작업을 하면서 네트워크 관련된 배움을 얻은 것이다. (그리고 앞으로는 신규 서버를 구성할 때 병목이 발생하지 않도록 미리 신경을 써야겠다.)
물론 스타트업에 다니고 있기 때문에 인프라만 하지는 않는다. DevOps 영역도 손을 댄다. 근데, 일에 집중이 잘 안될 때 최고의 처방은 인프라 일을 하는 것이다. 그중 데이터센터에 가는게 제일 좋다. 서버 팬이 돌아가서 소리가 시끄럽지만 묘하게 집중이 된다.
뭐, 그냥 회사 밖을 나서는 것이니 당연히 좋은 것일 수도 있다.
[ infra ]
장난감 클러스터
NAS와 10G망까지 구성하며 야심차게 구성한 Talos Linux 기반 클러스터. 문제는 이거다. 클러스터 구성을 위한 구성을 했다는 것. k8s 클러스터를 구성하는 순간 그 위에 올릴 어플리케이션들은 각종 귀찮은 일들을 더 해줘야 하게 된다.
그래도 그냥 집에서 이래저래 실습하는 용도이니, 그대로 쓰고 있다. 일단 kube-prometheus-stack이라는걸 올림. 클러스터 상태를 모니터링해주는 스택이다. Grafana 대시보드로 볼 수 있다. 챗봇도 2개 올렸는데 Rust로 짠거라 너무 가벼운 바람에 그냥 모니터링 스택이 가장 무겁게 됐다. 이후 Github action runner도 붙였다. 그래도 남아돈다. DB도 올렸다. DB를 쓰기 위해 한국투자증권 API를 써서 시세를 쌓기로 했다.
저번 주말엔 Github action runner를 하나 더 붙였다. 한국투자증권API로 시세를 쌓기 위한 프로그램을 클러스터에 올리기 위함이다. 하지만 이조차도 그냥 노트북에서 테스트를 하고 있다. 클러스터에 올리는 순간 빠른 테스트가 어렵기 때문. 잘 돌아가는 것을 확인한 후 마이그레이션을 따로 해줘야 한다.
이것이 k8s의 문제점이지 않을까 싶다. 레이어를 굳이 하나 더 얹는 것. 배포를 하는데 10가지 이상, 혹은 10군데 이상을 한다고 하면 효용이 있겠지만, 이런 가벼운걸 하나씩 올리는덴 불편 투성이로 느껴진다.
그래도 뭐 재밌으면 된다. 복잡한 구성을 하고, 그걸 실제로 구현해내는데 쓰이는 추상적 사고능력을 개발할 수 있으니 됐다.
(대충 그만큼 직관적이지 않고, 불편하다는 소리다.)
그렇다고 불만만 있는건 아니다. 여러 노드의 상태를 한 곳에서 관리하는 것만으로도 엄청난 효용이다. 물론, 서버 수가 많다면 말이다.
홈랩에 빠져드는 중
회사에서 NAS의 동작 방식을 접하고 나니 NAS를 직접 구축해버리자는 뽐뿌가 와버렸고, 결국 질러버렸고, 결국 해버렸다.
그저께는 UTP케이블의 끝단을 잘라서 랜툴로 straight 케이블을 제작했는데, 아니 이게 너무 재밌지 않은가. 결국 랜툴과 플러그, 거기에 UTP 케이블 100m까지 구매해버렸다.
돈이 많이 드는 취미다. 일단 노트북을 유선으로 쓰자는 목표까지만 달성하면 다시 개발로 돌아가야겠다.
Talos Linux 클러스터 올리기 성공
몇 번의 포기와 번뇌와 회귀 끝에 성공했다.
결론부터 공개하면, Talos iso 이미지를 빌드하는데 사용했던 Schematic ID가 아주 중요했다. 이걸 machingconfig의 installer image에까지 반영해줘야 했다.
그렇지 않으면 extra extensions가 없는 깡통 talos가 설치되는 것이다.
다음은 그래픽카드가 문제였다. 원랜 gpu-operator를 올려서 모든걸 설치하지만, 여기선 투머치. nvidia-device-plugin만 올리면 됐다.
어떻게 하는지는 github에 다 올려놨다.
NAS를 만들다가 일어난 일
HDD 4개를 사서 윈도우 깔아둔 노는 게이밍PC를 NAS로 탈바꿈하기로 했다.
사다가 뚜껑을 열었다. 메인보드에선 SATA 4개는 당근 지원한다. 하지만 케이스는 아니다.
HDD 확장 슬롯을 사다가 연결했다.
회사에서 팀장님이 추천해주신 방법은 Proxmox를 설치한 후 NAS조차 가상머신으로 관리하는 것이었다. 유연하다는 것이 그 이유였다. 좋다. 가자!
Proxmox를 설치했다. 그리고 가상머신을 만들어서 OpenMediaVault를 설치했다. 근데 RAID로 하드 엮은 후 resync는 왜이래 오래 걸리는지.... 기다리다가 결국 또 튀었다.
기존에 클러스터 올리던 Arch Linux 머신도 밀어버리고 Proxmox를 깔았다. 그리고 목표를 다시 잡았다.
지금은 저걸 1차로 다 하면서 Talos Linux에 도전했다가 GPU passthrough 후에 rustcost-gpu-exporter를 동작하게 하는데 실패했다. 참여중인 오픈소스인데, 의외의 장벽에 부딪혔다. 쉘이 없다는게 이렇게 클 줄이야. rustcost-gpu-exporter는 내부적으로 nvidia-smi를 호출한다.
그래서 다시 탈탈로스 하려는 바이다.
KVM K8S 클러스터 대충 완성
회사에선 사용성 높은 RKE2를 이용해서 Ubuntu 머신에 쿠버네티스 클러스터를 운영한다.
하지만 집에선? 깡으로 간다. 항상 그 깡으로 가는 방식을 실제로 해보는게 실제로 습관이자 취미이다.
결과물은 여기에 있다. 세팅이라는 행위 자체가 무한 삽질이므로, 단계별로 스크립트를 짜면서 삽질을 한다. 그래서 VM까지 다 통째로 날리고 다시 테스트하는 짓을 해도 20분 걸린다.
What or Why
VM
자 그럼 일단, 그 KVM이 뭔가? QEMU는 또 뭔가? 간단히 말하면, VM을 만들어주는 녀석은 QEMU, 거기다가 각종 커널 인터페이스를 제공해주는 녀석이다.
이렇게 설명할거면 뭐하러 설명을 하냐. 그냥 문서 찾아보라고 하지.
쉽게 설명해 보겠다.
조립컴퓨터를 만든다 치자. 신나게 부품을 사다가 가지고 왔다. 케이스에 메인보드와 파워를 체결한다. 이게 QEMU가 해주는 역할이다.
이제 메모리를 꽂고, cpu를 꽂고, gpu도 꽂아보자. 그게 KVM이 해주는 역할이다.
쿨러 등은 생각하지 말자.
KVM은 그 cpu, mem, gpu 자원을 호스트에서 실행하게 해주고, 커널은 호스트의 것을 사용하게 한다. 물론 격리된다.
그런데 QEMU도 단독으로 사용 가능하다. 내장된 기능이 있다. 게다가 이건 다른 아키텍쳐도 실행이 가능하다. arm이라던지 말이다.
너무 좋잖아? 세상 너무 대단하다.
Network
GPT 선생은 bridge를 강력 추천했다. 그래서 NAT로 구성했다. 박진감 넘치는 미래가 예상된다. 물론 현재도 박진감 넘쳤다. 나중에 그림이 하나 나올건데, 서버에서 포트포워딩을, 노트북에서 라우팅 설정을 하다가 포기한 결과다. 라우팅만 해결하면 되는거같지만, 사실 더 있다. modprobe, sysctl도 건드렸다. 그래도 안됨. 결국 dns가 문제였다. 커맨드라인에서 dig까진 성공했으나, 웹에서 포기함. 근데 또 언젠가 또 오기 생기면 이거 파고 있을 예정이다.
Alpine
VM의 OS는 Alpine을 선택했다. 경량 하면 Alpine이다. glibc조차 없다. 대신 musl 라이브러리를 사용한다.
호환성? 당연 개구리다(개굴개굴 노 멍멍 예스). libtorch 이용도 안된다. 물론 어찌저찌 붙인 적은 있는데, 실제로 잘 돌지는 모름.
근데 왜 사용하냐 한다면, 이것도 그냥 취미다. 안된다는거 골라서 다 해보는 것 말이다. 근데 그런걸 회사에서 할 수는 없으니, 집에서 푸는거다.
아 물론, GPU 노드는 ubuntu server minimal로 깔았다. libtorch는 glibc가 없으면 안돈다. 물론 학습 돌릴 것은 없지만 말이다.
Kubernetes with kubeadm
RKE2를 한 번 써봤더니, 그 편함에 잠시 약해졌다. 게다가 1.26버전이 나오던 시절에 쿠버네티스와 잠시 이별을 했었기 때문에, 오랜만에 사용하니 보안성 강화를 위해 kubeadm 사용이 조금 복잡해졌다. 뭐 어쨌든, 다시 강해지도록 하자 ㅋㅋ.
과거 kubespray라는 툴이 있었고, 실제로 사용법도 배웠다. 하지만, 폐쇄망 기반에 보안팀이 강력한 고객사에서 클러스터를 운영하려니 스택이 많을 수록 더 어려워져서 결국 kubeadm이 가장 좋은 선택지였다. 그냥 이미지랑 바이너리를 미리 파일로 말아서 가져가면 되는 일이었기 때문이다(우린 이미지를 빌드하거나, 패키징을 하는 행위를 "말다"로 표현했다).
Bind
DNS 서버 구축하기 위한 아주 오래된 스택이다.
문법도 지랄맞다. 암기과목이다. 하지만 요즘은 GPT라는 집단지성 하드디스크가 있으므로, 오히려 이런 오래된게 더 편함.
HaProxy
로드밸런서이자, Proxy이다. 회사에서 써보고 감탄했다. dns 세팅은 간단히 해버리고, proxy에서 왠만한건 다 라우팅해버린다. 여기다 인증서 반영해 두면 https도 알아서 지원된다. control-plane 노드를 3개 구성한 후 이걸 어떻게 분산해서 쓰는가에 대해 답을 주는 녀석이다. 물론 virtual ip를 이용하는 방법도 있는데, 이건 스위치랑 라우터 등등 네트워크 장비와 싱크가 안맞으면 지옥을 맛본다.
How
아 이게... 설명하기가 정말 귀찮다. 다 스크립트 만들어 뒀고 실행하면 되는데 그걸 설명하는건 정말이지...
그래서 RTFM을 시전한다. README에 다 있다.
무슨 짓을 한 것인지는, 그림을 첨부하겠다.
원래 목표
현재 상태
현재 목표=원래 목표
Next
NAS 서버를 직접 만들어 볼 것이다. 부품은 다 왔는데, GPU passthrough 한다고 삽질하느라 많이 지체됐다.