⚙️Infrastructure as Code란

우리가 애플리케이션을 배포하고 서비스를 운영하려면 서버, 스토리지, 네트워크 등과 같은 인프라 설정이 필요한데요.

인프라 구축을 애플리케이션 배포 때마다 매번 직접 수동으로 한다면 시간도 오래 걸리고 지루한 작업이 될 것입니다.

만약 이런 인프라 준비 작업을 코드 기반으로 관리하고 자동화할 수 있다면 어떨까요?

이렇게 등장한 개념이 바로, **Infrastructure as Code(IaC)**입니다.

✅IaC를 적용해야 할 이유

앞서 살펴본 것처럼, IaC는 인프라 환경을 수동으로 준비하고 설정하는 대신에 코드를 기반으로 필요한 인프라 리소스를 프로비저닝하고 관리할 수 있는 개념입니다.

이런 IaCDevOps와 CI/CD를 구현하는 데에도 중요한데요.

DevOps 접근법을 기반으로 개발팀과 운영팀의 배포 환경을 직접 수동으로 맞춘다면 갖가지 오류나 불일치 문제가 발생할 수 있고, 극단적인 경우에는 애플리케이션을 수동으로 배포해야만 하는 상황이 생길 수도 있습니다.

하지만 IaC를 도입하면 개발팀과 운영팀이 사용할 애플리케이션 배포 환경을 수월하게 맞출 수 있어서 애플리케이션 배포 자동화가 가능하고, 이는 DevOps 접근법에도 부합합니다.

IaC를 적용하면 인프라 환경 역시 CI/CD 파이프라인을 통해 테스트와 버전 컨트롤이 가능하다는 장점이 있기 때문에 DevOps 관점에서도 IaC 도입이 권장됩니다.

IaC의 개념에 대해 살펴봤으니 IaC를 수행할 수 있는 툴을 살펴볼 차례인데요.

각 IaC 툴에 대해 알아보기 전에 IaC 툴을 사용하면서 얻을 수 있는 이점을 정리하면 아래와 같습니다.

  • 인프라 구축 프로세스를 자동화하여 인프라 프로비저닝 및 관리에 필요한 시간 단축
  • 인프라 리소스 구축에 대한 정의를 소스코드로 관리할 수 있기 때문에 휴먼 에러(Human error)를 줄이고, 일관성 있는 환경 구축 가능
  • 코드 기반으로 인프라를 자동으로 구축할 수 있기 때문에 인프라 구성을 보다 쉽게 확장할 수 있고, 상황에 맞게 인프라 환경을 더욱 신속히 변경 가능
  • 인프라 변경 이력이 관련 코드 수정으로 기록되기 때문에 이력 추적과 문서화에 용이

이런 이점을 가진 대표적인 IaC 툴 2가지 TerraformCrossplane에 대해 간단히 알아보려 하는데요. 첫 번째 순서는 Terraform입니다.

🛠️IaC 툴 알아보기

Terraform

HashiCorp에서 제공하는 Terraform은 퍼블릭 클라우드와 온프레미스 인프라 리소스를 읽기 쉬운 코드로 정의할 수 있도록 도와줍니다.

HashiCorp와 Terraform 커뮤니티에서 개발한 수많은 Provider 덕분에 다양한 클라우드 플랫폼과 서비스의 리소스를 API를 이용해서 자체 개발한 문법의 코드로 인프라 구축이 가능한데요.

Terraform의 워크플로우는 아래와 같이 3단계로 나눌 수 있습니다.

  1. Write(작성): 필요한 인프라 리소스를 개발자가 코드 기반으로 정의
  2. Plan(계획): 정의한 코드를 기반으로 Terraform이 리소스 생성, 업데이트, 제거 준비
  3. Apply(적용): 계획에 대해 승인이 될 경우, Terraform이 알맞은 순서에 맞게 정의된 리소스에 대한 작업 수행

Crossplane

이제 Crossplane에 대해 간단히 알아보겠습니다. Crossplane은 Kubernetes 커스텀 리소스를 이용해서 인프라 관련 리소스를 선언적으로 관리할 수 있는 오픈소스 Kubernetes 애드온인데요.

Kubernetes 클러스터에 설치된 Crossplane을 통해, 사용자는 Kubernetes와 상호작용하는 것만으로 AWS, Azure, GCP 같은 외부 리소스를 관리할 수 있게 됩니다.

Terraform과 Crossplane의 차이

두 IaC 툴 모두 인프라 관련 리소스를 쉽고 효율적으로 구축하고 관리할 수 있도록 도와준다는 것을 알 수 있는데요. 그렇다면 Terraform과 Crossplane의 차이점은 무엇일까요?

네이티브 k8s와의 호환성

Crossplane은 Kubernetes 기반으로 설계된 반면, Terraform은 독자적으로 사용 가능하고 Kubernetes와의 연동은 별도로 제공된 Provider를 이용합니다.

리소스 선언 문법

두 가지 툴 모두 선언적 문법을 사용하는데요. 다만 Crossplane은 Kubernetes에서도 사용하는 YAML 문법을 사용하고, Terraform은 독자적인 HCL 문법을 사용합니다.

프로비저닝

Crossplane은 Kubernetes Controller를 통해 리소스를 프로비저닝하지만, Terraform은 별도로 개발된 API/SDK를 통해 직접 프로비저닝합니다.

생태계

Terraform은 Provider에 대한 생태계가 성숙한 상태이지만, Crossplane의 생태계는 계속 성장 중에 있습니다.

IaC 툴과 Helm chart의 차이

Kubernetes를 관리하고 운영하다보면 프로젝트 단위로 리소스를 쉽게 관리하기 위해 Helm chart를 사용하는 경우가 많습니다.

그래서 위에서 소개한 IaC 툴들과 Helm chart가 동일한 성격의 툴로 보이기도 하는데요.

하지만 IaC 툴과 Helm chart에도 명확한 차이점은 존재합니다.

IaC 툴은 Kubernetes뿐만아니라 AWS, GCP, Azure와 같은 퍼블릭 클라우드의 인프라 리소스도 구성이 가능합니다. 하지만 Helm chart는 Kubernetes 클러스터 내의 리소스만 배포하고 관리할 수 있도록 도와주죠.

또한 IaC 툴은 새로운 Kubernetes 클러스터 생성이 가능하지만, Helm chart는 기존 Kubernetes 클러스터 내의 리소스만 생성할 수 있습니다.

References