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

2024-09-30 18:23:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我有用pytest编写的端到端测试,在命名空间foo中的Kubernetes集群上运行。现在,我想将简单的混沌工程添加到测试中,以检查我的服务的恢复能力。为此,我只需要删除foo中的特定POD——因为K8s重新启动相应的服务,这模拟了暂时无法访问的服务

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


到目前为止,我所尝试的:

因为我在https://github.com/kubernetes-client/python/tree/master/examples中没有找到合适的示例,但是使用POD的示例看起来非常复杂, 我看了看kubetest,它看起来非常简单和优雅

我想使用kube装置,然后执行如下操作:

pods = kube.get_pods()
for pod in pods:
  if can_be_temporarily_unreachable(pod):
    kube.delete(pod)

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

尽管kubetest在其他方面看起来非常简单和优雅,但我也很乐意使用另一种解决方案。 一个简单的解决方案需要很少的时间和维护,并且不会使测试复杂化(阅读),这将是非常棒的


Tags: in名称示例foopytest空间集群解决方案
2条回答

提比斯现有答案的延续。M

How do I find out the namespace that the code itself is running in?

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

  1. 使用向下API将pod命名空间传递给pod环境变量:
  2. 使用模板引擎/helm向pod额外传递环境变量名称空间。例子:
             env:
             - name: CURRENT_NAMESPACE
               value: "{{ .Values.namespace }}"
    

您可以使用^{}(从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)

相关问题 更多 >