从 Python 中删除现有 pods 的简单方法
Simple way to delete existing pods from Python
我在命名空间 foo
的 Kubernetes 集群上用 pytest 运行 编写了端到端测试。现在我想在测试中添加简单的混沌工程来检查我的服务的弹性。为此,我只需要在foo
内删除特定的pods——因为K8s重启了相应的服务,这模拟了服务暂时不可达。
使用 Python 删除当前命名空间中特定 pod 的简单方法是什么?
到目前为止我尝试过的:
因为我在https://github.com/kubernetes-client/python/tree/master/examples中没有找到合适的例子,但是使用pods的看起来很复杂,
我查了一下kubetest
,看起来很简洁大方。
我想使用 kube
fixture 然后做这样的事情:
pods = kube.get_pods()
for pod in pods:
if can_be_temporarily_unreachable(pod):
kube.delete(pod)
我认为使用参数 --in-cluster
调用 pytest 会告诉 kubetest
使用当前的集群设置而不是创建新的 K8s 资源。
但是,kubetest
想为每个使用 kube
夹具的测试用例创建一个新的名称空间,我不希望这样。
有没有办法告诉 kubetest
不要创建新的命名空间,而是在当前命名空间中执行所有操作?
虽然 kubetest
看起来非常简单和优雅,但我也很乐意使用其他解决方案。
一个简单的解决方案,需要很少的时间和维护,并且不会使(阅读)测试复杂化。
您可以使用 delete_namespaced_pod
(from CoreV1Api) 删除命名空间中的特定 pods。
这是一个例子:
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)
Tibebes 对现有答案的延续。 M
How do I find out the namespace that the code itself is running in?
有两种方法可以做到这一点:
- 使用向下 API 将 pod 命名空间传递给 pod 环境变量:
- 使用模板引擎/helm 将环境变量命名空间额外传递给 pod。例子:
env:
- name: CURRENT_NAMESPACE
value: "{{ .Values.namespace }}"
我在命名空间 foo
的 Kubernetes 集群上用 pytest 运行 编写了端到端测试。现在我想在测试中添加简单的混沌工程来检查我的服务的弹性。为此,我只需要在foo
内删除特定的pods——因为K8s重启了相应的服务,这模拟了服务暂时不可达。
使用 Python 删除当前命名空间中特定 pod 的简单方法是什么?
到目前为止我尝试过的:
因为我在https://github.com/kubernetes-client/python/tree/master/examples中没有找到合适的例子,但是使用pods的看起来很复杂,
我查了一下kubetest
,看起来很简洁大方。
我想使用 kube
fixture 然后做这样的事情:
pods = kube.get_pods()
for pod in pods:
if can_be_temporarily_unreachable(pod):
kube.delete(pod)
我认为使用参数 --in-cluster
调用 pytest 会告诉 kubetest
使用当前的集群设置而不是创建新的 K8s 资源。
但是,kubetest
想为每个使用 kube
夹具的测试用例创建一个新的名称空间,我不希望这样。
有没有办法告诉 kubetest
不要创建新的命名空间,而是在当前命名空间中执行所有操作?
虽然 kubetest
看起来非常简单和优雅,但我也很乐意使用其他解决方案。
一个简单的解决方案,需要很少的时间和维护,并且不会使(阅读)测试复杂化。
您可以使用 delete_namespaced_pod
(from CoreV1Api) 删除命名空间中的特定 pods。
这是一个例子:
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)
Tibebes 对现有答案的延续。 M
How do I find out the namespace that the code itself is running in?
有两种方法可以做到这一点:
- 使用向下 API 将 pod 命名空间传递给 pod 环境变量:
- 使用模板引擎/helm 将环境变量命名空间额外传递给 pod。例子:
env: - name: CURRENT_NAMESPACE value: "{{ .Values.namespace }}"