Day 54 - IaC, 테라폼, Kubernetes + Terraform + Jenkins

이유승·2025년 2월 25일

* 프로그래머스, 타입스크립트로 함께하는 웹 풀 사이클 개발(React, Node.js) 5기 강의 수강 내용을 정리하는 포스팅.

* 원활한 내용 이해를 위해 수업에서 제시된 자료 이외에, 개인적으로 조사한 자료 등을 덧붙이고 있음.

📚 Part 6: CD 파이프라인 구축

📁 IaC와 테라폼

📌 IaC (Infrastructure as Code)

IaC(Infrastructure as Code)는 인프라를 코드로 정의하고 관리하는 방법론이다.
소프트웨어 시스템의 구성(Configuration) 관리는 CI/CD 파이프라인에서 중요한 역할을 한다.

🎯 IaC의 필요성

  • 자동화: 수작업보다 빠르고 일관된 인프라 관리 가능
  • 버전 관리: 코드 기반으로 인프라 변경 사항 추적 가능
  • 재현 가능성: 동일한 환경을 반복적으로 구성 가능

📌 IaC 도구 예시

  • Terraform: HashiCorp에서 제공하는 오픈소스 IaC 도구
  • Ansible: 구성 관리(Configuration Management) 자동화 도구
  • CloudFormation: AWS의 IaC 관리 도구

📌 테라폼 (Terraform)

Terraform은 클라우드 및 온프레미스 인프라를 코드로 관리하는 IaC 도구이다.

🎯 Terraform 실행 흐름

  1. Scope → 적용할 인프라 리소스 정의
  2. Author.tf 파일을 작성하여 선언형으로 인프라 정의
  3. Initialize → Terraform 실행 환경 초기화
  4. Plan → 적용 전 변경 사항 미리보기
  5. Apply → 정의된 인프라를 적용

📌 첫 번째 Terraform 구성 설정

🛠 기본 구조 설정

  1. 빈 디렉토리 생성 후, main.tf 파일 작성
  2. Terraform provider 설정
    • Terraform Registry에서 kreuzwerker/docker 제공 설정 불러오기
  3. Docker 컨테이너 생성
    • nginx:latest 이미지 사용
    • HTTP(80) 포트를 호스트의 8000 포트에 노출
provider "docker" {
  version = "~> 3.0.1"
}

resource "docker_container" "nginx" {
  image = "nginx:latest"
  name  = "web_server"
  ports {
    internal = 80
    external = 8000
  }
}

📁 Kubernetes + Terraform + Jenkins

📌 인프라 상태 정보 유지

Terraform은 현재 인프라 상태를 terraform.tfstate 파일에 저장하여 관리한다.
이 파일을 통해 Terraform은 새로운 리소스 생성, 변경, 삭제 여부를 결정한다.

🎯 문제점: 상태 정보 저장 위치

GitHub에 저장하는 것은 보안상 위험
Jenkins Agent는 일시적으로 생성되므로 상태 정보 유지 불가능
Kubernetes의 Persistent Volume 사용도 적합하지 않음

👉 해결책: Terraform Cloud 이용


📌 Terraform Cloud 설정

Terraform Cloud는 인프라 상태 정보를 중앙에서 관리할 수 있는 서비스이다.

🛠 Terraform Cloud 설정 과정

  • Terraform Cloud 계정 생성 (Terraform Cloud)
  • Organization 생성
    - User Settings → Organization 메뉴에서 생성
  • Terraform Cloud 로그인
terraform login

웹 브라우저에서 인증 후, 토큰 입력하여 로그인 완료
⚠ 토큰은 안전하게 보관해야 함!


📁 간단한 CD 파이프라인

📌 CD 파이프라인 설계

현재 CI 파이프라인 상태: ✅ 코드 체크아웃 → ✅ 빌드 & 테스트 → ✅ 패키징 & 레지스트리 푸시

🚧 스테이징 및 프로덕션 환경 구축이 필요함

👉 Terraform을 활용하여 스테이징 및 프로덕션 환경 구성
👉 Acceptance Test 및 Smoke Test 추가
👉 빌드 버전 관리 고려


