Kubernetes 이야기

Chaos Mesh 를 사용한 카오스 엔지니어링 본문

Kubernetes/일반

Chaos Mesh 를 사용한 카오스 엔지니어링

kmaster 2022. 2. 21. 19:40
반응형

Chaos Mesh (https://chaos-mesh.org/)

Chaos Mesh는 현재 CNCF의 Incubating 프로젝트이다. Chaos Mesh는 Kubernetes 환경에서 다양한 유형의 오류 시뮬레이션을 제공하는 클라우드 네이티브 Chaos Engineering 플랫폼이다. Chaos Mesh를 사용하면 개발, 테스트, 프로덕션 환경에서 실제로 발생할 수 있는 다양한 이상 현상을 편리하게 시뮬레이션하고 시스템에서 잠재적인 문제를 찾을 수 있다.

 

Chaos Mesh 외에 Kubernetes Chaos engineering 오픈소스로는 kube-monkey (https://github.com/asobti/kube-monkey), chaoskube (https://github.com/linki/chaoskube), Litmus Chaos (https://github.com/litmuschaos/litmus) 등이 있다.

 

Chaos Mesh는 2개의 구성요소를 가지고 있다.

 

아키텍처

Chaos Mesh는 Kubernetes CRD(Custom Resource Definition)를 기반으로 한다. 다양한 Chaos 실험을 관리하기 위해 Chaos Mesh는 다양한 결함 유형을 기반으로 여러 CRD 유형을 정의하고 다양한 CRD 개체에 대해 별도의 컨트롤러를 구현한다. Chaos Mesh는 주로 세 가지 구성 요소를 포함한다.

  • Chaos Controller Manager: 카오스 Mesh의 핵심 구성 요소. Chaos 실험의 일정 및 관리를 담당한다. 이 구성 요소에는 워크플로 컨트롤러, 스케줄러 컨트롤러 및 다양한 오류 유형의 컨트롤러와 같은 여러 CRD 컨트롤러가 포함되어 있다.
  • Chaos Dashboard : Chaos Mesh의 시각화 도구. Chaos Dashboard는 RBAC 권한 관리 메커니즘도 제공한다.
  • Chaos Daemon : 주요 실행 구성 요소. Chaos Daemon은 DaemonSet 모드에서 실행되며 기본적으로 Privileged 권한이 있다. 이 구성 요소는 주로 대상 Pod Namespace를 해킹하여 특정 네트워크 장치, 파일 시스템, 커널을 방해한다.

출처 : https://chaos-mesh.org

 

주요 특성

Fault injection

 

Fault injection은 Chaos 실험의 핵심기능이다. Fault injection은 세 가지 포괄적이고 세분화된 오류 유형을 제공한다.

  • 기본 리소스 결함:
    • PodChaos : Pod 노드 다시 시작, Pod의 지속적인 비가용성 및 특정 Pod의 특정 컨테이너 오류와 같은 Pod 오류를 시뮬레이션
    • NetworkChaos : 네트워크 지연, 패킷 손실, 패킷 장애 및 네트워크 파티션과 같은 네트워크 오류를 시뮬레이션
    • DNSChaos : DNS 도메인 이름의 구문 분석 실패 및 잘못된 IP 주소 반환과 같은 DNS 실패를 시뮬레이션
    • HTTPChaos : HTTP 통신 지연과 같은 HTTP 통신 실패를 시뮬레이션
    • StressChaos : CPU 경쟁 또는 메모리 경쟁을 시뮬레이션
    • IOChaos : I/O 지연, 읽기 및 쓰기 실패와 같은 응용 프로그램 파일의 I/O 실패를 시뮬레이션
    • TimeChaos : 시간 점프 예외를 시뮬레이션
    • KernelChaos : 애플리케이션 메모리 할당 예외와 같은 커널 오류를 시뮬레이션
  • 플랫폼 결함:
    • AWSChaos : AWS 노드 재시작과 같은 AWS 플랫폼 장애를 시뮬레이션
    • GCPChaos : GCP 노드 다시 시작과 같은 GCP 플랫폼 오류를 시뮬레이션
  • 애플리케이션 오류:
    • JVMChaos : 함수 호출 지연과 같은 JVM 애플리케이션 장애를 시뮬레이션

Chaos workflows

Chaos 워크플로에는 Chaos 실험 세트와 애플리케이션 상태 확인이 포함되어 있으므로 플랫폼에서 Chaos 엔지니어링 프로젝트의 전체 프로세스를 완료할 수 있다.

 

Chaos workflow는 다음 기능을 제공한다.

  • 연속적인 카오스 실험 조정
  • 병렬 카오스 실험 조정
  • 실험 상태 및 결과 확인 지원
  • 카오스 실험 일시 중지 지원
  • YAML 파일을 사용하여 Chaos 워크플로 정의 및 관리 지원
  • 웹 UI를 사용하여 Chaos 워크플로 정의 및 관리 지원

상세한 기능은 https://chaos-mesh.org/docs/create-chaos-mesh-workflow/ 를 참고한다.

 

우선 Chaos Mesh를 설치과정을 보자.

 

설치

helm repo add chaos-mesh https://charts.chaos-mesh.org

 

kubectl create ns chaos-testing

 

다음으로는 Container 환경에 따라 설치 시 옵션을 다르게 해야 한다. ( https://chaos-mesh.org/docs/production-installation-using-helm/ )

 

필자는 Containerd를 사용중이어서 아래의 Helm install명령을 수행하였다.

helm install chaos-mesh chaos-mesh/chaos-mesh -n=chaos-testing --set chaosDaemon.runtime=containerd --set chaosDaemon.socketPath=/run/containerd/containerd.sock --version 2.1.3

 

설치가 잘 완료되었는지 확인해 보자

kubectl get po -n chaos-testing

 

kubectl get pods --namespace chaos-testing -l app.kubernetes.io/instance=chaos-mesh -w
NAME                                      READY   STATUS    RESTARTS   AGE
chaos-controller-manager-8fdd4d4c-kd46r   1/1     Running   0          5m16s
chaos-controller-manager-8fdd4d4c-lpx7h   1/1     Running   0          5m16s
chaos-controller-manager-8fdd4d4c-pjxl9   1/1     Running   0          5m16s
chaos-daemon-jnxlv                        1/1     Running   0          5m16s
chaos-daemon-jrzhr                        1/1     Running   0          5m16s
chaos-daemon-w2szg                        1/1     Running   0          5m16s
chaos-dashboard-7887bf5fcf-ztrxt          1/1     Running   0          5m16s

 

설치 후 dashboard에 한번 접속해 보자.

 

최초 접속 시 RBAC 설정을 하게 되어 있는데 admin token을 사용하는 것이 아니라 일반 service account를 사용하려면 "Click here to generate" 눌러 해당 내용을 따라서 RBAC권한을 생성하자.

 

필자는 admin token을 사용하도록 하겠다. token등록 후에는 아래 화면과 같이 dashboard가 보인다.

 

 

 

예제

이제 몇가지 샘플을 테스트 해보고 Dashboard를 통해 모니터링해보자.

 

먼저 아래와 같이 test라는 namespace의 Pod를 예제로 Chaos 테스트를 해보겠다.

# kubectl get po -n test --show-labels
NAME                             READY   STATUS    RESTARTS   AGE    LABELS
hello-v2-fc7bdc486-78lcg         1/1     Running   0          25h    app=hello-v2,pod-template-hash=fc7bdc486
hello-v2-fc7bdc486-b2rs8         1/1     Running   0          25h    app=hello-v2,pod-template-hash=fc7bdc486
hello-v2-fc7bdc486-lr8ql         1/1     Running   1          25h    app=hello-v2,pod-template-hash=fc7bdc486
locust-master-9db68fffc-vj4m7    1/1     Running   1          3d3h   app.kubernetes.io/instance=locust,app.kubernetes.io/name=locust,component=master,load_test=example,pod-template-hash=9db68fffc
locust-worker-64498dfbc8-wcnbn   1/1     Running   0          3d3h   app.kubernetes.io/instance=locust,app.kubernetes.io/name=locust,component=worker,load_test=example,pod-template-hash=64498dfbc8

 

example1) Pod 오류

 

apiVersion: chaos-mesh.org/v1alpha1
kind: PodChaos
metadata:
  name: pod-kill-example
  namespace: chaos-testing
spec:
  action: pod-kill
  mode: one
  duration: '30s'
  selector:
    namespaces:
      - test
    labelSelectors:
      'app': 'hello-v2'

 

이 예제는 test라는 namespace에 app=hello-v2 라는 label 이 붙은 pod중 한개 (mode: one)를 선택하여 30초 동안 사용할 수 있도록 하는 예제이다.

 

위와 같이 yaml 로 생성해도 되지만 Chaos Mesh Dashboard에서도 Form 으로 입력가능하다.

 

 

yaml 을 실행 한 후 dashboard를 보면 아래와 같이 모니터링을 할 수 있다.

 

 

해당 label의 Pod로 접속해 보면 오류가 발생한다.

# curl http://172.32.139.163:5000
curl: (7) Failed connect to 172.32.139.163:5000; Connection refused

 

Duration 시간 후에는 다시 정상적으로 복구된다.

# curl http://172.32.139.163:5000
Hello World! V2

 

example2) 스트레스 시나리오

 

apiVersion: chaos-mesh.org/v1alpha1
kind: StressChaos
metadata:
  name: memory-stress-example
  namespace: chaos-testing
spec:
  mode: one
  selector:
    namespaces:
      - test
    labelSelectors:
      'app': 'hello-v2'
  stressors:
    memory:
      workers: 4
      size: '256MB'

 

이 실험 구성은 선택한 컨테이너에 프로세스를 생성하고 최대 256MB의 메모리를 차지하는 메모리를 지속적으로 할당하고 읽고 쓴다. workers는 읽고 쓰기위한 thread의 수이다.

 

실행하기 전에 테스트 할 Pod의 리소스 상황을 보자

# kubectl top pod -n test hello-v2-fc7bdc486-78lcg
hello-v2-fc7bdc486-78lcg   1m           21Mi

 

이제 Chaos 실험을 시작해보자. 그리고 다시 Pod의 리소스 상황을 보자.

 

# kubectl top pod -n test hello-v2-fc7bdc486-78lcg
hello-v2-fc7bdc486-78lcg   3987m        299Mi

 

이 밖에 스케쥴링을 사용하면 특정시간에 원하는 실험을 할 수 있다.

 

 

위와 같이 1분마다 pod를 kill하는 스케쥴을 하면 아래와 같이 1분마다 pod가 새로 생성된다.

 

# kubectl get po -n test --show-labels
NAME                             READY   STATUS              RESTARTS   AGE    LABELS
hello-v2-fc7bdc486-nw8km         0/1     ContainerCreating   0          0s     app=hello-v2,pod-template-hash=fc7bdc486

 

이 외에 다양한 실험을 할 수 있기 때문에 테스트 시 조건에 맞게 사용한다면 다양한 테스트케이스를 application으로 별도 개발하지 않고도 편리하게 테스트 할 수 있으니 적용해 보면 좋을거 같다.

반응형
Comments