IaC(Infrastructure as a Code)인 Pulumi로 k8s 인프라 관리하기

Ryan Kim
5 min readJun 11, 2022

--

서비스가 커질 수록 빛을 보는 IaC, Pulumi 적용하기

Qraft Technologies의 MLops 쪽 현업 근무를 해보면서, 취준생일 때는 경험해 볼 수 없는 스택과 근무환경을 배우고, 직접 적용해 볼 수 있다는 것은 큰 축복이다.

무엇보다 함께 근무하는 사람들과 소통이 잘 된다는 것, 함께 하나씩 눈 앞에 주어진 기술적 문제를 해결해 나간다는 것은 내 스스로의 학습하고, 성장해 나가는 것이 큰 자극을 주고 있다.

회사에서 MLops의 인프라를 관리하는 툴로써 현재 쿠버네티스를 사용하고 있고 (이하 k8s라고 표현) 여기서 파이프라인을 하나씩 추가해 나감에 따라 관리해야하는 pod들이 조금씩 많아지기 시작했다.

쿠버네티스 기반으로 돌아가는 pod들은 보통 배포하거나 업데이트할 때, 다음 커맨드를 이용한다.

kubectl apply -f <적용할 yaml 파일> -n <네임스페이스>

관리할 pod와 네임스페이스가 몇 개 없다면 이렇게 하나씩, 일일이 적용하는 것에 큰 불편을 못느끼겠지만, 만약 배포해야하는 서비스 또는 툴이 10개, 20개, 100개, 10,000개 라면 어떻게 될까?

이것들을 설정 파일마다 kubectl 커맨드로 적용하기에는 불필요한 개발자의 수요와 단순 반복 업무의 연속이 될 것이라는 것은 불 보듯 뻔하기 때문에, 이것보다 훨씬 더 단순하고 빠르게, 그렇다, 한 번의 명령어로 pod 업데이트나 생성을 진행할 수 있는 그런 툴을 찾아야하는 상황에 이르렀다.

해야하는 일을 명확하게 정의했다면, 이 정의에 해당하는 용어와 관련 SDK, 플랫폼 등을 탐색하게 되었는데, 이 때 우리 회사에서는 Pulumi라는 IaC(Infrastructure as Code, 코드형 인프라)를 선택하게 되었다.

본격 pulumi의 세계로!

IaC는 수동 프로세스가 아닌 코드를 통해 인프라를 관리하고 프로비저닝하는 것을 말하는데, 세간에 이미 잘 알려져 있는 것은 Terraform이라는 것이 있다.

pulumi를 선택한 것에는 여러 언어로 인프라를 관리하기 쉽게 SDK를 제공하고 있고, 세간에 잘 알려져 있는 클라우드 (GCP, AWS, Azure 등)에 사용할 수 있을 뿐만 아니라 온프레미스 환경에서도 활용하는 것이 가능하다.

그리고 사용하기 전에는 몰랐지만 k8s의 yaml 파일을 개발자가 사용하는 프로그래밍 언어로 변환해 배포하는 것이 가능하고 (kube2pulumi라는 모듈을 별도로 제공한다) k8s에 새로운 서비스를 배포하거나 업데이트할 때, 매번 전체를 다 배포하는 것이 아니라 변경 사항을 감지해서 배포하는 것이 가능했다.

https://www.pulumi.com/kube2pulumi/ 여기서 yaml을 원하는 프로그래밍 언어로 변환하는 것이 가능하다.

개인적으로 여태껏 개발하면서 특정 프레임워크나 플랫폼을 이용할 때, 감탄한 적은 없는데, pulumi를 처음 사용해서 k8s 배포를 성공했을 때, 팀원들에게 감탄의 메세지를 보냈었다.

pulumi는 진짜 혁명이다.

게다가 pulumi가 동작하는 환경에 대해 이해하고 나면, 얼마나 개발자의 사용성에 초점을 맞추고 플랫폼을 빌드했는지 이해할 수 있는데, 클라우드 & 온프레미스 환경에 native한 작업을 수행할 수 있다는 점이다. 이를 pulumi에서는 더 높은 추상화를 통해 복잡성을 해소한다고 표현하는데, 요런 부분에서 pulumi를 개발한 사람들의 역량을 엿볼 수도 있다고 생각한다.

pulumi로 배포할 땐, 다음과 같이 사용하는 프로그래밍 언어로 구조를 변환해준다.

yaml파일 하나 당 .py를 하나씩 생성해준다고 이해하면 될 것 같고 (yaml파일이 어떻게 정의되어 있느냐에 따라 조금씩 다르다) pulumi를 통해 배포할 pod를 정의할 땐, 반드시 get_object라는 함수로 명칭을 지정해야한다.

위와 같이 pulumi_kubernetes를 사용해서 쿠버네티스에 배포할 때 사용가능하며, 정의가 되었다면 pulumi up이라는 커맨드를 사용해서 배포를 진행하는 것이 가능하다.

아마 pod를 한 두개 띄울 정도의 일만을 했었던 옛날의 경우, pulumi와 같은 IaC를 사용하는 것을 전혀 생각 못했을 것이다. 왜 불편한지를 인지 못하는 상황이기 때문에 여기서 더 확장해 나가는 생각을 못했을 것이며, 필요하다 했더라도 쉘 스크립트에 배포할 목록을 변경해 나가며 배포했을 가능성이 높다.

그러나 pulumi의 사용은 내게 개발자로서 생산성을 향상시키는 것이 무엇인지 이해시켜주는 계기가 되었고, 아마 뭔가를 개발하는 상황에서 불편한 상황이 발생했다면 (코드나 관리 측면에서) 앞으로 이를 개선할 수 있는 뭔가를 더 찾아보게 될 것이다.

현재 pulumi로 하나씩 기존 yaml 파일들을 파이썬 코드로 변경해서 namespace별로 통합하기 시작했는데, 조금 시간은 걸리지만, 꾸준히 회사에서 관리하는 서비스들이 관리되기 시작하는 것 같아, 내 성장과 함께 회사 인프라도 체계가 잡히는 것이 눈에 보여 기분이 좋다.

Ryan

--

--

Ryan Kim
Ryan Kim

No responses yet