[17주차 Day4] 모니터링 도구 활용 실습

반 히·2024년 6월 21일

데브코스

목록 보기
52/58
post-thumbnail

📚 Part 6 CD 파이프라인 구축


📁 IaC와 테라폼

📌 laC (Infrastructure as Code)

  • 구성 관리 (Configuration Management)
    • 구성 (또는 형상; configuration)은 의존성 때문에 코드에 못지 않게 소프트웨어 시스템에 큰 영향을 미침
    • 따라서 구성 관리 (또는 형상 관리)는 잦은 빌드, 통합, 릴리스로 이루어지는 CI/CD에 중요한 측면
    • 이를 체계적으로 관리하고 자동화할 수 있는 여러 종류의 도구가 만들어지고 이용되어 왔음
  • laC (Infrastructure as Code)
    • 인프라스트럭쳐 (소프트웨어가 의도된 목적을 활용하기 위하여 이용하는 환경 구성)를 생성, 변경, 관리
    • 수작업에 의하는 것보다 안정성, 일관성, 재현 가능성을 향상시킬 수 있음
    • 버전 관리, 재사용, 공유 등에 유리
  • 프로그래밍에서와 유사하게 코드를 이용하여 인프라 리소스를 정의하고 조합하는 형태로 관리
    • 다양한 형태의 리소스를 정의하고 조합하는 모듈들로 이루어짐

📌 테라폼 (Terraform)

  • Hashicorp 사에서 제공하는 IaC 도구
  • Scope -> Author -> Initialize -> Plan -> Apply

📌 첫 번째 구성 설정을 작성

  • 적당하나 위치에 빈 디렉토리를 만들고, 이 안에 오른쪽과 내용을 main.tf파일로 작성
    • 중요한 부분: "provider"
      • Terraform registry (kreuzwerker/docker)에서 설정을 가져옴
      • 버전은 3.0.1 이후로 지정
    • Docker 이미지를 지정하고 (nginx:latest)
    • 이것을 이용한 컨테이너를 인프라로 생성
      • http에 해당하는 포트 (80)를 열어
      • 이것을 8000 포트로 노출


📁 Kubernetes + Terraform + Jenkins

📌 인프라 상태의 정보 유지

  • Terraform 은 laC 설정 디렉토리 안에 terraform.tfstate 라는 파일을 만들어 이 구성이 관리하고 있는 인프라의 현재 상태를 유지하고 있음
    • 인프라 구성의 선언에 변경이 발생하 (고 그것을 적용하) 명 신규 생성, 삭제, 변경해야 할 리소스를 인지할 수 있는 것은 이것에 의존
    • 그런데, CD 파이프라인에 적용하려면 이 상태 정보는 어디에 유지해야 할까?

📌 Terraform Cloud

  • 인프라 상태 정보 유지
    • SCM (예: GitHub)에 저장하는 것은 바람직하지 않음 (왜?)
    • Jenkins agent 는 필요에 따라 생성되고 역할을 다하고 나면 사라지는 k8s 포드에 의해 실행되기 때문에 이 정보를 기록할 수 없음
    • K8s persistent volume 을 이용하는 방법도 적합하지 않음 (왜?)
    • 보통은 이런 것을 저장하기 위한 vault 서비스 이용
  • Terraform Cloud 서비스를 이용해 보자
  • Organization 신규 생성
    • User Settings > Organization 메뉴로 가서 찾을 수 있음
    • 이 강의에서는 PRGMS_COURSE_CICD 라는 이름을 가정
  • 콘솔 로그인
    • 명령어: terraform login
    • 웹 화면으로 redirect 되고, 여기서 토큰 생성
    • 이 토큰을 입력하여 로그인 완료
    • 토큰은 비밀로 관리하고 잘 저장해둘 것


📁 간단한 CD 파이프라인

📌 CD 파이프라인 설계

  • 지금까지 개발한 CI 파이프라인의 상태
    • Code checkout → Build & test → Packaging & Registry push 까지 완성
    • Staging 과 Acceptance test 는 임시 상태 (목표하는 환경 구성 대신 docker 이용)
  • CD 파이프라인 완성을 위하여 남아 있는 일들
    • 스테이징 환경과 프로덕션 환경 구성 Terraform laC를 이용하기로 함
    • Acceptance test 와 smoke test 단계를 설정
    • 추가로 고려하고자 하는 것들
      • 빌드 버전 관리

