适用于 Kubernetes 的 Chaos Toolkit 扩展
项目描述
Kubernetes 的 Chaos Toolkit 扩展
该项目包含活动,例如探测和操作,您可以通过 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 的方法。
请浏览文档以查看现有的探测和操作。
配置
使用 ~/.kube/config
如果您的~/.kube/config
文件中有您要定位的集群的有效条目,则无需执行任何操作。
您可以指定KUBECONFIG
指定不同的位置。
$ export KUBECONFIG=/tmp/my-config
指定 Kubernetes 上下文
很多时候,您的 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 的服务帐号
从 pod(例如,不是本地机器或 CI)运行时,该
./.kube/config
文件不存在。相反,可以在/var/run/secrets/kubernetes.io/serviceaccount/token中找到凭据。
要让扩展知道这一点,只需CHAOSTOOLKIT_IN_POD
从 pod 规范的环境变量中设置:
env:
- name: CHAOSTOOLKIT_IN_POD
value: "true"
通过实验中的所有凭据
最后,您可以将所有必需的凭据信息显式传递给实验,如下所示:
使用 API 密钥
{
"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"
}
}
}
}
使用 TLS 密钥/证书
{
"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 身份验证已委托给它。
谷歌云平台
除了您的 Kubernetes 凭据(通过~/.kube/config
文件)之外,您还需要针对 Google Cloud Platform 本身进行身份验证。通常这是通过以下方式完成的:
$ gcloud auth login
但也可以通过定义GOOGLE_APPLICATION_CREDENTIALS
环境变量来实现。
贡献
如果你想为这个包贡献更多的功能,我们非常欢迎你这样做。请分叉这个项目,编写单元测试来涵盖提议的更改,实施更改,确保它们符合、 和规定的格式标准black
,
然后向存储库提出 PR 以供审查。flake8
isort
有关格式化标准的更多信息,请参阅格式化部分。
Chaos Toolkit 项目要求所有贡献者必须在他们希望合并到存储库的主分支中的每个提交上签署 开发者原产地证书。请确保您在提交 PR 之前能够遵守 DCO 的规则。
开发
如果您希望在此项目上进行开发,请确保安装开发依赖项。但首先,创建一个虚拟环境,然后安装这些依赖项。
$ make install-dev
现在,您可以编辑文件,您的环境将自动看到它们,即使在chaos
本地从命令运行时也是如此。
测试
要为项目运行测试,请执行以下操作:
$ make tests
格式化和整理
我们使用 、 和 的组合black
来flake8
检查isort
和格式化此存储库代码。
在提出拉取请求之前,我们建议您对代码运行格式化:
$ make format
这将自动格式化任何不符合格式化标准的代码。
由于某些内容没有被格式化处理,我们还建议您运行:
$ make lint
确保任何未使用的过长的导入语句/字符串等也被拾取。