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



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

您可以使用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: %sn" % e)

台伯对现有答案的延续。M

如何找到代码本身运行的命名空间

有两种方法:

  1. 使用Downward API将pod名称空间传递到pod环境变量:
    • https://kubernetes.io/docs/tasks/inject-data-application/environment-variable-expose-pod-information/#the-向下api
    • https://kubernetes.io/docs/tasks/inject-data-application/downward-api-volume-expose-pod-information/#capabilities-向下api的参见metadata.namespace
  2. 使用模板engine/hem将环境变量名称空间额外传递到pod。示例:
    env:
    - name: CURRENT_NAMESPACE
    value: "{{ .Values.namespace }}"
    

相关内容

  • 没有找到相关文章

最新更新