
무작위 Kubernetes 파드를 주기적으로 종료하여 임의의 파드 장애 상황에서 시스템이 어떻게 동작하는지 테스트하며, 네임스페이스, 라벨, 어노테이션 및 스케줄 필터를 지원하여 통제된 카오스 실험을 수행할 수 있습니다.
chaoskube는 Kubernetes 클러스터에서 무작위 파드를 주기적으로 종료합니다.

무작위 파드 장애 발생 시 시스템이 어떻게 동작하는지 테스트하세요.
실행하면 기본적으로 10분마다 모든 네임스페이스의 파드 하나를 종료합니다.
$ chaoskube
INFO[0000] starting up dryRun=true interval=10m0s version=v0.21.0
INFO[0000] connecting to cluster master="https://kube.you.me" serverVersion=v1.10.5+coreos.0
INFO[0000] setting pod filter annotations= labels= minimumAge=0s namespaces=
INFO[0000] setting quiet times daysOfYear="[]" timesOfDay="[]" weekdays="[]"
INFO[0000] setting timezone location=UTC name=UTC offset=0
INFO[0001] terminating pod name=kube-dns-v20-6ikos namespace=kube-system
INFO[0601] terminating pod name=nginx-701339712-u4fr3 namespace=chaoskube
INFO[1201] terminating pod name=kube-proxy-gke-earthcoin-pool-3-5ee87f80-n72s namespace=kube-system
INFO[1802] terminating pod name=nginx-701339712-bfh2y namespace=chaoskube
INFO[2402] terminating pod name=heapster-v1.2.0-1107848163-bhtcw namespace=kube-system
INFO[3003] terminating pod name=l7-default-backend-v1.0-o2hc9 namespace=kube-system
INFO[3603] terminating pod name=heapster-v1.2.0-1107848163-jlfcd namespace=kube-system
INFO[4203] terminating pod name=nginx-701339712-bfh2y namespace=chaoskube
INFO[4804] terminating pod name=nginx-701339712-51nt8 namespace=chaoskube
...
chaoskube는 네임스페이스, 라벨, 어노테이션, 수명별로 대상 파드를 필터링하고, 특정 요일, 시간대, 연중 날짜를 카오스에서 제외할 수 있습니다.
chaoskube는 Helm으로 설치할 수 있습니다. Helm의 빠른 시작 가이드를 따라 chaoskube 차트를 설치하세요.
$ helm repo add chaoskube https://linki.github.io/chaoskube/
$ helm install chaoskube chaoskube/chaoskube --atomic --namespace=chaoskube --create-namespace
구성 방법과 다른 유용한 Helm 차트를 찾으려면 kubeapps.com의 chaoskube를 참조하세요.
예시 매니페스트를 참조하세요. 제공된 ClusterRole을 사용하여 chaoskube에 적절한 권한을 부여해야 합니다.
기본적으로 chaoskube는 안전하게 아무것도 종료하지 않습니다. 대상 클러스터를 검증했다면 --no-dry-run 플래그를 전달하여 dry-run 모드를 비활성화할 수 있습니다. 배포에 맞게 더 공격적인 간격이나 다른 지원 플래그를 지정할 수도 있습니다.
Kubernetes 클러스터 내에서 실행 중이고 동일한 클러스터를 대상으로 하려면 이것만 하면 됩니다.
다른 클러스터를 대상으로 하거나 로컬에서 실행하려면 --master 플래그로 클러스터를 지정하거나 --kubeconfig 플래그로 유효한 kubeconfig를 제공하세요. 기본적으로 홈 디렉터리의 표준 kubeconfig 경로를 사용합니다. 즉, 해당 kubeconfig의 현재 컨텍스트가 대상이 됩니다.
카오스의 정도를 높이거나 낮추려면 --interval 플래그로 종료 간격을 변경하세요. 또는 chaoskube 배포의 replica 수를 늘릴 수도 있습니다.
chaoskube는 기본적으로 시스템 파드와 자기 자신을 포함해 모든 네임스페이스의 모든 파드를 종료한다는 점을 기억하세요.
chaoskube는 실행 상태를 확인할 수 있는 간단한 HTTP 엔드포인트를 제공합니다. 이는 Kubernetes liveness 및 readiness 프로브에 사용할 수 있습니다. 기본적으로 포트 8080에서 수신 대기합니다. 비활성화하려면 chaoskube에 --metrics-address=""를 전달하세요.
하지만 라벨, 어노테이션, 네임스페이스 선택자, 파드 이름 포함/제외 패턴, 최소 수명 설정을 제공하여 chaoskube의 검색 범위를 제한할 수 있습니다.
$ chaoskube --labels 'app=mate,chaos,stage!=production'
...
INFO[0000] setting pod filter labels="app=mate,chaos,stage!=production"
이렇게 하면 app 라벨이 mate로 설정되고, chaos 라벨이 어떤 값이든 설정되어 있으며, stage 라벨이 production으로 설정되지 않거나 설정되지 않은 모든 파드가 선택됩니다.
네임스페이스 선택자로 대상 파드를 필터링할 수도 있습니다.
$ chaoskube --namespaces 'default,testing,staging'
...
INFO[0000] setting pod filter namespaces="default,staging,testing"
이것은 default, staging, testing 세 네임스페이스의 파드를 필터링합니다.
네임스페이스는 네임스페이스 라벨 선택자로 추가 필터링할 수 있습니다.
$ chaoskube --namespace-labels='!integration'
...
INFO[0000] setting pod filter namespaceLabels="!integration"
이것은 integration 라벨이 있는 네임스페이스의 모든 파드를 제외합니다.
OwnerReference의 kind 선택자로 대상 파드를 필터링할 수 있습니다.
$ chaoskube --kinds '!DaemonSet,!StatefulSet'
...
INFO[0000] setting pod filter kinds="!DaemonSet,!StatefulSet"
이것은 모든 DaemonSet 및 StatefulSet 파드를 제외합니다.
$ chaoskube --kinds 'DaemonSet'
...
INFO[0000] setting pod filter kinds="DaemonSet"
이것은 DaemonSet 파드만 포함합니다.
참고: include 필터는 OwnerReference가 정의되지 않은 모든 파드를 자동으로 제외합니다.
이름으로 파드를 필터링할 수 있습니다:
$ chaoskube --included-pod-names 'foo|bar' --excluded-pod-names 'prod'
...
INFO[0000] setting pod filter excludedPodNames=prod includedPodNames="foo|bar"
이렇게 하면 이름에 'foo' 또는 'bar'가 포함되고 'prod'는 포함하지 않는 파드만 대상이 됩니다.
네임스페이스를 제외할 수도 있으며 라벨 및 어노테이션 선택자와 혼합해 사용할 수 있습니다.
$ chaoskube \
--labels 'app=mate,chaos,stage!=production' \
--annotations '!scheduler.alpha.kubernetes.io/critical-pod' \
--namespaces '!kube-system,!production'
...
INFO[0000] setting pod filter annotations="!scheduler.alpha.kubernetes.io/critical-pod" labels="app=mate,chaos,stage!=production" namespaces="!kube-system,!production"
이것은 위 라벨 선택자의 검색 범위를 더욱 제한하여 kube-system 및 production 네임스페이스의 모든 파드를 제외하고 critical로 표시된 모든 파드를 무시합니다.
어노테이션 선택자는 chaoskube를 클러스터 애드온으로 실행하고 원하는 대로 파드가 종료되도록 opt-in할 수 있게 하는 데 사용할 수도 있습니다. 예를 들어 다음과 같이 chaoskube를 실행할 수 있습니다:
$ chaoskube --annotations 'chaos.alpha.kubernetes.io/enabled=true' --debug
...
INFO[0000] setting pod filter annotations="chaos.alpha.kubernetes.io/enabled=true"
DEBU[0000] found candidates count=0
DEBU[0000] no victim found
이미 해당 어노테이션을 어딘가에서 사용하고 있지 않다면 처음에는 모든 파드를 무시합니다(디버그 모드에서 후보 수를 확인할 수 있습니다). 그런 다음 개별 디플로이먼트의 파드에 chaos.alpha.kubernetes.io/enabled=true 어노테이션을 지정하여 선택적으로 카오스 모드에 opt-in시킬 수 있습니다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 3
template:
metadata:
annotations:
chaos.alpha.kubernetes.io/enabled: "true"
spec:
...
--minimum-age 플래그를 사용하면 최근에 시작된 파드를 제외할 수 있습니다.
$ chaoskube --minimum-age 6h
...
INFO[0000] setting pod filter minimumAge=6h0m0s
카오스가 발생하는 시간을 요일, 하루 중 특정 시간대, 연중 날짜 또는 모두 함께 조합하여 제한할 수 있습니다.
--excluded-weekdays 옵션에는 쉼표로 구분된 요일 약어 목록을, --excluded-times-of-day 옵션에는 쉼표로 구분된 시간대 목록을, --excluded-days-of-year 옵션에는 쉼표로 구분된 연중 날짜 목록을 추가하고, 이를 해석할 --timezone을 지정하세요.
$ chaoskube \
--excluded-weekdays=Sat,Sun \
--excluded-times-of-day=22:00-08:00,11:00-13:00 \
--excluded-days-of-year=Apr1,Dec24 \
--timezone=Europe/Berlin
...
INFO[0000] setting quiet times daysOfYear="[Apr 1 Dec24]" timesOfDay="[22:00-08:00 11:00-13:00]" weekdays="[Saturday Sunday]"
INFO[0000] setting timezone location=Europe/Berlin name=CET offset=1
UTC, Local을 사용하거나 (IANA) tz 데이터베이스에서 시간대 이름을 선택하세요. 로컬 머신에서 chaoskube를 테스트한다면 Local이 가장 적합합니다. chaoskube를 클러스터에 배포한 후에는 특정 시간대(예: 대부분의 팀원이 거주하는 지역)로 배포해야 팀과 chaoskube가 예를 들어 특정 요일의 시작과 끝을 공통으로 인식할 수 있습니다. 팀이 여러 시간대에 분산되어 있다면 기본값인 UTC를 선택하는 것이 가장 좋습니다. 잘못된 시간대를 선택하면 특정 요일의 의미가 서버와 몇 시간 차이가 납니다.
Kubernetes 클러스터에 카오스를 발생시킬 수 있는 몇 가지 다른 프로젝트가 있습니다.
chaoskube에 없는 기능입니다. 또한 애플리케이션을 구성하는 파드 그룹을 인식하여 특별히 처리할 수 있습니다. 예를 들어 애플리케이션의 모든 파드를 한 번에 종료할 수 있습니다. kube-mokey는 구성 옵션을 통해 대상을 전역적으로 필터링하고 파드가 어노테이션을 통해 카오스에 opt-in할 수 있게 해줍니다. 개별 앱이 자신만의 고유한 방식으로 opt-in할 수 있습니다. 예를 들어 app-a는 평일마다 파드 하나를 종료하도록 요청할 수 있고, 더 용감한 app-b는 파드의 50%를 종료하도록 요청할 수 있습니다. Netflix의 ChaosMonkey가 사용하는 것과 유사한 구성 파일을 이해합니다.kubectl을 사용하는 매우 간단한 무작위 파드 킬러로, 몇 줄의 bash로 작성되었습니다. 네임스페이스와 간격이 주어지면 각 간격마다 해당 네임스페이스의 무작위 파드를 종료합니다. 초기 와 매우 유사합니다.이 프로젝트는 여러 훌륭한 기여자들의 아이디어와 도움 덕분에 지금의 위치에 있을 수 있었습니다.
이슈를 만들거나 풀 리퀘스트를 제출해 주세요.
| 옵션 | 환경 변수 | 설명 | 기본값 |
|---|
--interval | CHAOSKUBE_INTERVAL | 파드 종료 간격 | 10m |
--labels | CHAOSKUBE_LABELS | 파드를 필터링할 라벨 선택자 | (모든 것과 일치) |
--annotations | CHAOSKUBE_ANNOTATIONS | 파드를 필터링할 어노테이션 선택자 | (모든 것과 일치) |
--kinds | CHAOSKUBE_KINDS | 파드를 필터링할 Owner의 kind 선택자 | (모든 kind) |
--namespaces | CHAOSKUBE_NAMESPACES | 파드를 필터링할 네임스페이스 선택자 | (모든 네임스페이스) |
--namespace-labels | CHAOSKUBE_NAMESPACE_LABELS | 네임스페이스와 해당 파드를 필터링할 라벨 선택자 | (모든 네임스페이스) |
--included-pod-names | CHAOSKUBE_INCLUDED_POD_NAMES | 포함할 파드 이름의 정규식 패턴 | (모두 포함) |
--excluded-pod-names | CHAOSKUBE_EXCLUDED_POD_NAMES | 제외할 파드 이름의 정규식 패턴 | (제외 없음) |
--excluded-weekdays | CHAOSKUBE_EXCLUDED_WEEKDAYS | 카오스를 중단할 요일, 예: "Sat,Sun" | (제외된 요일 없음) |
--excluded-times-of-day | CHAOSKUBE_EXCLUDED_TIMES_OF_DAY | 카오스를 중단할 시간대, 예: "22:00-08:00" | (제외된 시간대 없음) |
--excluded-days-of-year | CHAOSKUBE_EXCLUDED_DAYS_OF_YEAR | 카오스를 중단할 연중 날짜, 예: "Apr1,Dec24" | (제외된 날짜 없음) |
--timezone | CHAOSKUBE_TIMEZONE | tz 데이터베이스의 시간대, 예: "America/New_York", "UTC" 또는 "Local" | (UTC) |
--max-runtime | CHAOSKUBE_MAX_RUNTIME | chaoskube가 종료되기 전 최대 실행 시간 | -1s (무기한) |
--max-kill | CHAOSKUBE_MAX_KILL | 간격당 종료할 최대 파드 수를 지정합니다. | 1 |
--minimum-age | CHAOSKUBE_MINIMUM_AGE | 파드를 필터링할 최소 수명 | 0s (모든 파드와 일치) |
--dry-run | CHAOSKUBE_DRY_RUN | 파드를 종료하지 않고 수행되었을 작업만 로그로 남깁니다 | true |
--log-format | CHAOSKUBE_LOG_FORMAT | 로그 메시지 형식을 지정합니다. 옵션은 text와 json입니다. | text |
--log-caller | CHAOSKUBE_LOG_CALLER | 로그 메시지에 호출 함수 이름과 위치를 포함합니다 | false |
--slack-webhook | CHAOSKUBE_SLACK_WEBHOOK | 알림용 Slack 웹훅 주소 | disabled |
--client-namespace-scope | CHAOSKUBE_CLIENT_NAMESPACE_SCOPE | Kubernetes API 호출을 지정된 네임스페이스로 범위를 한정합니다 | (모든 네임스페이스) |
chaoskube