从 Python 中删除现有 Pod 的简单方法

Dav*_*Far 4 python pytest chaos kubernetes microservices

我有用 pytest 编写的端到端测试,在 Namespace 中的 Kubernetes 集群上运行foo。现在我想在测试中添加简单的混沌工程来检查我的服务的弹性。为此,我只需要删除其中的特定foopod——由于 K8s 重新启动了相应的服务,这模拟了该服务暂时无法访问。

使用 Python 删除当前命名空间中特定 pod 的简单方法是什么?


到目前为止我尝试过的:

由于我在https://github.com/kubernetes-client/python/tree/master/examples 中没有找到合适的例子,但是使用pods的看起来很复杂,所以我查看了kubetest,看起来非常简单和优雅。

我想使用kube夹具,然后做这样的事情:

pods = kube.get_pods()
for pod in pods:
  if can_be_temporarily_unreachable(pod):
    kube.delete(pod)
Run Code Online (Sandbox Code Playgroud)

我认为使用参数调用 pytest--in-cluster会告诉kubetest使用当前的集群设置而不是创建新的 K8s 资源。但是,kubetest想要为每个使用kube夹具的测试用例创建一个新的命名空间,这是我不想要的。有没有办法告诉kubetest不要创建新的命名空间,而是在当前命名空间中执行所有操作?

虽然kubetest看起来非常简单和优雅,但我也很高兴使用另一种解决方案。一个需要很少时间和维护并且不会使(阅读)测试复杂化的简单解决方案会很棒。

Tib*_*. M 5

您可以使用delete_namespaced_pod(来自CoreV1Api)删除命名空间中的特定 pod。

下面是一个例子:

from kubernetes import client, config
from kubernetes.client.rest import ApiException
config.load_incluster_config() # or config.load_kube_config()

configuration = client.Configuration()

with client.ApiClient(configuration) as api_client:
    api_instance = client.CoreV1Api(api_client)
    
    namespace = 'kube-system' # str | see @Max Lobur's answer on how to get this
    name = 'kindnet-mpkvf' # str | Pod name, e.g. via api_instance.list_namespaced_pod(namespace)
    
    try:
        api_response = api_instance.delete_namespaced_pod(name, namespace)
        print(api_response)
    except ApiException as e:
        print("Exception when calling CoreV1Api->delete_namespaced_pod: %s\n" % e)
Run Code Online (Sandbox Code Playgroud)


Max*_*bur 5

Tibebes 现有答案的延续。中号

如何找出代码本身运行的名称空间?

有两种方法可以做到这一点:

  1. 使用 Downward API 将 pod 命名空间传递给 pod 环境变量:
  2. 使用模板引擎/helm 将环境变量命名空间另外传递给 pod。例子:
             env:
             - name: CURRENT_NAMESPACE
               value: "{{ .Values.namespace }}"
    
    Run Code Online (Sandbox Code Playgroud)