📌 파이프라인 개발 전략

  • 스테이징 환경 (과 프로덕션 환경) 구성 설계
    • 우리의 실습 환경에서는 몇 가지 제한점이 있음을 고려해야 함
  • 로컬 환경에서 테스트
    • Terraform CLI를 이용하여 설계된 기능의 동작을 기초적으로 확인
  • Jenkins 파이프라인에 통합
    • Build agent 의 구성 업데이트
    • Pipeline script 테스트
    • Jenkinsfile 로 작성하고 code repository 정리

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

  • 개발 환경
    • 코드 개발에 적용: 모든 개발자가 이용하는 공유 서버를 활용하거나 개발자마다 별도의 실행 환경을 활용
  • 테스트 환경
    • QA 팀이 외부 시스템과의 상호작용을 포함한 통합 테스트에 적용: 실제 서비스 운용 구성과 같지 않음
  • 스테이징 환경
    • 실제 서비스하기 직전에 최종 테스트에 적용: 서비스 운용 환경 (프로덕션)을 가능한 한 그대로 복제
  • 프로덕션 환경
    • 최종 사용자를 대상으로 서비스에 적용: 비즈니스 요구사항에 따라 설계, 운용 및 진화

📌 프로덕션 vs 스테이징

  • 스테이징 환경은 프로덕션 환경을 가능한 한 그대로 모사하도록 설계되어야 함
    • (가상화된) 인프라의 논리적 구성뿐만 아니라 컴퓨팅 리소스의 물리적/지리적 배치 등도 고려
    • 생각해 볼만한 시나리오: 상용 클라우드 서비스에 동일한 구성을 갖는 서로 다른 k8s 클러스터를 이용
  • 우리의 실습에서는 제약점들이 존재
    • 하나의 k8s 클러스터 (docker desktop 환경) 만 이용
    • 테스트를 위해서 클러스터 외부로부터의 접근이 어려움 (또는 불가)
  • 실습을 위해서 채택하는 방법
    • 하나의 클러스터 내에서 네임스페이스만 별도로 구성해 보면서
    • 프로덕션과 스테이징 환경이 분리된 상황에서는 어떻게 파이프라인을 구성할지를 사고 시뮬레이션


📚 Part 7 Outro


📁 과목 마무리

📌 강의 (및 실습) 흐름

  • 웹 응용의 개발 이후에 벌어지는 일들 (과 이에 이용되는 도구들)
    • Docker - 응용을 컨테이너화하여 독립적이고 통일된 환경에서 실행할 수 있도록 함
    • Kubernetes - 컨테이너화된 응용을 효과적이고 안정적으로 운용
    • Terraform - 응용용이 실행될 인프라 리소스 구성과 의존 관계를 코드로 관리
    • Jenkins - 빌드, 테스트, 배포, 관리 등의 작업을 자동화하여 CI/CD 파이프라인 실행

📌 비기능 테스트

  • 시스템 운영에 심각한 위험을 초래할 수 있는 요소들을 테스트를 통하여 예방
    • 매우 중요한 것이지만 자동화하여 파이프라인에 포함하기는 쉽지 않음
  • 비기능 테스트의 종류
    • 성능 테스트
      • 부하 테스트
      • 스트레스 테스트
      • 확장성 테스트
    • 내구성 테스트
    • 보안 테스트
    • 유지보수 테스트
    • 복구 테스트

📌 데이터베이스 변경 관리

  • 상태가 없는 웹 응용과는 달리 데이터베이스는 여러 복잡성을 초래
    • 테스트 데이터 vs 프로덕션 데이터
    • 데이터베이스의 규모와 시스템 성능
    • 스키마 업데이트
  • 마이그레이션 스크립트 등을 활용하여 안정성과 복구 가능성을 추구

📌 릴리스 패턴 (Release Pattern)

  • 프로덕션을 새로운 소프트웨어 버전으로 업데이트 할 때의 위험도를 낮추기 위한 전략
    • 실제 서비스의 운영에서는 최종 릴리스에 수동 승인 절차를 갖추는 방식을 많이 채택
  • 릴리스 패턴의 종류
    • 롤링 업데이트 (rolling update)
    • 블루 - 그린 배포 (blue-green deployment)
    • 카나리아 릴리스 (canary release)

📌 모니터링과 진단

  • 모니터링 (Monitoring)
    • 시스템 구성 인프라 내의 자원 상태와 활용도 등을 지속적으로 검사
  • 진단 (Diagnosis)
    • 잠재적 위험 요소를 조기 발견하고 대응책을 수립
  • 알림 (Notification)
    • 빌드의 성공/실패, 자원 활용의 변화 등에 대하여 (주로 데브옵스팀에) 자동 알림을 설정

0개의 댓글