该项目包含活动(如探针和操作),你可以从实验中 通过 Chaos Toolkit 调用,以针对 Kubernetes API 实施 混沌工程:杀死 Pod、删除 StatefulSet 或节点……
要用于你的实验,此包必须安装在 chaostoolkit 所在的 Python 环境中。
$ pip install chaostoolkit-kubernetes
要使用此包中的探针和操作,请将以下内容添加到 你的实验文件中:
{
"title": "Do we remain available in face of pod going down?",
"description": "We expect Kubernetes to handle the situation gracefully when a pod goes down",
"tags": ["kubernetes"],
"steady-state-hypothesis": {
"title": "Verifying service remains healthy",
"probes": [
{
"name": "all-our-microservices-should-be-healthy",
"type": "probe",
"tolerance": true,
"provider": {
"type": "python",
"module": "chaosk8s.probes",
"func": "microservice_available_and_healthy",
"arguments": {
"name": "myapp"
}
}
}
]
},
"method": [
{
"type": "action",
"name": "terminate-db-pod",
"provider": {
"type": "python",
"module": "chaosk8s.pod.actions",
"func": "terminate_pods",
"arguments": {
"label_selector": "app=my-app",
"name_pattern": "my-app-[0-9]$",
"rand": true
}
},
"pauses": {
"after": 5
}
}
]
}
就这样!注意该操作如何让你随机杀死一个 Pod。
请浏览文档以查看现有的探针和操作。
请注意,对于网络、CPU 和内存压力测试,我们依赖出色的 Chaos Mesh 项目,它为注入 这些故障提供了良好的接口。
你需要先在集群中安装 Chaos Mesh 才能使用它们。
如果你在 ~/.kube/config 文件中已有要访问集群的有效条目,
那么无需进行任何操作。
你可以通过设置 KUBECONFIG 来指定其他位置。
$ export KUBECONFIG=/tmp/my-config
通常情况下,你的 Kubernetes 配置包含多个条目,你需要 定义要作为默认上下文使用的那一个, 当它未被显式提供时。
你当然可以使用
kubectl config use-context KUBERNETES_CONTEXT 更改默认值,但也可以在实验
中显式指定,如下所示:
{
"title": "Do we remain available in face of pod going down?",
"description": "We expect Kubernetes to handle the situation gracefully when a pod goes down",
"tags": ["kubernetes"],
"secrets": {
"k8s": {
"KUBERNETES_CONTEXT": "..."
}
},
"steady-state-hypothesis": {
"title": "Verifying service remains healthy",
"probes": [
{
"name": "all-our-microservices-should-be-healthy",
"type": "probe",
"tolerance": true,
"secrets": ["k8s"],
"provider": {
"type": "python",
"module": "chaosk8s.probes",
"func": "microservice_available_and_healthy",
"arguments": {
"name": "myapp"
}
}
}
]
},
"method": [
{
"type": "action",
"name": "terminate-db-pod",
"secrets": ["k8s"],
"provider": {
"type": "python",
"module": "chaosk8s.pod.actions",
"func": "terminate_pods",
"arguments": {
"label_selector": "app=my-app",
"name_pattern": "my-app-[0-9]$",
"rand": true
}
},
"pauses": {
"after": 5
}
}
]
}
你需要将 KUBERNETES_CONTEXT 密钥键指定为
希望实验使用的上下文名称。同时确保告知操作和探针
它们应被传递的密钥条目:
"secrets": ["k8s"]。
当从 Pod 中运行时(例如,不是本地机器或 CI),
./.kube/config 文件不存在。相反,凭据可以在
/var/run/secrets/kubernetes.io/serviceaccount/token 找到。
要让扩展知道这一点,只需在 Pod 规格的
环境变量中设置 CHAOSTOOLKIT_IN_POD:
env:
- name: CHAOSTOOLKIT_IN_POD
value: "true"
使用此环境变量时,假定实验针对的是
运行实验所在的同一集群。如果你的实验
针对不同的集群,则不应设置此变量。
相反,你可以挂载一个包含目标集群 Kubernetes 配置的卷,
并将 KUBECONFIG 指向该配置。
最后,你可以显式地将所有必需的凭据信息传递给实验,如下所示:
{
"secrets": {
"kubernetes": {
"KUBERNETES_HOST": "http://somehost",
"KUBERNETES_API_KEY": {
"type": "env",
"key": "SOME_ENV_VAR"
}
}
}
}
{
"secrets": {
"kubernetes": {
"KUBERNETES_HOST": "http://somehost",
"KUBERNETES_USERNAME": {
"type": "env",
"key": "SOME_ENV_VAR"
},
"KUBERNETES_PASSWORD": {
"type": "env",
"key": "SOME_ENV_VAR"
}
}
}
}
{
"secrets": {
"kubernetes": {
"KUBERNETES_HOST": "http://somehost",
"KUBERNETES_CERT_FILE": {
"type": "env",
"key": "SOME_ENV_VAR"
},
"KUBERNETES_KEY_FILE": {
"type": "env",
"key": "SOME_ENV_VAR"
}
}
}
}
在某些托管 Kubernetes 集群上,你还需要向平台本身进行身份验证, 因为 Kubernetes 的身份验证已委托给该平台。
除了你的 Kubernetes 凭据(通过 ~/.kube/config 文件),你
还需要向 Google Cloud Platform 本身进行身份验证。通常
这是通过完成的:
$ gcloud auth login
但也可以通过定义 GOOGLE_APPLICATION_CREDENTIALS 环境变量来实现。
如果你希望为此包贡献更多功能,我们非常 欢迎。请 fork 此项目,编写单元测试覆盖提议的更改, 实现更改,确保它们符合格式标准,然后向仓库 提交 PR 以供审阅。
有关格式标准的更多信息,请参阅格式一节。
Chaos Toolkit 项目要求所有贡献者必须在每个要合并到 仓库 master 分支的提交上签署 开发者原创证书。请在提交 PR 之前确保你能遵守 DCO 的规则。
如果你想在此项目上进行开发,请确保安装开发 依赖。但首先,安装 PDM,然后安装 依赖。
$ pdm install
现在,你可以编辑文件,你的环境将自动感知这些更改,即使在本地通过 chaos 命令运行时也是如此。
要运行项目测试,请执行以下命令:
$ pdm run tests
我们使用 ruff 来对此仓库的代码进行代码检查和格式化。
在提交 Pull Request 之前,我们建议你使用以下命令对代码进行格式化:
$ pdm run format
这将自动格式化任何不符合格式标准的代码。
由于某些问题不会被格式化工具捕获,我们还建议你运行:
$ pdm run lint
以确保任何未使用的导入语句/过长的字符串等问题也能被捕获。