Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
chaoskube — 定期终止随机的 Kubernetes Pod,以测试系统在任意 Pod 故障下的表现,支持命名空间、标签、注解和调度过滤,用于受控的混沌实验。 | Kitploit
工具/GitHubGitHub/linki/chaoskube
混沌工程
GitHublinki/chaoskube

chaoskube

定期终止随机的 Kubernetes Pod,以测试系统在任意 Pod 故障下的表现,支持命名空间、标签、注解和调度过滤,用于受控的混沌实验。

查看仓库
1.9k12622天前Kitploit 审核通过

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

chaoskube

GitHub release go-doc

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

chaoskube

为什么

测试您的系统在任意 Pod 故障下的表现。

示例

默认情况下,运行它每 10 分钟会在任何命名空间中杀死一个 Pod。

root@kitploit:~
$ 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

您可以使用 Helm 安装 chaoskube。遵循 Helm 快速入门指南,然后安装 chaoskube chart。

root@kitploit:~
$ 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

请参阅 示例 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 的搜索空间。

root@kitploit:~
$ 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。

root@kitploit:~
$ chaoskube --namespaces 'default,testing,staging'
...
INFO[0000] setting pod filter       namespaces="default,staging,testing"

这将过滤 default、staging 和 testing 三个命名空间中的 Pod。

命名空间还可以通过命名空间标签选择器进行过滤。

root@kitploit:~
$ chaoskube --namespace-labels='!integration'
...
INFO[0000] setting pod filter       namespaceLabels="!integration"

这将排除所有来自带有标签 integration 的命名空间的 Pod。

您可以通过 OwnerReference 的 kind 选择器过滤目标 Pod。

root@kitploit:~
$ chaoskube --kinds '!DaemonSet,!StatefulSet'
...
INFO[0000] setting pod filter       kinds="!DaemonSet,!StatefulSet"

这将排除任何 DaemonSet 和 StatefulSet Pod。

root@kitploit:~
$ chaoskube --kinds 'DaemonSet'
...
INFO[0000] setting pod filter       kinds="DaemonSet"

这将只包含任何 DaemonSet Pod。

请注意:任何 include 过滤器都会自动排除所有未定义 OwnerReference 的 Pod。

您可以通过名称过滤 Pod:

root@kitploit:~
$ chaoskube --included-pod-names 'foo|bar' --excluded-pod-names 'prod'
...
INFO[0000] setting pod filter       excludedPodNames=prod includedPodNames="foo|bar"

这将导致只有名称包含 'foo' 或 'bar' 且 不 包含 'prod' 的 Pod 成为目标。

您还可以排除命名空间,并与标签和注解选择器混合搭配。

root@kitploit:~
$ 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:

root@kitploit:~
$ 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 选择进入混乱模式。

root@kitploit:~
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。

root@kitploit:~
$ chaoskube --minimum-age 6h
...
INFO[0000] setting pod filter       minimumAge=6h0m0s

限制混沌

您可以通过星期几、一天中的时间段、一年中的日期或它们全部一起来限制引入混乱的时间。

通过 --excluded-weekdays 选项添加逗号分隔的星期几缩写列表,通过 --excluded-times-of-day 选项添加逗号分隔的时间段列表,和/或通过 --excluded-days-of-year 选项添加逗号分隔的一年中的日期列表,并指定解释它们的 --timezone。

root@kitploit:~
$ 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 集群中制造一些混乱。

  • kube-monkey 是一个为 Kubernetes 设计的基于 Pod 的精密混沌猴子。每天早晨它会编制一份当天应发生的 Pod 终止计划。它允许按每个 Pod 指定平均故障间隔时间,这是 chaoskube 不具备的功能。它还可以感知形成应用程序的 Pod 组,以便对它们进行特殊处理,例如一次杀死一个应用程序的所有 Pod。kube-monkey 允许通过配置选项全局过滤目标,并允许 Pod 通过注解选择进入混沌,它允许各个应用以自己独特的方式选择加入,例如,app-a 可以请求在每个工作日杀死一个 Pod,而更勇敢的 app-b 可以请求杀死 50% 的 Pod。它理解类似于 Netflix 的 ChaosMonkey 使用的配置文件。
  • PowerfulSeal 确实是一个能让您的 Kubernetes 环境陷入困境的强大工具。除了杀死 Pod 之外,它还可以摧毁您的云虚拟机或杀死您的 Docker 守护进程。它有大量的配置选项来定义可以杀死什么以及何时杀死。它还有一个交互模式,允许您轻松杀死 Pod。
  • fabric8 的混沌猴子:作为应用与 fabric8 的 Kubernetes 平台捆绑在一起的混沌猴子。它可以通过 UI 部署,并将所采取的任何操作报告为聊天消息和/或桌面通知。它可以配置间隔和可能目标必须匹配的 Pod 名称模式。
  • k8aos:一个交互式工具,可以在整个 Kubernetes 集群中或限定在某个命名空间内发出一系列随机 Pod 删除。
  • pod-reaper 根据间隔和可配置的混沌几率杀死 Pod。它允许通过标签选择器和命名空间指定可能的目标 Pod。它能够在一段时间后成功自行关闭,因此可能适合与 Kubernetes Job 对象很好地配合。它还可以配置为杀死所有运行时间超过可配置时长的 Pod。
  • kubernetes-pod-chaos-monkey:一个使用 kubectl 编写的非常简单随机 Pod 杀手,代码只有几行 bash。给定一个命名空间和一个间隔,它会在每个间隔杀死该命名空间中的一个随机 Pod。就像 chaoskube 最初的工作方式。
  • 是 Kubernetes 的游戏化混沌工程工具。它就像太空侵略者,但外星人是 Pod 或工作节点。

