토이 프로젝트를 2개 정도 운영하고 있었다. 그런데 최근에 부하가 많이 줄고 이용자가 줄어서 클라우드 서버의 가격이 부담으로 다가왔다. 나의 클라우드 히스토리는 아래와 같다.
Azure
학생 무료 혜택으로 사용했었다. 유료 계정으로 전환해서 사용하다가 트래픽 요금이 고무줄이고 예측이 불가능해서 트래픽을 정확히 정해주는 곳을 원했다. (+ 컴퓨트 요금도 줄이고 싶었음.)
AWS Lightsail
기존 AWS와 다르게 정액 요금제라서 마음에 들어서 사용했었다. 1개의 VM에 Docker로 여러 개를 올려놨었다. 가격도 정말 만족했었고 별 문제 없이 사용했었는데 프로그램이 확장되가면서 한계가 명확하고, 메모리 등 성능이 모자라서 정체가 생기면 자동으로 컨테이너가 재생성 된다는 등의 오케스트레이션이 아예 없었다.
이 문제에 대응하기 위해서 1차적으로 Uptime 봇을 사용해서 Down 되면 호다닥 restart를 눌러주는 방법으로 거의 2년 이상 운영했다. 그런데 이 방법도 한계가 있기 때문에 K8S로 갈아타고자 결심하게 되었다.
AWS S3 + Vultr VKE
K8S로 옮겨야한다는 숙명을 갖고 EKS, GKE, AKS 등 여러 Kubernetes Engine Service를 확인하였지만 Master에 대한 요금을 별도로 부과하는 것으로 인식되었다. 즉, Master Node 요금과 Worker Node 요금이 별도라서 Node를 적당한 사양 2개로 해도 못해도 100달러 이상은 나오는 상황이었다. 그런데 Ingress, Volume 가격 다 따로니깐 돈 먹는 하마 같았다!
다른 Provider들 일부는 Master는 무료라고 하는데, 나는 설정을 잘못했던건지 어떤 설정을 해도 Kubernetes Engine 사용에 대한 금액이 부과되었다. 그런데, Vultr는 무료 계층으로 테스트 해서 크레딧이 차감되지 않는 부분까지 확인해서 거의 1년 동안 서비스를 운영하였다. 한 달에 Worker Node 15달러x2=30달러, Ingress 10달러, DB 15달러 해서 55달러에 VAT 붙혀서 거의 60달러 가량에 사용하고 있었다.
사용했었던 Vultr와 K8S 문제와 해결책은 아래와 같다.
그런데 이전을 결심한 결정적인 계기가 있었으니, K8S Upgrade 문제이다.
Vultr에서 버전이 Outdated이니 지원 끊기 전에 어서 업그레이드를 해달라고 메일이 와서 Upgrade를 수행하였는데, 그 뒤로 모든 Service가 뜨지 않았다. 에러는 "Failed create pod sandbox"였던 것으로 기억한다.
이 문제를 해결하지 못해서 VKE Cluster를 지우고 다시 띄웠다. 이마저도 Volume Storage를 사용하는게 없어서 다행이지 복잡한 관계였으면 큰일 났을 것이다. 그렇게 에러를 해결했는데, 이건 사실상 정석 해결책이 아니라는건 모두가 아는 사실일 것이다. 그런데 더 큰 문제는 재생성 이후에 며칠에 한 번 Ingress만 계속 죽었다가 다시 뜬다. 이게 Down Time이 1시간 이상 지속되기 때문에 로그를 보면서 해결해보자 하였지만 로그에는 어떠한 문제도 등장하지 않았다.
그러면서 든 생각이 "K8S는 안정적으로 운영하기 위해서 사용하는건데 왜 이런 트러블 슈팅이 일어나는거지" 싶었습니다. 특히 업그레이드 이후에 "Failed create pod sandbox" 이 에러가 생긴건 너무나도 이해가 되지 않았다.
이런 이슈를 겪고나니 프로젝트의 스케일도 작아졌겠다. 다시 Docker로 운영하기로 마음을 먹었다. 그러고보니까 Oracle Cloud의 Free Tier가 그렇게 많은 리소스를 지원한다고 해서, 시도해본다.
Oracle Cloud의 Free Tier는 대표적으로 아래 리소스를 지원한다.
일단 OCPU라는 단어를 처음 접하게 되었는데, OCPU는 Oracle Cloud Infrastrusture(이하, OCI)에서 사용하는 CPU의 단위인데 1-OCPU는 다른 클라우드에서 제공하는 2-vCPU 정도에 해당한다고 공식 문서에 나와있다. 내가 이해하기로는 기존 CPU들이 Hyper-Therading 기술로 1-Core에 2-Thread로 가상화를 해서 사용하는데, 기존 클라우드들은 1-Thread를 1-vCPU라고 하는데, 여기는 실제 1 코어를 준다는 의미로 해석을 하였다.
이 글을 보는 분들은 위의 용어들을 모르실 분들이 아니니까, 용어를 설명하지는 않고 장단점을 간단하게 적어보겠다.
VM을 AMD+ARM 해서 총 4개까지 만들 수 있는데 다른 클라우드는 하나만 제공하는데 OCI는 4개까지 만들 수 있다. AMD VM의 경우에는 1/8 OCPU니깐, 0.25 vCPU인 것.
2개 VM을 만들어두면 용도에 따라서 분리할 수 있어서 좋을 것이라고 생각한다. 특히, 이렇게 성능 부족하고 램 부족하면 죽을 때가 너무 많다.
그래서, 여러 역할을 하나의 VM에 몰아넣으면 동시에 죽는 일이 다수인데, 2개 VM이면 작업들을 분배해서 넣으면 피해를 최소화할 수 있을 것이다.
ARM에 대해서 OCPU 3,000시간을 제공한다. CPU에 '시간'이라는 단위는 아실 분은 알겠지만, 1개의 CPU를 점유한 시간을 뜻한다.
일례로 GCP에서 e2-micro 사양의 VM을 무료로 지원해주는데, 1개가 한 달 무료라고 생각하는데 사실은 시간 단위로 제공하고 있다. 즉, 한 달이 30일이라면, 24x30=720시간을 제공하는 것이기에 VM 2개 만들어서 15일 씩만 써도 되는 것.
즉, 3,000시간이라고 하면 1-OCPU를 한 달 쓰고도 남으니깐 4코어까지 지원되는 것이다. 4코어를 31일(744시간) 쓰면 딱 맞다. 그러고도 24시간이 남기 때문에 초과해서 잘못 생성했어도 바로 정정하면 과금이 안 되는 수준이라고 볼 수 있다.
4-OCPU도 4-OCPU인데, 램도 24GB를 제공하기 때문에 최대 4개의 VM으로 나눠서 쓸 수 있다고 생각하면 가능성이 무궁무진하다.
최근에는 Docker Image를 만들 때 ARM 기반 Image로 만들면, OCI ARM VM에서도 잘 구동되기 때문에 작은 토이 프로젝트라면 문제가 없을 것으로 보인다. 나는 Github Action을 설정해서, AMD64, ARM64v7 이미지를 모두 만들도록 설정하고 있다.
토이 프로젝트 용도가 아니라도 4-OCPU/24GB 올인해서 마인크래프트 서버를 만들 수 있지 않을까? 놀라운건 공식 블로그에서도 소개되고 있는 방법이다.
다른 클라우드와 대비되는 차별점이라고 생각하고 있는데, 다른 클라우드 서비스들은 '항상 무료'라고 표시되어 있는 경우가 적다. 생성할 때만 무료라고 표시해주거나 VM은 무료인데 안에 들어가는 Disk는 유료 Disk가 기본이거나 그런 식인데 OCI는 생성할 때 대부분 '항상 무료' 옵션을 선택하면, 세부 옵션들도 Free Tier에 맞게 조정해준다. 그래서 안심된다.
Free Tier라면 이렇게 세부 옵션들도 조정해서 안정감을 줘야지 유료 전환에도 관심을 갖게 되지 않을까 싶다.
이게 좀 클 것 같은데, Oracle Database가 무료로 제공된다. 여타 다른 클라우드에서 볼 수 없는 내용이었는데, 자사 DB라서 그런가 무료로 제공 받을 수 있게 되었다.
MySQL, PostgreSQL, mongoDB 이런건 ARM 기반으로 해서 만들어진 Docker Image 등의 방법을 통해서 ARM 기반에서 실행이 가능한 것으로 알고 있는데 Oracle DB는 상용 DB라서, Docker Image가 공개적으로 배포가 되지 않고 있는 부분도 있고, 이마저도 제대로 동작하지 않는 경우가 있어서 ARM 기반 랩탑을 사용할 때 Oracle DB 실습이 불가능한 경우가 있었는데, 이 OCI를 통해 실습을 할 수 있는 수준이 되었다.
7일 미사용시 정지라는 무시무시한 내용이 걸려있으나 거기 입장에서도 리소스를 아껴야하니 이해는 가는 내용이다.
무료니깐 다 장점이라고 하기는 어렵고 단점은 단점이니 느껴본 단점을 이야기해보겠다.
개인적으로 Azure가 제일 리소스 생성이 느렸다고 생각했는데 OCI가 더 느리다. 생성 누르고 좀 인내를 가져야할 수준이더라. 그러니깐 생성할 때 세부 옵션을 잘 보고 생성을 누르기 바란다. 생성이 느려서 그런가 삭제도 느리니깐.
OCI의 장점 중 하나가 본인 인증 시에만 카드를 등록하고, 결제용 카드는 지정하지 않아도 Free Tier를 사용할 수 있다는 것이다. 즉, 결제 카드를 등록하지 않은 상태에서는 과금 대상 리소스를 생성할 수가 없는 것이다.
하지만 이게 단점을 다가올 때가 있는데, 바로 Free Tier 계정에 할당되는 리소스의 양이 각 리전별로 정해져있다. OCI의 Free Tier 서비스는 거의 3~4년이 되어가는걸로 아는데, 아시아권에서는 여유가 있는 곳이 거의 없다고 보면 된다.
그래서, 누군가가 리소스를 반환했을 때 후다닥 집어야하는데 그래서 매크로가 등장했다. 매크로를 돌리면 7일 정도에 VM 1개를 건질 수 있을 것이라고 한다.
가입 시에 홈 리전을 정하게 되어있다. 기존 클라우드를 이용하는 사람들은 의아할 수 있는데, OCI에서는 리전마다 다른 구독이 적용된다고 한다. 여기까지는 별 다른게 없다. 다른 클라우드도 리전 다르면 서로 연동 안 될 때가 있다. 그런데 OCI의 Free Tier로 가면 이야기가 달라진다.
Free Tier는 가입 시에 설정한 홈 리전에서만 사용할 수 있다고 한다. 즉, 아무 생각 없이 미국 서버가 여유롭다고 생각해서 미국 고르면 레이턴시 지옥에 빠질 수도 있다는 것이다.
웹 콘솔 언어는 영어를 추천한다. 용어들이 영어에 익숙해서도 있는데, OCI 소개 페이지의 단어와 콘솔에서의 단어가 다를 때가 있다.
단적으로 보여주는 예가 Bastion이다.
OCI Bastion 소개 페이지에서는 한국어 사이트여도 영어로 'Bastion'이라고 적힌 것을 볼 수 있다.
그런데, 웹 콘솔에서 한국어로 설정하고, bastion으로 검색하면 나오지 않는다.
웹 콘솔에서는 '배스천'이기 때문이다. 배스천도 ㅐ로 적어야한다. ㅔ로 치면 안 나온다. 처음에는 안보여서 돌아버리는 줄 알았는데, 이런 케이스였다.
영업 문서와 콘솔과 용어 통일이 안 된다는 건 큰 문제로 받아들여진다. 웹 콘솔에서 최소한 영어로라도 검색이 되게 만들었으면 이런 혼란이 없었을 것 같다.
Free Tier 계정의 경우에는 생성된 리소스가 계속 Idle 상태라면, 리소스를 회수한다고 공식 문서에 나와있다. VM을 건지면 어떤 식으로든 계속 굴려야한다는 뜻이다.
이렇게 계속 신경 쓸바에는 그냥 결제 카드를 등록하는 것도 나쁘지 않다는 생각이 들었다.
결제 카드를 등록한 계정은 각 리전의 리소스 제한 없이 '항상 무료' 리소스를 생성할 수 있다. 카드를 등록해도 Free Tier에 해당하면 과금이 안 된다. 굳이 매크로 돌려가면서 건지고, 스트레스 받을 필요도 없다는 것이다. 그래서 나는 카드를 등록해서 사용하고 있다.
지금도 쓰고 있는데 진짜 만족스럽다. 무료는 SLA가 적용되는게 아님에도 불구하고 안정적으로 운영되고 있고, Oracle 쪽 실수로 인해서 리소스가 Down 된적이 한 번도 없다.
특히 ARM VM의 경우에는 물건이니 꼭 다들 써봤으면 한다.