chaoskube 会定期在您的 Kubernetes 集群中杀死随机 Pod。

测试您的系统在任意 Pod 故障下的表现。
默认情况下,运行它每 10 分钟会在任何命名空间中杀死一个 Pod。
$ 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 允许按命名空间、标签、注解和年龄过滤目标 Pod,以及从混沌中排除特定的星期几、一天中的时间段和一年中的日期。
您可以使用 Helm 安装 chaoskube。遵循 Helm 快速入门指南,然后安装 chaoskube chart。
$ helm repo add chaoskube https://linki.github.io/chaoskube/
$ helm install chaoskube chaoskube/chaoskube --atomic --namespace=chaoskube --create-namespace
请参阅 kubeapps.com 上的 chaoskube 了解如何配置它以及查找其他有用的 Helm charts。
请参阅 示例 manifest。确保使用提供的 ClusterRole 为 chaoskube 授予适当的权限。
默认情况下,chaoskube 会很友好,不会杀死任何东西。当您验证了目标集群后,可以通过传入 --no-dry-run 标志来禁用 dry-run 模式。您也可以为您的部署指定更激进的间隔和其他支持的标志。
如果您在 Kubernetes 集群中运行并希望以同一集群为目标,那么这就是您需要做的全部。
如果您想以不同的集群为目标或想在本地运行它,请通过 --master 标志指定您的集群,或通过 --kubeconfig 标志提供有效的 kubeconfig。默认情况下,它使用您主目录中的标准 kubeconfig 路径。这意味着,其中的任何当前上下文都将成为目标。
如果您想增加或减少混乱程度,可以使用 --interval 标志更改杀死间隔。或者,您可以增加 chaoskube 部署的副本数量。
请记住,默认情况下 chaoskube 会杀死您所有命名空间中的任何 Pod,包括系统 Pod 和它自身。
chaoskube 提供一个简单的 HTTP 端点,可用于检查它是否正在运行。这可用于 Kubernetes 存活和就绪探针。默认情况下,它监听 8080 端口。要禁用它,请将 --metrics-address="" 传给 chaoskube。
但是,您可以通过提供标签、注解和命名空间选择器、Pod 名称包含/排除模式以及最小年龄设置来限制 chaoskube 的搜索空间。
$ chaoskube --labels 'app=mate,chaos,stage!=production'
...
INFO[0000] setting pod filter labels="app=mate,chaos,stage!=production"
这会选择所有具有标签 app 为 mate、标签 chaos 为任意值,且标签 stage 未设置为 production 或未设置的 Pod。
您也可以按命名空间选择器过滤目标 Pod。
$ chaoskube --namespaces 'default,testing,staging'
...
INFO[0000] setting pod filter namespaces="default,staging,testing"
这将过滤 default、staging 和 testing 三个命名空间中的 Pod。
命名空间还可以通过命名空间标签选择器进行过滤。
$ chaoskube --namespace-labels='!integration'
...
INFO[0000] setting pod filter namespaceLabels="!integration"
这将排除所有来自带有标签 integration 的命名空间的 Pod。
您可以通过 OwnerReference 的 kind 选择器过滤目标 Pod。
$ chaoskube --kinds '!DaemonSet,!StatefulSet'
...
INFO[0000] setting pod filter kinds="!DaemonSet,!StatefulSet"
这将排除任何 DaemonSet 和 StatefulSet Pod。
$ chaoskube --kinds 'DaemonSet'
...
INFO[0000] setting pod filter kinds="DaemonSet"
这将只包含任何 DaemonSet Pod。
请注意:任何 include 过滤器都会自动排除所有未定义 OwnerReference 的 Pod。
您可以通过名称过滤 Pod:
$ chaoskube --included-pod-names 'foo|bar' --excluded-pod-names 'prod'
...
INFO[0000] setting pod filter excludedPodNames=prod includedPodNames="foo|bar"
这将导致只有名称包含 'foo' 或 'bar' 且 不 包含 'prod' 的 Pod 成为目标。
您还可以排除命名空间,并与标签和注解选择器混合搭配。
$ 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 命名空间中的任何 Pod 以及忽略所有标记为关键的 Pod,进一步限制了上述标签选择器的搜索空间。
注解选择器也可用于将 chaoskube 作为集群插件运行,并允许 Pod 按照您的需要选择被终止。例如,您可以这样运行 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
除非您已经在某处使用该注解,否则这将最初忽略您的所有 Pod(您可以在调试模式下看到候选数量)。然后,您可以通过使用 chaos.alpha.kubernetes.io/enabled=true 注解其 Pod,有选择地让各个 Deployment 选择进入混乱模式。
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 3
template:
metadata:
annotations:
chaos.alpha.kubernetes.io/enabled: "true"
spec:
...
您可以使用 --minimum-age 标志排除最近启动的 Pod。
$ 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 不具备的功能。它还可以感知形成应用程序的 Pod 组,以便对它们进行特殊处理,例如一次杀死一个应用程序的所有 Pod。kube-monkey 允许通过配置选项全局过滤目标,并允许 Pod 通过注解选择进入混沌,它允许各个应用以自己独特的方式选择加入,例如,app-a 可以请求在每个工作日杀死一个 Pod,而更勇敢的 app-b 可以请求杀死 50% 的 Pod。它理解类似于 Netflix 的 ChaosMonkey 使用的配置文件。kubectl 编写的非常简单随机 Pod 杀手,代码只有几行 bash。给定一个命名空间和一个间隔,它会在每个间隔杀死该命名空间中的一个随机 Pod。就像 chaoskube 最初的工作方式。这个项目离不开几位出色贡献者的想法和帮助:
欢迎随时创建 issue 或提交 pull request。
| 选项 | 环境变量 | 描述 | 默认值 |
|---|
--interval | CHAOSKUBE_INTERVAL | Pod 终止之间的间隔 | 10m |
--labels | CHAOSKUBE_LABELS | 用于过滤 Pod 的标签选择器 | (匹配所有) |
--annotations | CHAOSKUBE_ANNOTATIONS | 用于过滤 Pod 的注解选择器 | (匹配所有) |
--kinds | CHAOSKUBE_KINDS | 用于过滤 Pod 的所有者 kind 选择器 | (所有类型) |
--namespaces | CHAOSKUBE_NAMESPACES | 用于过滤 Pod 的命名空间选择器 | (所有命名空间) |
--namespace-labels | CHAOSKUBE_NAMESPACE_LABELS | 用于过滤命名空间及其 Pod 的标签选择器 | (所有命名空间) |
--included-pod-names | CHAOSKUBE_INCLUDED_POD_NAMES | 要包含的 Pod 名称的正则表达式模式 | (全部包含) |
--excluded-pod-names | CHAOSKUBE_EXCLUDED_POD_NAMES | 要排除的 Pod 名称的正则表达式模式 | (无排除) |
--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 | 指定每个间隔要终止的最大 Pod 数量 | 1 |
--minimum-age | CHAOSKUBE_MINIMUM_AGE | 用于过滤 Pod 的最小年龄 | 0s(匹配每个 Pod) |
--dry-run | CHAOSKUBE_DRY_RUN | 不杀死 Pod,只记录将要完成的操作 | true |
--log-format | CHAOSKUBE_LOG_FORMAT | 指定日志消息的格式。选项为 text 和 json | text |
--log-caller | CHAOSKUBE_LOG_CALLER | 在日志消息中包含调用函数名称和位置 | false |
--slack-webhook | CHAOSKUBE_SLACK_WEBHOOK | 用于通知的 slack webhook 地址 | 已禁用 |
--client-namespace-scope | CHAOSKUBE_CLIENT_NAMESPACE_SCOPE | 将 Kubernetes API 调用范围限定到给定命名空间 | (所有命名空间) |