IaC와 테라폼
IaC(Infrastructure as Code)
구성관리 (Configuration Management)
- 구성(또는 형상; configuration)은 의존성 때문에 코드에 못지 않게 소프트웨어 시스템에 큰 영향을 미침
- 따라서 구성관리(또는 형상관리)는 잦은 빌드, 통합, 릴리스로 이루어지는 CI/CD에 중요한 측면
- 이를 체계적으로 관리하고 자동화 할 수 있는 여러 종류의 도구가 만들어지고 이용되어 왔음
IaC (Infastructure as Code)
- 인프라스트럭쳐 (소프트웨어가 의도된 목적을 활용하기 위하여 이용하는 환경 구성)을 생성, 변경, 관리
- 수작업에 의하는 것보다 안정성, 일관성, 재현 가능성을 향상시킬 수 있음
- 버전 관리, 재사용, 공유 등에 유리
- 프로그래밍에서와 유사하게 코드를 이용하여 인프라 리소스를 정의하고 조합하는 형태로 관리
- 다양한 형태의 리소스를 정의하고 조합하는 모듈들로 이루어짐
테라폼 (Terraform)
Hashicorp사에서 제공하는 IaC도구
Terraform by HashiCorp
Terraform is an infrastructure as code tool that enables you to safely and predictably provision and manage infrastructure in any cloud.
www.terraform.io
Terraform 설치
Linux
- 패키지 매니저 (apt)를 이용하거나 실행 파일을 다운로드하여 설치
MacOS
- 패키지 매니저 (homebrew)를 이용하거나 실행 파일을 다운로드하여 설치
Windows
- 실행 파일을 다운로드하여 설치
요약
IaC (Infrastructure as Code)
- 일관성 있는 방법으로 재사용할 수 있는 코드를 통하여 인프라 구성에 대하여 버전 관리 및 공유가 가능해짐
- Terraform을 이용하여 인프라 구성 코드를 만들고 운용하는 방법을 실습
- 인프라의 생성, 변경, 삭제 등의 작업을 선언적인 방법의 코드로 구성
Kubernetes + Terraform + Jenkins
인프라 상태의 정보 유지
Terraform은 IaC 설정 디레고리 안에 terraform.tfstate라는 파일을 만들어
이 구성이 관리하고 있는 인프라의 현재 상태를 유지하고 있음
- 인프라 구성의 선언에 변경이 발생하고 그것을 적용하면
- 신규 생성, 삭제, 변경해야할 리소스를 인지할 수 잇는 것은 이것에 의존
- 그런데, CD 파이프라인에 적용하려면 이 상태 정보는 어디에 유지해야 할까?
Terraform Cloud
인프라 상태 정보 유지
- SCM (예: GitHub)에 저장하는 것은 바람직하지 않음
- Jenkins agent는 필요에 따라 생성되고 역할을 다하고 나면 사라지는 k8s 포드에 의해 실행되기 때문에 이 정보를 기록할 수 없음
- k8s persistent volume을 이용하는 방법도 적합하지 않음
- 보통은 이런것을 저장하기 위한 vault 서비스 이용
Terraform Cloud 서비스를 이용해 보자
- 준비: Terraform Cloud에 계정 (무료) 생성
https://app.terraform.io/session
app.terraform.io
Terraform Cloud 설정
Organization 신규생성
- User Settings > Organization 메뉴로 가서 찾을 수 있음
콘솔 로그인
- 명령어: terraform login
- 웹 화면으로 redirect 되고, 여기서 토큰 생성
- 이 토큰을 입력하여 로그인 완료
- 토큰은 비밀로 관리하고 잘 저장해 둘 것
간단한 CD 파이프라인
파이프라인 개발 전략
스테이징 환경(과 프로덕션 환경) 구성 설계
- 우리의 실습 환경에서는 몇 가지 제한점이 있음을 고려해야 함
로컬 환경에서 테스트
- Terraform CLI를 이용하여 설계된 기능의 동작을 기초적으로 확인
Jenkins 파이프 라인에 통합
- Build agent의 구성 업데이트
- Pipeline script 테스트
- Jenkinsfile로 작성하고 code repository 정리
소프트웨어 배포 환경 유형
개발 환경
🔸코드 개발에 적용
: 모든 개발자가 이용하는 공유 서버를 활용하거나 개발자마다 별도의 실행 환경을 활용
테스트 환경
🔸QA팀이 외부 시스템과의 상호작용을 포함한 통합 테스트에 적용
: 실제 서비스 운용 구성과 같이 않음
스테이징 환경
🔸실제 서비스하기 직전에 최종 테스트에 적용
: 서비스 운용 환경(프로덕션)을 가능한 한 그대로 복제
프로덕션 환경
🔸최종 사용자를 대상으로 서비스에 적용
: 비즈니스 요구사항에 따라 설계, 운용 및 진화
프로덕션 VS 스테이징
스테이징 환경은 프로덕션 환경을 가능한 한 그대로 모사하도록 설계되어야 함
- (가상화 됨) 인프라의 논리적 구성뿐만 아니라 컨퓨팅 리소스의 물리적/지리적 배치 등도 고려
- 생각해볼 만한 시나리오
- : 상용 클라우드 서비스에 동일한 구성을 갖는 서로 다른 k8s 클러스터를 이용
우리의 실습에서는 제약점들이 존재
- 하나의 k8s 클러스터 (docker desktop 환경)만 이용
- 테스트를 위해서 클러스터 외부로부터의 접근이 어려움 (또는 불가)
실습을 위해서 채택하는 방법
- 하나의 클러스터 내에서 네임스페이스만 별도로 구성해 보면서
- 프로덕션과 스테이징 환경이 분리된 상황에서는 어떻게 파이프라인을 구성할지를 사고 시뮬레이션
배포 환경 준비 및 테스트
Terraform 작업을 위한 별도 디렉토리 생성
- ${PROJECT_ROOT}/iac
이 안에 스테이징과 프로덕션 환경 구성 작성
- 달라지는 부분을 별개 파일로 만들고 배포할 때 적용
각 환경 구성을 유지할 TF Cloud 워크 스페이스 설정
- Organization: PRGMS_COURSE_CICD
- Staging workspace: calculator-dev
- Production workspace: calculator-prod
- ✨Execution Mode -> Local
파이프라인 테스트
새 Jenkins 아이템 (임시) 생성
- Pipeline script 적용
- Checkout 단계에서 Jenkinsfile과 차이 있음을 주의
Build Now 적용해서 모든 단계 검토
결과 확인
- Console Output
- k8s 클러스터에 배포된 상태 - prod 네임스페이스 안의 deployment, pods, service
- curl 또는 브라우저에서 localhost:31000으로 접근 가능함 확인
CI / CD 파이프라인 완성
🔸Poll SCM 트리거 확인
🔸Pipeline script를 Jenkinsfile로 git commit && push
🔸빌드 및 테스트, 배포결과 확인
정리
웹 응용의 개발 이후에 벌어지는 일들 (과 이에 이용되는 도구들)
🔸Docker
- 응용을 컨테이너화 하여 독립적이고 통일된 환경에서 실행할 수 있도록 함
🔸Kubernetes
- 컨테이너화된 응용을 효과적이고 안정적으로 운용
🔸Terraform
- 응용이 실행될 인프라 리소스 구성과 의존 관계를 코드로 관리
🔸Jenkins
- 빌드, 테스트, 배포, 관리 등의 작업을 자동화하여 CI/CD 파이프라인 실행
비기능 테스트
시스템 운영에 심각한 위험을 초래할 수 있는 요소들을 테스트를 통하여 예방
- 매우 중요한 것이지만 자동화하여 파이프라인에 포함하기는 쉽지 않음
비기능 테스트의 종류
- 성능 테스트
- 부하 테스트
- 스트레스 테스트
- 확장성 테스트
- 내구성 테스트
- 보안 테스트
- 유지보수 테스트
- 복구 테스트
데이터베이스 변경 관리
상태가 없는 웹 응용과는 달리 데이터베이스는 여러 복잡성을 초래
- 테스트 데이터 vs 프로덕션 데이터
- 데이터베이스의 규모와 시스템 성능
- 스키마 업데이트
마이그레이션 스크립트 등을 활용하여 안정성과 복구 가능성을 추구
릴리스 패턴 (Release Pattern)
프로덕션을 새로운 소프트웨어 버전으로 업데이트 할 때의 위험도를 낮추기 위한 전략
- 실제 서비스의 운영에서는 최종 릴리스에 수동 승인 절차를 갖추는 방식을 많이 채택
릴리스 패턴의 종류
- 롤링 업데이트 (rollig update)
- 블루-그린 배포 (blue-green deployment)
- 카나리아 릴리스 (canary release)
모니터링과 진단
모니터링 (Monitoring)
- 시스템 구성 인프라 내의 자원 상태와 활용도 등을 지속적으로 검사
진단 (Diagnosis)
- 잠재적 위험 요소를 조기 발견하고 대응책을 수립
알림 (Notification)
- 빌드의 성공/실패, 자원 활용의 변화 등에 대하여 (주로 데브옵스팀에) 자동 알림을 설정
'공부 > 타입스크립트로 함께하는 웹 풀 사이클 개발(React, Node.js)' 카테고리의 다른 글
프로젝트: 오픈소스 기반의 웹 파이프라인 구축(2) (0) | 2024.12.10 |
---|---|
프로젝트: 오픈소스 기반의 웹 파이프라인 구축(1) (1) | 2024.12.09 |
웹 개발 파이프라인 구축(4) (1) | 2024.12.05 |
웹 개발 파이프라인 구축(3) (1) | 2024.12.04 |
웹 개발 파이프라인 구축(2) (0) | 2024.12.03 |