원문 캡처 · kalinowski.io
원문 캡처 · kalinowski.io

개인 웹사이트를 운영하는 사설 AKS 클러스터는 인터넷에서 들어오는 연결을 받지 않고, 클러스터 안의 cloudflared가 Cloudflare로 나가는 터널을 유지한다. 운영자는 Azure 비용을 월 100유로 미만으로 억제하고, 코드와 Git을 배포·인프라 관리의 기준으로 삼았다.

kalinowski.io의 DNS는 Cloudflare를 가리킨다. Cloudflare는 TLS를 종료하고 이미지·CSS·JavaScript 같은 정적 파일을 캐시한다. 페이지와 캐시 누락 요청은 클러스터 안의 cloudflared 파드 두 개가 유지하는 터널을 통해 전달된다. /api/ 요청은 경로에 따라 Go 서비스로 라우팅되며, 나머지는 두 복제본으로 운영하는 nginx가 정적 Astro 사이트를 제공한다. Cilium 네트워크 정책은 cloudflared가 해당 파드에 접근하도록 제한한다.

클러스터에는 웹사이트와 연락처 양식, 상태 페이지, Ask AI, 댓글, 뉴스레터를 처리하는 서비스 등이 있다. 서비스와 백업 작업은 distroless 이미지의 소형 Go 프로그램으로 운영한다. 이들은 루트 권한 없이 읽기 전용 파일시스템을 사용한다. 모든 서비스를 하나의 4GiB 노드에서 운영하므로, AKS 관리형 기능이 있는 경우 별도 앱을 설치하는 대신 관리형 기능을 선택했다.

배포는 클러스터가 설정 저장소를 가져오는 방식이다. GitHub Actions는 이미지별 콘텐츠 해시 태그를 사용해 아직 없는 이미지만 빌드하고 GHCR에 비공개로 게시한다. 병합 후 워크플로가 별도 설정 저장소의 태그를 갱신하면 AKS Flux 확장이 변경된 태그를 적용한다. 따라서 태그가 바뀐 파드만 교체되며, 롤백은 Git 커밋을 되돌리는 방식이다. 병합부터 배포까지는 2~3분이 걸린다. 매주 일요일에는 캐시 없이 이미지를 다시 빌드해 새 기반 이미지의 보안 수정도 반영한다.

Azure에 연결하는 각 서비스는 고유한 워크로드 ID와 필요한 범위로 제한된 역할을 쓴다. 비밀값은 Azure Key Vault에 두고 Secrets Store CSI 드라이버로 파드에 제공한다. 클러스터 API에는 공개 엔드포인트가 없으며, CI가 클러스터에 직접 배포하지 않는다.

운영자가 제시한 Azure 비용 추정치는 월 약 58유로다. 단일 노드 구성에는 SLA가 없고 노드 교체 시 사이트가 잠시 중단될 수 있다. HTML은 기본적으로 Cloudflare에 캐시되지 않아 노드가 멈추면 페이지도 사용할 수 없다. 공개 API 서버 대신 사설 엔드포인트를 선택한 비용은 월 약 7유로이며, Key Vault는 비용 때문에 공개 엔드포인트를 사용한다. 실제 청구액은 상태 페이지에서 확인할 수 있다: 상태 페이지.

외부 모니터링은 무료 요금제의 Grafana Cloud에서 프랑크푸르트, 런던, 스톡홀름을 대상으로 5분마다 수행한다. 15분 안에 두 차례 확인에 실패하면 알림을 보내며, 인증서 만료가 일주일 이내로 다가와도 알린다. 운영자는 비용·구성·절충점을 포함한 전체 설명과 관련 자료를 사이트 운영 설명에 공개했다. 배포 방식은 변경된 항목만 배포하기, 사설 클러스터 운영은 점프박스 없는 사설 AKS에서 더 자세히 다룬다.