[소프트웨어] 카오스 엔지니어링과 리트머스 카오스

카오스 엔지니어링

카오스 엔지니어링(chaos engineering)이란 시스템에 의도적으로 장애나 오류, 예상치 못한 이벤트를 주입하여 시스템이 어떻게 동작하는지 확인함으로써 시스템의 안정성, 회복성, 탄력성을 강화하는 실험적인 접근 방법이다. 이를 통해 장애 상황에서 시스템이 어떻게 반응하고 복구하는지 관찰하여 취약점을 사전에 발견하고 이에 대한 개선점을 확인할 수 있다. 실제 운영 환경에서 발생할 수 있는 장애를 사전에 파악하고 가설 수립 및 실험 과정을 통해 장애 상황을 미리 대비하여 시스템의 안정성을 높일 수 있다.


리트머스 카오스

리트머스 카오스(LitmusChaos)는 클라우드 네이티브 환경에서 카오스 엔지니어링을 수행하는 것을 도와주는 도구이다. 통제된 방식으로 카오스 테스트를 유도하여 시스템의 약점과 잠재적 중단을 확인할 수 있다. 리트머스 카오스는 오픈소스이며 CNCF 프로젝트 중 하나이다.

리트머스 카오스는 카오스(또는 결함)를 생성하고 관리 및 모니터링하기 위해 클라우드 네이티브 접근 방식을 사용한다. 플랫폼 자체는 마이크로서비스 집합으로 실행되며 쿠버네티스의 커스텀 리소스(custom resource, CR)를 사용하여 시스템의 정상 상태 가설(steady state hypothesis)과 카오스 의도(intent)를 정의하고 오퍼레이터 패턴(operator pattern)을 사용하여 실험을 실행한다.

리트머스 카오스 플랫폼은 다음으로 구성된다.

  • 카오스 컨트롤 플레인 (Chaos Control Plane): 카오스 컨트롤 플레인은 CLI와는 별도로 리트머스 카오스와 상호작용하기 위해 사용할 수 있는 웹사이트 기반 포털인 카오스 센터(ChaosCenter)의 기능을 담당하는 마이크로서비스로 구성되어 있다. 카오스 컨트롤 플레인은 카오스 실험의 생성 및 스케줄링, 카오스 발생 시 시스템 관찰 가능성, 장애 결과의 사후 처리 및 분석을 용이하게 한다.
  • 카오스 실행 플레인 (Chaos Execution Plane): 대상 리소스에 결함을 주입하는데 필요한 구성 요소를 포함한다. 정의된 대상 쿠버네티스 환경 내에서 카오스 실험을 실행 및 모니터링하는 여러 오퍼레이터와 카오스 에이전트로 구성된다.
  • 카오스 센터 (ChaosCenter): 리트머스가 제공하는 모든 기능을 제어할 수 있는 단일 소스이다. 카오스 센터를 사용하여 리트머스 카오스의 모든 부분을 자유롭게 관리하고 원하는 방식으로 카오스 실험을 구성할 수 있다. 카오스 센터는 리트머스 카오스 설치의 일부로 사전 패키징되어 제공되며, 인그레스(Ingress), 노드 포트(NodePort) 또는 로드 밸런서(LoadBalancer)를 통해 쉽게 접근할 수 있다. 리트머스 카오스는 크로스 클라우드(cross cloud)를 지원하므로 환경의 배포 위치에 관계 없이 카오스 센터에 접근할 수 있다. 카오스 센터의 주요 기능은 카오스 실험 생성 및 관리, 사용자 및 팀 관리이다.
  • 카오스 인프라 (Chaos Infrastructures): 카오스 실험 대상 환경에서 실행되는 모든 서비스 및 서비스 실행 환경이다. 카오스 인프라는 카오스 컨트롤 플레인이 카오스 실험 대상 환경에 접근하고 결함을 주입하는데 도움을 준다. 카오스 인프라는 카오스 환경에서 생성할 수 있다. 카오스 센터에는 항상 하나 이상의 카오스 인프라가 연결되어 있어야 한다. 카오스 인프라는 셀프(self) 카오스 인프라와 외부(external) 카오스 인프라 두 가지 유형으로 분류할 수 있다. 셀프 카오스 인프라는 리트머스 카오스 설치의 일부로써 카오스 센터에 기본 카오스 인프라로 등록된다. 설치 시 리트머스 카오스가 설치된 동일한 클러스터는 설치 관리자에 의해 셀프 카오스 인프라로 선택된다. 카오스 센터에서 셀프 카오스 인프라에 결함을 유도하고 결과를 관찰할 수 있다. 카오스 센터는 크로스 클라우드를 지원하므로 커맨드 라인 유틸리티인 litmusctl을 사용하여 여러 외부 카오스 인프라를 동일한 카오스 센터에 연결할 수 있다. 이를 통해 하나의 카오스 센터에서 여러 카오스 인프라로 결함을 관리 및 유도하고 시스템을 모니터링 및 관찰할 수 있다.


