🧪카오스 엔지니어링이란?

카오스 엔지니어링이란, 개발 중인 시스템의 안정성을 테스트하기 위해 임의적으로 장애 상황을 조성하는 기법을 말합니다.

그래서 혼란이란 뜻의 카오스(Chaos)가 이름에 붙은 것인데요.

카오스 엔지니어링을 통해 시스템상에서의 취약점은 없는지 알 수 있기 때문에 시스템을 더욱 안정적으로 만들 수 있죠.

☁️클라우드 네이티브 환경에서 카오스 엔지니어링이 필요한 이유

클라우드 네이티브 환경은 다양한 컴포넌트가 유기적으로 연결되어 있어 그 자체로 복잡하기 때문에, 테스트하기 쉽지 않은데요.

서비스의 부하 등을 측정하는 일반적인 테스트 툴로는 이런 분산 시스템 환경에서 효율적으로 테스트하기 어려우므로, 카오스 엔지니어링이라는 다른 접근법이 필요한 것입니다.

카오스 엔지니어링은 시스템에 임의적인 장애 상황을 일으킨 다음, 시스템이 어떻게 반응하는지 확인하여 잠재적인 이슈를 잡아내고 사고를 미연에 방지할 수 있습니다.

그렇다면 실제 카오스 엔지니어링은 어떻게 수행할 수 있을까요?

CNCF 재단의 Incubating 프로젝트로 등록된 Chaos Mesh를 소개하며 알아보도록 하겠습니다.

⛓️Kubernetes 카오스 엔지니어링에 특화된 Chaos Mesh

Chaos Mesh는 클라우드 네이티브 환경을 위한 오픈소스 카오스 엔지니어링 플랫폼입니다.

다양한 종류의 장애 상황 시뮬레이션이 준비되어있기 때문에, 구성할 수 있는 장애 시나리오의 폭도 매우 넓다는 장점이 있습니다.

Chaos Mesh는 동작에 필요한 각 컴포넌트(contoller-manager, daemon, dashboard)가 Kubernetes 클러스터상에 CRD(Custom Resource Definition)로 배포되는 방식으로 설치하는데요.

그래서 Helm을 사용하거나 Chaos Mesh가 자체로 작성한 쉘 스크립트를 실행해서 설치할 수 있습니다. 자세한 설치 정보는 공식 페이지에서 확인하실 수 있습니다.

Chaos Mesh 설치가 완료되면 Experiment라고 하는 테스트 객체를 생성해야 합니다. Chaos Mesh에는 기본적으로 다양한 장애 상황을 발생시킬 수 있는 리소스가 준비되어 있고, 이런 리소스를 Experiment로 사용하는데요.

Chaos Mesh에서 기본적으로 생성 가능한 대표적인 장애 발생 리소스는 아래와 같습니다.

  • PodChaos: Pod 상태를 의도적으로 불안정하게 만들거나 Pod 내 특정 Container가 동작에 실패하는 상황 조성
  • NetworkChaos: 네트워크 지연, 패킷 손실 등의 상황 조성
  • StressChaos: CPU 또는 메모리에 대한 부하 조성

Experiment는 k8s 리소스처럼 yaml 파일로 정의 후 kubectl로 실행할 수 있는데요.

아래는 NetworkChaos로 만든 Experiment의 예시입니다. 이 Experiment를 실행하면 default 네임스페이스 내 "app": "test" 라벨을 가진 Pod에 대해 12초 동안 10ms의 네트워크 지연을 유발시키는 테스트가 진행됩니다.

apiVersion: chaos-mesh.org/v1alpha1  
kind: NetworkChaos  
metadata:  
	name: network-delay  
spec:  
	action: delay
	mode: one
		namespaces:  
			- default  
		labelSelectors:  
			'app': 'test' 
	delay:  
		latency: '10ms'  
		duration: '12s'

또한 여러 개의 Experiment는 하나의 Workflow로 구성해서 관리할 수 있습니다. 즉 Workflow를 구성함으로써 전체적인 카오스 엔지니어링 프로세스를 정의하고 수행할 수 있는 거죠.

그리고 Chaos Mesh의 기본 컴포넌트 중에는 Dashboard도 존재하는데요. Chaos Experiment를 직관적으로 관리하고 모니터링할 수 있어 테스트 시나리오를 관리하는 측면에서 유용할 것으로 보입니다.

References