글을 시작하기에 앞서, 퀴즈 하나 풀고 시작해보자
GCP는 구글계정에 300달러의 무료크레딧을 제공한다.
인스턴스랑 비용관리 안하고있다가, 정산비용이 몇십만원 나와서
예상치 못한 비용을 결제한 바보멍청이가 누굴까?
이번 게시글에서는
- Kubernetes Cluster 에 대해서
- On-premise Cluster를 구축해놨는데 포기한 이유
- GCP 무료계정
- 결제비용
- 알람 설정
을 다룰 예정이다.
GCP에서 뭘 사용하고 있었나요?
나는 GCP에서 주로 GKE(Google Kubernetes Engine)서비스를 사용한다.
Kubernetes(이하 K8s)를 모르는 사람들을 위해서 간략하게 설명하면 다음과같다.
- Kubernetes: 가장 잘나가는 Container Orchestration. 여러 호스트에서 Container를 자동으로 배치하며, 실행하고 조정한다.
- GKE: GCP에서 제공하는 Managed-Kubernetes 서비스이다.
내가 GKE서비스를 사용하는 이유는
On-premise(온프레미스,온프렘 , 이하 On-prem으로 지칭한다)로 구축한 클러스터가 한계가 명확하기때문인데
그 이유를 지극히 주관적인 관점에서 이유를 설명해보고자한다.
On-prem Cluster의 한계: 네트워크
클러스터라고 말하기도 부끄러운 수준이지만, 나는 자취방에 On-prem K8s 클러스터를 구성했고, IP를 외부로 노출시켜서 사용했다.
이때 해결해야하는 이슈중 가장 큰 이슈는 네트워크 접근 이슈이며, 이를 해결하려면 특정 IP로 접근해서 K8s 클러스터로 접근해야한다.
설명을 좀 덧붙이자면 기존 On-prem 장비로 구성된 Kuberntes Cluster를 그림으로설명하면 다음과 같다.
근데 한가지 알아야하는 내용이 있다. 네트워크를 생각해보자.
현재 On-prem으로 구성된 K8s Cluster의 구성도는 다음과같다.
현재 물리장비는 모두 자취방이라는 하나의 공간에 배치되어있다. 또한, 하나의 공유기에서 나오는 와이파이를 사용하고있다.
따라서, 모든 물리장비는 동일한 네트워크를 사용하고 있다.
- 공유기는 iptime을 사용하고있다.
- 클러스터가 자취방에서 구성되었다고하여 자취방 네트워크라고 지칭하며, 하나의 동일한 네트워크다.
내가 동일한네트워크를 사용하고 있는 상태라면, K8s Cluster에 직접 접근할 수 있다.
- 그림에서는 접근장비를 사람으로 표현했다. 노트북으로 접근하는 경우를 생각해보면 될것같다.
문제는 다음상황에서 발생한다. 자취방이 아닌곳에(외부) 있다면 K8s Cluster에 직접접근이 가능할까?
불가능하다.
그 이유는, 외부에서 자취방의 네트워크로 들어오지 못하게 막아두었기때문인데
정확히 말하자면, 공유기(iptime)에서 자취방 네트워크로 들어오지 못하게 막아두었기 때문이다.
따라서, 아무런 설정을 하지 않고선 외부네트워크에서 자취방네트워크로 직접연결을 하는것은 불가능하다.
- 외부 ⇒ 내부로 직접 접근하는 옵션은 default로 설정되어있다.
물론 이 문제를 해결할 수 있다.
내가 해결한 방법은 네트워크의 특정 지점의 포트를 열어두고, 보안관련 옵션을 설정해서 외부 사용자가 접근할 수 있도록 설정하는것이다.
- 직접 찾아보기엔 특정한 도메인의 특정한 Port 가 될 수도 있고, 방법은 여러가지인것같다.
그래서 나는 이 문제를 해결했다.
네트워크의 IP를 고정했고, 특정포트를 열어둬서 프록시(?) 를 타고 쿠버네티스 클러스터에 접근할 수 있게 해놨다. 이렇게하면 On-prem의 최대 단점인 네트워크문제를 해결할 수 있다.
이렇게 나는 On-prem으로 Kubernetes Cluster를 구축해서 사용했다.
또 다른 On-prem 물리장비의 단점을 알아보자.
*관련포스팅
- https://jjongguet.tistory.com/143 포스팅에서 IP를 고정하는것을 다뤘다.
- https://jjongguet.tistory.com/142 포스팅에서 온프렘 K8s를 구성하는 것을 다뤘다.
On-prem 물리장비의 한계: 소중히 다뤄줘야해
On-prem장비는 소중히 다뤄줘야한다. 왜 이런 말을 하는지를 생각해보면 이유는 꽤 단순하다.
- 사진은 어디선가 봤던 짤인데, 그냥 기억나서 가져와봤다.
진짜 장비를 잃어버릴수도 있고
제품뽑기에 실패할 수도 있고
제품이 잘 작동하다가 고장날 수도 있고(의도치않게)
제품이 잘 작동하다가 고장낼수도 있기 때문이다(의도치않게22)
물리장비를 구성할 돈이 많은것도 아니고, 모든 리스크를 감수하면서 On-prem장비로 구성할 이유는 없는것같다.
개인적관점에서는 클라우드 서비스 사용하는게 오히려 더 값이 싸게먹히는것같다.
- 물론 GPU라면 얘기가 달라질 수 있다.
그래서 나는 기껏 구축한 On-prem K8s Cluster를 사용하지않고, K8s 클라우드 서비스로 눈을 돌리게되었다.
내가 GCP를 사용하는 이유
위의 두가지 이유 때문에 On-prem장비를 사용하지 않고, 클라우드 서비스로 눈을 돌렸다.
클라우드 서비스로 눈을 돌려보니, 고려해볼만한 서비스의 종류가 꽤 많았다.
이것저것 고민을 하다가 후보군은 GCP, AWS로 좁혀졌고, 각각의 장단점이 분명했다.
AWS: 쿠버네티스 오퍼레이터 스터디때 사용하는 클라우드가 AWS였고, 관련되서 자료가 많았다. 진입장벽이 생각보다 높다.
GCP: 계정별로 300$ 를 제공받는다. 쿠버네티스 서비스를 사용하기위해서 GCP네트워크를 상대적으로 적게 알아도 가능하다.
개인적인 견해로는
“어차피 헤비하게 사용할 것도 아니고, 적당히 실습정도로 사용할 예정인데 굳이 AWS를 사용해야한가?” 라는 생각이 있었다.
AWS를 사용하려면 AWS관련네트워크를 잘 알고있어야한다고 생각했고, 그 부분이 진입장벽으로 생길게 두려워서 GCP를 사용하기로 결정했다. GCP에서 300크레딧을 제공해주는것도 한몫했다.
따라서 나는 GCP의 GKE(Google Kubernetes Engine)서비스를 사용하였다.
서비스적 관점에서 옳은선택인진 모르겠지만, 개인적관점에서는 최선의선택이었다고 생각한다.
실제로 잘 사용했다. 근데 문제는 뒤에서 발생했다.
*관련포스팅
- https://jjongguet.tistory.com/171 에서 Terraform으로 GKE 프로비저닝 하는 예제를 다뤘다.
- https://jjongguet.tistory.com/search/gke 내 블로그에 있는 DOIK2 스터디 실습은 GKE환경에서 다뤘다.
소 구매하기
내가 K8s를 무료로 손쉽게 사용하기위해서 생각한 방법은
구글 계정을 만들고 ⇒ GCP를 사용하고 ⇒ 300크레딧을 제공받고 ⇒ 300크레딧을 전부다 사용하면 ⇒ 또다른 무료계정을 만든다 ⇒ …
라는 방식을 생각했었다.
실제로 이게 가능한 이유는 구글에는 계정생성제한이 없다는것을 이용했기 때문이며, GCP서비스를 사용하는데에 제약사항이 없었기 때문이다.
예를들어, 내가 사용하는 Terraform을 활용한 GKE노드 프로비저닝 예제에서는 SSD 할당 이슈가 존재하고, 원인은 quota 이었으며
나는 해당이슈를 인지하고 있었고, 이슈를 우회하는 방식으로 해결할 수 있었다.
사용하지 않을 이유가 없었다.
소 잃기
그러던 중 문제가 발생했다.
데이터 엔지니어링 스터디에서 발표를 하고있는데, 갑자기 GCP에서 요금이 결제됐다는것이다.
처음엔 어리둥절했다.
그래서 하는일을 멈추고, GCP를 확인해봤는데 비용청구가 되어있었다.
소를 잃은 이유 알아내기
왜 비용이 청구가 되었던걸까?
그냥 단순하게 원인을 알아보면 “내가 깜빡하고 GKE를 종료하지않았기 때문”이다.
조금 더 자세히 알아보자.
아래사진은 내가 실제로 사용하는 terraform 노드프로비저닝 예제다.(공식 도큐먼트 참고했다)
나는 GKE를 사용할때 asia-northeast3-b 리전에 n2-standard-4 타입의 노드를 2개로 구성해서 사용하며
사용 시작(노드생성)할때는 아래의 명령어를 사용하고
terraform init
terraform apply
#yes
사용 종료(노드제거)할때는 아래의 명령어를 사용한다.
terraform init
terraform destroy
#yes
이렇게 단 두줄의 명령어로 생성과 제거를 하고있었다.
내가 사용하는 GKE노드를 기준으로 24시간의 요금은 약 16000원.
1시간당 700원 정도의 요금이다.
근데, 노드를 최소5~6일동안 켜놨었다는것이고, 약 10만원 가량 과금이 되었다.
(그래서 그냥…. 뭐…… 쌩돈이 나갔다)
외양간 고치기: 알림설정
앞으로 이런일을 방지하기위해서, 크게 두가지의 방법을 고민했다.
첫번째는 예산 알림기능을 지정하는것이고, 두번째는 특정금액에 도달했을때 사용중인 인스턴스를 중지하는것이다.
CHATGPT에 물어본 결과, 두번째 방법은 제공하지 않는다고한다.
그래서, 이 게시글에서는 예산알림을 만들어서
‘적어도 내가 얼마나 과금이 되었는지’ 를 알아차릴 수 있게 해보는 조치를 취했다.
GCP콘솔에서 결제 → 예산 및 알림 → 예산 만들기
나는 5000원이 과금되었을때 알림을 받도록 ‘5000원 알람’ 이라는 예산을 설정했다.
이때 트리거 설정은 실제금액이 알람금액의 50% 90% 100% 에 도달했을때 로 설정했으며
트리거가 되었을때 이메일로 과금상태를 안내받는 형태이다.
Outro
GCP무료 크레딧만 신나게 쓸 생각하다가, 신나게 과금맞아버린 썰을 풀어보았다.
무료라고 아무렇게나 사용하지말고, 과금상태를 꾸준히 알아보고, 더 현명하게 사용해보도록 노력해야겠다고 생각드는 일이었다.
혹시, 글에서 적어놓은 방법을 제외하고, GCP에서 결제를 막는 본인만의 방법이나
추가로 할만한 조치가 있다면
댓글로 공유해주시면 감사하겠습니다!
추가) GCP를 사용하고있는 계정을 지워야한다면
결제 ⇒ 결제관리 ⇒ 결제계정 선택
이후에 결제계정 폐쇄 을 해서, 아에 과금되는 계정을 제거하자.
'프로젝트의 고민들' 카테고리의 다른 글
Devcontainer 로 개발생산성 높이기(부제: Container가 뭐에요?) (4) | 2024.02.05 |
---|---|
실패 후기: KEDA + HTTP add on (3) | 2024.01.24 |
글또 Opening (0) | 2023.12.09 |
티스토리 포스팅 할때 동글(Dong-gle) 사용해본 후기 (2) | 2023.11.13 |
올바르게 일하기 (3) | 2023.09.21 |