📌 파이프라인 개발 전략

🎯 진행 과정

  • 스테이징 및 프로덕션 환경 설계
    - 실습 환경에서는 로컬에서만 실행 가능
  • Terraform CLI로 로컬 테스트
  • Jenkins 파이프라인 통합
    - Build Agent 업데이트
    - Pipeline script 작성 및 테스트
  • Jenkinsfile 작성 후 코드 저장소에 정리

📌 소프트웨어 배포 환경 유형

개발 환경 -> 개발자가 코드 작성 및 테스트를 수행
테스트 환경 -> QA 팀이 통합 테스트를 수행
스테이징 환경 -> 실제 서비스와 유사한 환경에서 최종 검증
프로덕션 환경 -> 최종 사용자를 위한 운영 환경

👉 스테이징 환경은 프로덕션과 최대한 동일하게 유지하는 것이 중요!


📌 프로덕션 vs 스테이징 환경

프로덕션: 실제 운영 환경 (고객이 사용)
스테이징: 프로덕션과 동일한 구성을 유지하되, 테스트 목적으로 사용

👉 실습에서는 하나의 Kubernetes 클러스터 내에서 네임스페이스 분리하여 테스트


📁 과목 마무리

📌 강의 요약

이 과정에서 다룬 주요 내용:

Docker: 애플리케이션을 컨테이너화하여 독립적 실행 환경 제공
Kubernetes: 컨테이너를 효과적으로 배포 및 관리
Terraform: IaC 기반으로 인프라 리소스 관리
Jenkins: CI/CD 자동화 도구


📌 비기능 테스트 (Non-functional Testing)

비기능 테스트는 시스템 운영에 중요한 영향을 미치지만 자동화하기 어려운 경우가 많다.

🎯 주요 비기능 테스트 유형

성능 테스트 -> 시스템의 응답 속도 및 처리량 측정
부하 테스트 -> 다중 사용자 요청 시 성능 검증
스트레스 테스트 -> 극한 상황에서의 안정성 확인
확장성 테스트 -> 트래픽 증가 시 시스템 대응 능력 확인
내구성 테스트 -> 장기간 운영 시 안정성 검증
보안 테스트 -> 취약점 분석 및 보안 강화
복구 테스트 -> 장애 발생 시 복구 가능성 확인


📌 데이터베이스 변경 관리

CI/CD 파이프라인에서 데이터베이스 변경 관리는 매우 중요한 요소이다.

🎯 주요 고려사항

테스트 데이터 vs. 프로덕션 데이터: 데이터 규모 및 성능 차이 고려
스키마 업데이트: 변경 시 충돌 방지 필요
마이그레이션 스크립트 사용: 자동화된 변경 관리

📌 릴리스 패턴 (Release Pattern)

프로덕션 환경에서 새로운 소프트웨어 버전 배포 시 위험도를 낮추기 위한 전략을 적용한다.

🛠 주요 릴리스 패턴

롤링 업데이트 -> 서비스 중단 없이 점진적으로 배포
블루-그린 배포 -> 새로운 버전을 별도 환경에서 배포 후 전환
카나리아 릴리스 -> 일부 사용자에게 먼저 배포 후 점진 확대


📌 모니터링과 진단

🎯 주요 요소

  • 모니터링 (Monitoring)
    시스템의 리소스 상태 및 활용도를 지속적으로 추적
  • 진단 (Diagnosis)
    장애 요소를 조기 감지하고 해결
  • 알림 (Notification)
    빌드 성공/실패, 자원 변화 등을 자동으로 알림

👉 CI/CD 파이프라인에서는 모니터링 및 진단을 필수적으로 포함해야 함!


📌 결론 및 다음 단계
이번 과정에서는 CI/CD 파이프라인 구축과 IaC 적용을 다루었다.
실무에서는 보안 강화 및 배포 자동화 최적화를 추가적으로 고려해야 한다.
🚀 CI/CD 파이프라인을 지속적으로 개선하며 DevOps 역량을 강화하자!

profile
프론트엔드 개발자를 준비하고 있습니다.

0개의 댓글