
무작위 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를 선택하는 것이 가장 좋습니다. 잘못된 시간대를 선택하면 특정 요일의 의미가 서버와 몇 시간 차이가 납니다.