웹 파이프라인/CD

IaC 와 테라폼

thinktank911 2025. 12. 18. 02:50

IaC와 테라폼

구성관리(Configuration Magement)

  • 구성(또는 형상; configuration)은 의존성 때문에 코드에 못지 않게 소프트웨어 시스템에 큰 영향 미침
  • 따라서 구성 관리 (또는 형상관리)는 잦은 빌드, 통합, 릴리스로 이루어지는 CI/CD에 중요한 측면
  • 이름 체계적으로 관리하고 자동화할 수 있는 여러 종류의 도구가 만들어지고 이용되어 왔음

IaC(Infrastructure as Code)

  • 인프라스크럭처(소프트웨어가 의도된 목적을 활용하기 위하여 이용하는 환경 구성)를 생성, 변경, 관리
  • 수작업에 의하는 것보다 안정성, 일관성, 재현 가능성을 향상시킬 수 있음
  • 버전 관리, 재사용, 공유 등에 유리
  • 프로그래밍에서와 유사하게 코드를 이용하여 인프라 리소스를 저의하고 조합하는 형태로 관리
    • 다양한 형태 리소스 정의하고 조합하는 모듈들로 이루어짐

테라폼(Terraform)

IaC 도구
참고 링크 : https://developer.hashicorp.com/terraform

Scope => Author => Initialize => Plan => Apply

첫번째 구성 설정 작성

main.tf

  • 중요한 부분: "provider"
    • Terraform registry (kreuzwerker/docker)에서 설정 가져옴
    • 버전은 3.0.1 이후로 지정
  • Docker 이미지 지정하고 (nginx:latest)
  • 이것을 이용한 컨테이너를 인프라로 생성
    • http에 해당하는 포트(80)를 열어
    • 이것을 8000 포트로 노출

=> main.tf 작성한 폴더에서 terraform init CLI로 실행

  • terraform validate
  • terraform fmt
  • terraform apply -> yes
    • yes 자동화 : terraform apply --auto-approve

변수를 이용한 인프라 구성

  • main.tf 수정
  • variables.tf 작성
  • terraform apply --auto-approve --var "container_name=YetAnotherName"

출력 포맷 적용

  • outputs.tf 작성 후 apply
  • terraform output

테라폼 삭제

  • terraform destroy

쿠버네티스 + 테라폼 + 젠킨스

terraform.tfVars 작성

  • kubectl config view --minify --flatten

host
client_certificate
client_key
cluster_ca_certificate

인프라 구성 변경

deployment.tf 레플리카셋 4 => 2로 변경하여 scale down

[환경 정리]
terraform destroy

인프라 상태의 정보 유지

Terraform은 IaC 설정 디렉토리 안에 terraform.tfslate라는 파일 만들어
이 구성이 관리하고 있는 인프라의 현재 상태 유지하고 있음

  • 인프라 구성의 선언에 변경이 발생하면 신규 생성, 삭제, 변경해야 할 리소스 인지할수 있는 것은 이것에 의존
  • 그런데, CD 파이프라인에 적용하려면 이 상태 정보는 어디에 유지해야 할까?

Terraform Cloud

인프라 상태 정보 유지

  • SCM(예:github)에 저장 바람직하지 않음
  • Jenkins agent는 필요에 따라 생성되고 역할을 다하고 나면 사라지는 k8s 포드에 의해 실행되기 때문에 이 정보 기록x
  • k8s persistent volume을 이용하는 방법 적합x
  • 보통 저장 위한 vault 서비스 이용

Terraform Cloud 서비스 이용하기

variable "kube_host" {
  type        = string
  description = "Kubernetes API server endpoint"
}

variable "kube_token" {
  type        = string
  description = "Kubernetes service account token"
  sensitive   = true
}

variable "kube_cluster_ca_certificate" {
  type        = string
  description = "Kubernetes cluster CA certificate"
  sensitive   = true
  default     = ""
}

Jenkins 파이프라인 테스트 준비

  • GitHub 새 repo 생성
  • nginx.tf만 배치
  • Jenkins credentials에 Terraform Cloud 인증 정보 추가
    • 형태는 secret text~ "Secret"에는 앞서 발급한 Terraform Cloud의 인증 토큰 그대로 입력
    • terraform-credentials 적용
  • 파이프라인 스크립트 추가

요약

  • Terraform provider(hashicorp/kubernetes) 이용해 k8s 클러스터 위에 구성되는 인프라 설정 IaC 방식으로 제어
  • k8s 클러스터 설정을 Terraform에 적용하는 두가 지 방식
    • 개별 변수 {host, client_certifiate, client_key, cluster_ca_certificate} 이용`
    • Kubedinfig파일(로컬 컴퓨터 ~/.kube/config 또는 Jenkins secret을 agent에게 전달)의 경로 지정
  • Terraform에 의해 관리되는 인프라 수것으이 상태 정보 Terraform Cloud에 저장
    • 인프라 리소스 상태 정보 공유
    • 민감한 정보 불필요한 노출 방지

'웹 파이프라인 > CD' 카테고리의 다른 글

간단한 CD 파이프라인  (0) 2025.12.18