기타 도메인 용어는 다음과 같다.

  • 카오스 실험 (Chaos Experiment) (또는 카오스 결함(Chaos Fault)): 리트머스 카오스 아키텍처의 기본 단위이다. 카오스 실험은 쿠버네티스 클러스터에 원하는 카오스 효과를 주입하기 위해 서로 결합된 여러 작업의 집합을 말한다. 사용자는 사전 정의된 바로 사용 가능한 카오스 실험 중에서 선택하거나 새로운 카오스 실험을 생성하여 필요한 카오스 시나리오(Chaos Scenario)를 구성할 수 있다. 작업은 여러 단계로 구성될 수 있으며 이러한 단계에는 결함 설치 단계, ChaosEngine CR을 사용하여 결함 주입 대상 선택 및 결함 실행, 카오스 되돌리기 단계 등이 있다. 카오스 센터를 통해 다양한 유형의 결함이 있는 카오스 실험을 만들 수 있다. 카오스 실험에서는 결함이 서로 병렬로 실행되도록 설정할 수 있으며, 사용자는 프로덕션 단계에서 발생할 수 있는 원하는 결함을 시뮬레이션하기 위해 단계를 추가하여 카오스 실험을 조정할 수 있다. 크론 카오스 실험(Cron Chaos Experiment)을 사용하여 크론 표현식을 통해 카오스 실험 실행을 스케줄링할 수도 있다. 카오스 실험 실행이 완료되면 대상 애플리케이션의 복원력(resiliency)이 계산된다. 카오스 실험에서는 서로 다른 결함에 서로 다른 가중치를 할당할 수 있으며 이러한 가중치와 프로브 성공율을 나타내는 지표인 ProbeSuccessPercentage는 복원력 점수 계산에 사용된다.
  • 크론 카오스 실험 (Cron Chaos Experiment): 미리 정의된 일정에 따라 실행되는 일종의 카오스 실험이다.
  • 카오스 시나리오 (Chaos Scenario): 여러 카오스 실험들의 조합이다. 사용자는 카오스 시나리오를 통해 예상 결과 정의, 결과 관찰, 전반적인 시스템 동작 분석을 할 수 있으며 최종적으로는 복원력 향상을 위한 시스템 조정 의사결정을 수행한다.
  • 복원력 점수 (Resilience Score): 주어진 카오스 실험에 대한 시스템의 복원력의 전반적인 측정값이다. 복원력 점수는 대상 시스템에서 실험을 구성하는 카오스를 실행할 때 얻을 수 있다. 카오스 실험을 생성하는 동안 카오스 실험에 존재하는 모든 결함에 특정 가중치를 할당한다. 이 가중치는 결함의 우선순위 및 중요도를 나타낸다. 가중치가 높을수록 결함이 더 심각하다는 의미이다.
  • 복원력 프로브 (Resilience Probe): 카오스 엔진 내에서 모든 카오스 실험에 대해 정의할 수 있는 플러그 가능한 검사(pluggable check)이다. 플러그 앤 플레이(plug-and-play) 아키텍처를 지원하므로 사용자는 프로브를 한 번 생성하면 다양한 실험에 반복적으로 활용할 수 있다. 프로브의 정상 상태 검증(steady state validation)에 대한 포괄적인 지원을 통해 시스템 복원력을 향상시킬 수 있다. 복원력 프로브는 사용자가 시스템의 견고성(robustness)을 보다 효과적으로 평가할 수 있도록 도와준다. 검사를 수행하는 결함 파드(fault pod)는 정의된 모드(프로브의 종류)와, 검사 성공 여부를 고려하는 요소(결함의 판정(verdict)을 결정하는데 필수적인 조건)를 기반으로 이러한 검사를 실행한다. 프로브는 시스템에 주입되어 동작을 감시하고 다양한 데이터를 수집함으로써 시스템의 상태(리소스 현황, 응답시간, 에러 발생 등)를 파악하고 잠재적인 문제를 식별한다. 리트머스 카오스가 지원하는 프로브의 타입에는 httpProbe, cmdProbe, k8sProbe, promProbe가 있으며 프로프를 단독으로 또는 여러 조합으로 사용하여 원하는 검사를 수행할 수 있다.


