최근에 처음으로 Kubernetes를 학습하게 되었다.
기존부터 나는 Docker의 애용자였고, 서비스의 배포 및 관리를 위해 AWS ECS를 주로 사용하고 있었다.
그러나 Kubernetes는 한 번도 다뤄본 적이 없었는데, 최근 처음으로 Kubernetes 기반으로 구축된 대규모의 시스템을 관리하게 되며 공식 문서와 Udemy 강의 등의 도움을 얻어 Kubernetes를 습득하고 있다.
그런데… Kubernetes가 제공하는 기능들을 들으면 들을수록, 계속하여 드는 한 가지 생각이 있었다.
어? 이거 ECS로도 충분히 할 수 있는 건데?
여러 개의 컨테이너를 띄우고, 각각의 상태를 체크하고, 원활한 서비스를 위해 개수를 자동으로 조정하는 일 등은 AWS ECS가 제공하는 기능들로도 충분히 할 수 있는 일이었다.
그럼, 어째서 container와 agent로만 구성되어 훨씬 더 간단한 구조인데다가 학습 난이도도 그닥 높지 않은 ECS를 두고 EKS를 선택하는 사람들이 있는 거지?
그렇게 Kubernetes의 필요성에 대해 근본적인 의문을 제기하기 시작할 때쯤.
문득 회사의 인프라 구축 환경을 돌아보니, On-Premise 위에서 구동되는 서비스도 더러 있고, 클라우드 프로바이더가 제공하는 가상 머신 위에서 구동되는 서비스도 있다는 것을 떠올렸다.
심지어 몇몇 서비스의 경우 On-Premise 관리의 어려움에 의해 클라우드로 인프라를 이전하거나, 클라우드 서비스의 가격 부담 문제로 On-Premise로 이전하거나 하는 경우도 있었다.
이를 보며, 만약 내가 AWS ECS로 열심히 구축해놓은 인프라를 다른 클라우드 프로바이더로 이전하거나 On-Premise에 다시 구축하려면 어떤 과정을 거쳐야 하는지 생각해보았다.
- 우선 변경할 인프라 환경에서 기존 AWS에서 지원하던 기능들을 대체하기 위해 사용할 수 있는 것들이 무엇인지 조사해야 한다. EC2 기반의 멀티 컨테이너를 구동해야 하는 ECS 환경을 기준으로는 컨테이너 구동 환경을 정의할 수 있는 Task 정의, 서비스와 클러스터의 속성들, AWS Load Balancer와 Auto Scaling Group 등과의 연동을 통해 누릴 수 있는 기능들이 이에 해당할 것이다.
- 대체 가능한 도구들에 대한 조사 및 숙지가 완료되었다면, 변경할 인프라 위에서 컨테이너 구동 환경을 바닥부터 다시 구축한다.
이것에 필요한 공수는 시스템의 크기가 커질수록 비대해진다. 수십 개의 마이크로서비스로 이루어진 시스템의 인프라를 이전한다고 생각해보자. 각 서비스별 구동 환경을 구성하기 위해 정말 많은 시간을 소요하게 될 것이다…
그와 비교해서 Kubernetes는 kubeconfig라는 설정 파일을 기반으로 클러스터를 구축하기 때문에 어떤 리소스들에 어떤 특징을 부여할 것인지를 미리 약속된 템플릿에 맞춰 작성해두기만 하면 어디서든 쉽게 동일한 배포 및 관리 환경을 구축할 수 있다. (물론 머신을 마련하고 클러스터 실행 환경을 마련하기 위한 최소한의 러닝 커브는 존재한다.)
그럼에도 여전히 은총알은 없다.
그렇다고 해서 kubernetes가 무조건 옳은가? 언제 어디서든 미래를 대비하여 kubernetes 클러스터를 구축하여 시스템을 관리하는 것이 맞는가? 라고 누군가 묻는다면, kubernetes를 학습한 뒤 오히려 더 그렇지 않다는 생각이 들었다.
예를 들어, 짧은 생명주기를 갖는 SW라든지, 규모가 정말 작은 서비스에서는 굳이 Kubernetes를 도입할 필요가 없을 수도 있다. 오히려 불필요한 리소스들이 개입하여 전체 시스템이 무거워지고 관리가 더 복잡해지며, 시스템의 운영자들이 Kubernetes의 어마어마한 러닝커브를 감당해야 한다는 단점만 생길 수도 있기 때문이다.
Kubernetes를 도입하기 애매한(해도 좋고 아니어도 그만인) 곳에서는 인재 영입의 이유로 도입을 결정할 수도 있을 것 같다. 표준화의 또 한 가지의 장점은, 특정 기업/도메인에만 종속되지 않는, 어디서는 통용되는 지식이라는 점이기 때문이다. 즉, 더 인재를 채용하기도 수월해지고 신규 투입된 인원이 (Kubernetes를 기존에도 사용하던 사람이라면) 더 빠르게 새 직장에 적응할 수 있기도 하다는 의미이다.
아주 오랜 시간 운영되는 거대한 시스템이라면, Kubernetes의 도입은 아주 좋은 선택이 될 수 있다. Kubernetes는 시스템을 관리하는 수많은 개발자들로 하여금 리소스를 다루는 방식을 일관화하고, 아주 먼 미래에 혜성같이 등장할 최강의 클라우드 프로바이더로 인프라를 옮기는 것을 망설이지 않도록 도울 것이다.