致谢

这个项目离不开几位出色贡献者的想法和帮助:

  • 感谢 @twildeboer 和 @klautcomputing,他们提出了在某些时间(例如工作时间或节假日)限制混乱的想法,并首次在 #54 和 #55 中实现了此功能。
  • 感谢 @klautcomputing 首次尝试解决缺失的百分比功能,并提供了 RBAC 配置文件。
  • 感谢 @j0sh3rs 将 Helm chart 更新到最新版本。
  • 感谢 @klautcomputing、@grosser、@twz123、@hchenxa 和 @bavarianbidi 在 #31、#40 和 #58 中对 Dockerfile 和文档的改进。
  • 感谢 @bakins 在 #86 中添加了最小年龄过滤器。
  • 感谢 @bakins 在 #94 和 #97 中添加了健康检查和 Prometheus 指标。

贡献

欢迎随时创建 issue 或提交 pull request。

下载工具
选项环境变量描述默认值
--intervalCHAOSKUBE_INTERVALPod 终止之间的间隔10m
--labelsCHAOSKUBE_LABELS用于过滤 Pod 的标签选择器(匹配所有)
--annotationsCHAOSKUBE_ANNOTATIONS用于过滤 Pod 的注解选择器(匹配所有)
--kindsCHAOSKUBE_KINDS用于过滤 Pod 的所有者 kind 选择器(所有类型)
--namespacesCHAOSKUBE_NAMESPACES用于过滤 Pod 的命名空间选择器(所有命名空间)
--namespace-labelsCHAOSKUBE_NAMESPACE_LABELS用于过滤命名空间及其 Pod 的标签选择器(所有命名空间)
--included-pod-namesCHAOSKUBE_INCLUDED_POD_NAMES要包含的 Pod 名称的正则表达式模式(全部包含)
--excluded-pod-namesCHAOSKUBE_EXCLUDED_POD_NAMES要排除的 Pod 名称的正则表达式模式(无排除)
--excluded-weekdaysCHAOSKUBE_EXCLUDED_WEEKDAYS暂停混乱的星期几,例如 "Sat,Sun"(不排除任何工作日)
--excluded-times-of-dayCHAOSKUBE_EXCLUDED_TIMES_OF_DAY暂停混乱的一天中的时间段,例如 "22:00-08:00"(不排除任何时间段)
--excluded-days-of-yearCHAOSKUBE_EXCLUDED_DAYS_OF_YEAR暂停混乱的一年中的日期,例如 "Apr1,Dec24"(不排除任何日期)
--timezoneCHAOSKUBE_TIMEZONEtz 数据库中的时区,例如 "America/New_York"、"UTC" 或 "Local"(UTC)
--max-runtimeCHAOSKUBE_MAX_RUNTIMEchaoskube 退出前的最大运行时间-1s(无限时间)
--max-killCHAOSKUBE_MAX_KILL指定每个间隔要终止的最大 Pod 数量1
--minimum-ageCHAOSKUBE_MINIMUM_AGE用于过滤 Pod 的最小年龄0s(匹配每个 Pod)
--dry-runCHAOSKUBE_DRY_RUN不杀死 Pod,只记录将要完成的操作true
--log-formatCHAOSKUBE_LOG_FORMAT指定日志消息的格式。选项为 text 和 jsontext
--log-callerCHAOSKUBE_LOG_CALLER在日志消息中包含调用函数名称和位置false
--slack-webhookCHAOSKUBE_SLACK_WEBHOOK用于通知的 slack webhook 地址已禁用
--client-namespace-scopeCHAOSKUBE_CLIENT_NAMESPACE_SCOPE将 Kubernetes API 调用范围限定到给定命名空间(所有命名空间)
kubeinvaders