리트머스 플랫폼의 핵심은 카오스 커스텀 리소스이다. 오퍼레이터 패턴을 위해 리트머스 카오스가 제공하는 커스텀 리소스는 다음과 같다.

  • 카오스 실험 (ChaosExperiment): 특정 결함(fault)의 구성 파라미터를 그룹화하는 커스텀 리소스이다. 카오스 실험에 기본적으로 결함을 실행하는 라이브러리를 정의하며, 결함을 실행하는데 필요한 권한, 동작 시 사용되는 기본값을 정의한다. 리트머스 카오스는 카오스 실험을 통해 결함 주입(fault injection)을 수행하기 위해 타사 툴을 통합하는데 도움을 주는 BYOC(bring-your-own-chaos)를 지원한다.
  • 카오스 엔진 (ChaosEngine): 쿠버네티스 애플리케이션의 워크로드, 서비스, 노드, 인프라 구성 요소를 카오스 실험에 정의된 결함에 연결하기 위한 커스텀 리소스이다. 카오스 엔진은 실행 프로퍼티들을 조정하고 프로브를 사용하여 시스템의 정상 상태 유효성 검사 제약 조건(validation constraint)을 지정하는 옵션도 제공한다. 카오스 엔진은 카오스 오퍼레이터(Chaos Operator)에 의해 감시되며, 오퍼레이터는 러너(runner)를 통해 엔진을 조정(실험 실행을 트리거)한다. 하나 이상의 실험을 원하는 순서대로 결합할 수 있는 워크플로 객체 내에 ChaosExperimentChaosEngine CR이 포함되어 있다.
  • 카오스 결과 (ChaosResult): 실험 실행 결과를 보관하는 리소스이다. 카오스 결과는 유효성 검사 제약 조건의 성공 여부, 결함의 되돌리기/롤백 상태 및 결함 판정 대한 세부 정보를 제공한다. 카오스 익스포터는 결과를 읽고 정보를 프로메테우스 메트릭으로 노출한다. 카오스 결과는 자동화된 실행 중에 특히 유용하다.


카오스 실험

카오스 실험 실행은 카오스 엔진 커스텀 리소스를 생성할 때 트리거된다. 일반적으로 카오스 엔진은 리트머스 카오스 워크플로의 스텝(step)에 포함되어 있다. 카오스 엔진을 직접 생성할 수도 있으며 이 경우 카오스 운영자는 커스텀 리소스를 조정하고 실험 실행을 트리거한다. 쿠버네티스 환경에서 수행하는 카오스 실험은 클러스터에서 실행 중인 리소스에 적용된다. 쿠버네티스 카오스 실험의 종류는 다음과 같다.

  • 일반 (generic): 일반적인 쿠버네티스 리소스를 대상으로 적용되는 카오스 실험이다. 일반 실험에는 파드를 대상으로 하는 파드 카오스(pod chaos)와 컨테이너를 실행하는 노드(node)를 대상으로 하는 노드 카오스(node chaos)가 있다.
  • 애플리케이션 카오스 (application chaos): 특정 애플리케이션을 대상으로 적용되는 카오스 실험이다. 쿠버네티스 리소스에 카오스를 유도하는 일반 카오스 실험을 통해서는 유도된 카오스를 통해 특정 애플리케이션의 약점을 발견하고 실험 결과를 분석하여 결론을 내리기 어렵다. 애플리케이션 카오스 실험은 카오스 주입 후 사전 조건과 예상되는 결과를 기반으로 검사를 수행한다. 예상 결과와 실제 결과를 비교하여 카오스 실험의 결과를 결정한다. 애플리케이션 카오스는 파드 내 존재하는 여러 프로세스를 대상으로 카오스를 주입하므로 파드 카오스 보다 보다 구체적인 카오스이다.
  • 부하 카오스 (load chaos): 시스템에 부하를 주입하는 카오스 실험이다. 부하 카오스에는 시스템의 가용성을 테스트하기 위한 다양한 카오스 실험이 포함되어 있다. 부하 카오스 실험을 통해 VM, 파드 등과 같은 서비스에 부하를 주입할 수 있다.


이 외에 쿠버네티스 클라우드 서비스를 제공하는 플랫폼(예: AWS, GCP, Azure 등) 별로 자체 쿠버네티스 플랫폼 리소스(예: EC2 인스턴스, GCP 디스크 등)에 카오스를 유도하는 실험도 존재한다.

Comments