Re: 제로부터 구축한 새 홈페이지, homin.dev
By Homin Lee
배경
제 첫 개인 사이트는, 베란다에 켜 놓은 작은 홈서버에서 돌아가던, APM 기반의 워드프레스 블로그였습니다.
APM의 시대가 저물고? 갈 곳을 잃어 잠시 방황하다가, 최근까지는 깃헙에서 제공하는 정적페이지, GH-Pages를 사용해왔습니다.
GH-Pages를 간략히 소개하면
github.com/계정명/프로젝트명
의 프로젝트 하나에 하나씩계정명.github.io/프로젝트명
이라는 도메인에 정적 웹 페이지를 제공할 수 있제 지원해 주는 것입니다. 특별히github.com/계정명/계정명
프로젝트는계정명.github.io
도메인을 주기도합니다.
이걸 통해서, resume, blog(지금 보시는 블로그), hangulclocks 등의 페이들을 운영했고, https://suapapa.github.io 페이지에 대문 역활을 하는 페이지를 만들어뒀었습니다.
도메인이 너무 길고 외우기 힘들어 suapapa.net
도메인을 사고,
DNSEver 서비스의 리다이렉션 서비스(유로)로 GH-Pages들로 이동하게 쓰고 있었습니다.
예를들어
blog.suapapa.net
->suapapa.github.io/blog
로 이동하게 DNSEver에 등록.
저는 여전히 GH-Pages를 잘 쓰고 있지만, 동적사이트를 만들고 싶은 욕심 + CKAD 자격증따면서 배운 거 써보기! 라는 목적으로 퍼블릭 클라우드에 새 개인 사이트를 파 보기로 결정했습니다.
쿠버네티스(k8s) 클러스터 구축
클라우드 업체의 대명사인 두 곳, AWS, GCP에 k8s 클러스터를 운영하는 비용을 수소문 해 보니, 매 달 20만원정도 운영비가 든다고 하더군요. 넘 비싼 것, 빠른 포기하고 한동한 허송세월 보내다가…
어느날, 다음의 사이트를 검색하게 되었습니다. 제목부터, 개인 프로젝트용 합리적인 가격의 k8s!
이 사이트에서는 제공하는 팁은 다음과 같습니다:
- 마스터 노드를 무료로 제공하는데를 찾을것
- 스팟(preemptible) 노드들로 구성하기
- 클라우드 업체가 제공하는 로드밸런서를 대문으로 사용하지 않기
- 저장공간을 적게 사용할 것
거기서는 GKE를 기준 매달 약 $18를 예상했고, 제가, 조금 더 허리띠를 졸라 뽑아본 예상은 다음과 같습니다.
월 만원이 안된다고? 솔깃해서 해보기로 했습니다.
Ingress 사이트 구축 밑 연동
위 사이트의 설명은 Nginx 웹서버의 리다이렉션 기능을 활용해 Ingress(대문, 기본 도메인으로 왔을때 거치는 곳)를 구축한 예를 보여줬는데, 저는 기왕하는거 Go로 Ingress 사이트를 만들어 보기로 했습니다.
80포트를 연 간단한 웹서버를 만들고, 위 가이드 대로 진행해서 얻게된 고정IP로 curl 등으로 접근해 되는지 확인합니다.
도메인 구매
.dev
도메인은 구글이 소유권을 가지고 있는 도메인으로 개발관련 사이트에 사용하면 좋아보입니다. 예) go.dev
제 경우 누가 이력서 달라고 했을때 homin.dev/resume 라는 링크를 줄 수 있다면
개발자 이력서용으로 완벽한 도메인이라는 생각이 들어 그 도메인을 구매했습니다.
구글이 해당 도메인을 한국으로 팔지 않기 때문에 GoDaddy에서 구매했습니다.
구매 팁! 결제 직전에, 프로모션 확인하기 버튼을 꼭 눌러보세요. 갑자기 쿠폰을 줍니다!
GoDaddy웹 페이지에서 기본제공하는 DNS서버의 A레코드에 위의 고정IP를 입력합니다. 어디에 메뉴가 있는지 찾기가 좀 힘들었는데, 왜냐하면 추가 지출을 유도하는 항목들을 누르기 쉽게 사이트의 UI/UX를 디자인 했기 때문입니다. 링크같이 안 생긴걸 잘 찾으면 해당 기능이 있습니다. :(
.dev
도메인은 한가지 함정이 있는데 무조건 TLS (https://
) 로 접근해야 사용할 수 있다는 제약입니다.
해야지 뭐.
SSL 인증서 적용
GoDaddy에서 .dev
구매자에게 인증서를 공짜로 준다고 했었는데,
도매인을 구매하고 보니 인증서는 첫 해만 공짜였고,
그나마 자사 (유료) 호스팅을 써야 주는 것 같더군요… 이러면 나가린데,
공신력있는 무료 SSL인증 업체가 있습니다. Let’s Encrypt
인증서가 설치되는 서버 안에서 certbot
이라는 CLI프로그램으로 인증서를 생성 및 갱신해야 합니다.
해당 프로그램은 alpine
리눅스에도 패키지로 있으니까 설치해서 쓰면 되고…
고로 만든 프로그램은
scratch
베이스 위에서도 돌아가는 게 미덕인데, 쉘이 필요하니 어쩔 수 없이alpine
리눅스로 타협했습니다.
첫 생성은 라이센스 확인등 (Y 누르기)의 절차가 필요하기 때문에 자동화 스크립트로 커버가 안되기 때문에
ingress 포드에서 인증서 생성위치를 노드의 볼륨과 연결하고 (포드가 삭제되도 인증서가 날아가지 않게)
포드에 k exec ingress... -- /bin/sh
로 접근해서 certbot new ...
해서 생성합니다.
인증서를 생성하는 가운데, 임시 파일을 생성하고, 요청한 주소의 특정 EP에 접근해 그 파일이 보이는지 확인하는 과정을 거치는데 Go로 짠 웹서버의 경우 한 줄짜리 파일서버를 추가하는 것으로 간단히 해결할 수 있었습니다.
이후에는 3개월이 지나 인증서가 만료되기전에(네, 이게 공짜인 이유) 한 번 씩 certbot renew
로 인증서를
갱신하면 되는데 이때는 사용자 입력이 필요 없으므로 cron
에 해당 명령을 등록합니다.
잘 되었다면 브라우져나 curl을 사용해 homin.dev (자동으로 https로 시도)로 여전히 잘 접근되는지 확인합니다.
결과물
Nginx을 사용했다면 그냥 리다이렉션이나 스태틱 페이지를 보여주고 말았겠지만, 제 경우 Go로 Ingress서버를 작성했기때문에, http리다이렉션, http리버스프록시, TCP-TLS-to-TCP 포트 포워딩 등 다양한 기능을 구현해 볼 수 있었습니다.
자체 대문 페이지와 404페이지도 있고요.
이 사이트를 위해 작성한 코드는 다음 위치에 있습니다.
- https://github.com/suapapa/site-ingress : Ingress 서버
- https://github.com/suapapa/k8s-homin.dev : 배포에 사용한 k8s 설정 모음. (시크릿은 없습니다)
일주일이 지난 현재까지의 사용요금은 2,500원 가량입니다. 또한, 기존의 DNS&Redirection 용으로 사용하던 DNSEver 서비스와도 작별할 수 있게 되어 조금이나마 더 비용이 절감되었습니다.
개인용 퍼블릭 k8s 클러스터가 생기니 할 수 있는 일의 영역이 확 넒어져서 앞으로 재밌는걸 많이 올릴 수 있을 것 같습니다. 재밋게 보셨다면 후원해 주시면 매우 감사하겠습니다. :)