Skip to main content

适用于 Kubernetes 的 Chaos Toolkit 扩展

项目描述

Kubernetes 的 Chaos Toolkit 扩展

构建状态 Python 版本 下载

该项目包含活动,例如探测和操作,您可以通过 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 以供审查。flake8isort

有关格式化标准的更多信息,请参阅格式化部分。

Chaos Toolkit 项目要求所有贡献者必须在他们希望合并到存储库的主分支中的每个提交上签署 开发者原产地证书。请确保您在提交 PR 之前能够遵守 DCO 的规则。

开发

如果您希望在此项目上进行开发,请确保安装开发依赖项。但首先,创建一个虚拟环境,然后安装这些依赖项。

$ make install-dev

现在,您可以编辑文件,您的环境将自动看到它们,即使在chaos本地从命令运行时也是如此。

测试

要为项目运行测试,请执行以下操作:

$ make tests

格式化和整理

我们使用 、 和 的组合blackflake8检查isort和格式化此存储库代码。

在提出拉取请求之前,我们建议您对代码运行格式化:

$ make format

这将自动格式化任何不符合格式化标准的代码。

由于某些内容没有被格式化处理,我们还建议您运行:

$ make lint

确保任何未使用的过长的导入语句/字符串等也被拾取。

项目详情