[LitmusChaos] M1에서 LitmusChaos 실행하고 카오스 주입하기
1. 카오스 엔지니어링과 LitmusChaos 간단 설명
카오스 엔지니어링은 간단히 말해 시스템의 복원력을 테스트하기 위해 의도적으로 장애를 일으켜보며 취약점을 찾고 보강하는 방식의 엔지니어링 기법이다.
LitmusChaos는 쿠버네티스 플랫폼 위에서 카오스 엔지니어링을 진행할 수 있도록 도와주는 오픈소스 프로젝트이다.
2. 준비물
- Minikube: 쿠버네티스를 로컬 환경에서 사용할 수 있게 만든 가벼운 구현체
- Helm: 쿠버네티스 패키지 매니저 (like Mac의 brew, Node의 npm ...)
- 카오스를 주입할 데모 서비스
Minikube와 Helm 설치 과정은 생략하고, 데모 서비스의 경우 아래 명령어로 실행할 수 있다.
# Clone Repo
git clone https://github.com/GoogleCloudPlatform/microservices-demo
# Move Directory
cd microservices-demo/
# Install using mainfest file
kubectl apply -f ./release/kubernetes-manifests.yaml
# Access the demo
minikube service frontend-external --url
마지막 명령어를 실행하여 나온 URL로 데모 서비스에 접속할 수 있다.
3. LitmusChaos 설치
🔥 지금부터 나오는 설치 과정은 M1을 기준으로 작성되었습니다
🔥 포스트 작성일(2024.07.23)을 기준으로 최신 버전(3.9.1)의 auth-server에 임시적인 로그인 이슈가 있어 3.8.0 버전으로 실습을 진행하였습니다.
먼저 LitmusChaos Helm repo를 추가한다.
# Helm repo 추가
helm repo add litmuschaos https://litmuschaos.github.io/litmus-helm/
# Helm repo 확인
helm repo list
다음으로 쿠버네티스 네임스페이스를 생성한다.
# 네임스페이스 생성
kubectl create ns litmus
# 네임스페이스 확인
kubectl get ns
ARM 기반 MongoDB를 사용하는 ChaosCenter를 설치한다.
helm install chaos litmuschaos/litmus --namespace=litmus \
--set portal.frontend.service.type=NodePort \
--set mongodb.image.registry=ghcr.io/zcube \
--set mongodb.image.repository=bitnami-compat/mongodb \
--set mongodb.image.tag=6.0.5 \
--set litmuschaos.image.tag=3.8.0
아래 사진처럼 모든 파드가 정상적으로 실행되는지 확인한다.
4. Chaos Center 접속 및 Environment 생성
아래 명령어를 입력하여 나온 URL로 Chaos Center(LitmusChaos 관리 페이지)에 접속할 수 있다.
minikube service chaos-litmus-frontend-service -n litmus --url
최초 로그인 아이디와 비밀번호는 admin / litmus이고, 로그인 후 비밀번호를 바꿔야 한다.
처음 로그인하면 아래와 같은 팝업 창이 나오는데 버튼을 눌러 Environment를 만들어주자.
New Environment 버튼을 눌러주고
적당한 이름을 작성해주고 타입은 pre-production을 선택하여 Environment를 만든다.
Environment Type은 스테이징 관련인 것 같은데 지금은 간단한 실습을 해보는 것이므로 어떤 것을 선택하든 상관 없을 것 같다.
생성된 Environment 안에 들어가 Chaos Infrastructure를 만들어주자.
Configuration은 기본 설정으로 해주었고, 마지막 창에 나오는 설정 파일을 다운로드 받는다.
🔥 그러나 위에 있는 설정 파일을 그대로 배포하면 subscriber 파드가 배포에 실패하는 문제가 발생한다. 🔥
아래 명령어로 확인한 ClusterIP와 TargetPort(PORT의 왼쪽 번호)로 설정 파일의 서버 주소를 변경해주고 apply를 진행한다.
9091:32102에서 왼쪽에 적힌 값은 targetPort, 오른쪽에 적힌 값은 nodePort라고 한다.
- targetPort: 클러스터 내 다른 파드가 서비스에 접근할 때 사용
- nodePort: 클러스터 외부에서 노출되어 직접 접근할 때 사용
위 과정까지 성공적으로 수행하면 Pending 상태였던 Chaos Infrastructure가 Connected 상태로 변한다.
5. Probe 설정
카오스 엔지니어링에서는 JVM에 장애를 발생 시키기, DB나 Kafka에 발생 시키기, istio 없애기, 쿠버네티스 파드 없애기 등 다양한 장애 상황을 테스트해볼 수 있다.
이번 포스트에서는 cartservice의 파드를 제거하는 상황에 대해 테스트를 해보자.
먼저 Resilience Probes 탭에 들어가 Probe를 생성해주자.
Probe는 카오스 실험을 진행했을 때 나오는 이상적인 결과를 정의한 것이다.
ex) nginx에 HTTP 요청을 보냈을 때 200 요청이 오면 정상이다.
우리는 '파드를 제거하더라도 파드가 존재한다'를 Probe로 정의할 것이다.
아래 명령어는 파드가 존재하는지 확인하는 명령어인데, 해당 명령어의 결과가 0보다 큰지 확인하는 것이 Probe가 된다.
Probe 생성 버튼을 눌러 Command Probe를 선택한다.
설정 값은 아래와 같이 해주고 Optional 값은 생략하였다.
'kubectl get pods -n default | grep cartservice | grep Running | wc -l' 명령어의 결과가 0보다 크다는 의미이다.
6. 카오스 주입
Chaos Experiments 탭에서 New Experiment 버튼을 눌러 Chaos Experiment를 생성해주자.
4번 과정에서 생성한 Chaos Infrastructure를 선택한다.
Blank Canvas를 선택한다.
Add 버튼을 누르고, pod-delete를 선택한다.
Target Application 탭에서 설정을 아래 사진처럼 설정한다.
만약 cartservice에 라벨이 없다면 아래 명령어로 라벨을 추가해주자.
kubectl label deployment cartservice app=cartservice
다음으로 Probes 탭에 들어가 아까 만든 Probe를 EOT 모드로 추가해준 뒤 Apply Changes를 누르면 모든 설정이 끝난다 🎉
Run 버튼을 누르고 잠시 기다리면 ... 카오스 테스트가 성공하는 것을 볼 수 있다
Install-chaos-faults와 cleanup-chaos-resources 단계가 갑자기 추가되었는데, 카오스 실험에 필요한 리소스들을 설치하고 실험이 종료된 뒤 다시 삭제하는 단계인 것 같다.
Reference
- https://docs.litmuschaos.io/docs/introduction/what-is-litmus
- https://docs.litmuschaos.io/docs/architecture/architecture-summary
- https://www.cncf.io/blog/2024/04/01/elevating-system-resilience-leveraging-litmuschaos-and-backstage-integration/
- https://github.com/suyeon-jung-dev/suyeon-jung-dev/blob/main/learning-records/devops/litmus/installing_chaos.md
- https://youtu.be/I2kki5pAqQ4?si=8M1MnM-SPZlljJ-H
- https://youtu.be/wnEYugH7kW0?si=_SqJT9s3KUCWsv9n