删除时重新创建 Kubernetes pod
Kubernetes pod gets recreated when deleted
我已经开始 pods 使用命令
$ kubectl run busybox \
--image=busybox \
--restart=Never \
--tty \
-i \
--generator=run-pod/v1
出了点问题,现在我不能删除这个Pod
。
我尝试使用下面描述的方法,但 Pod
不断被重新创建。
$ kubectl delete pods busybox-na3tm
pod "busybox-na3tm" deleted
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
busybox-vlzh3 0/1 ContainerCreating 0 14s
$ kubectl delete pod busybox-vlzh3 --grace-period=0
$ kubectl delete pods --all
pod "busybox-131cq" deleted
pod "busybox-136x9" deleted
pod "busybox-13f8a" deleted
pod "busybox-13svg" deleted
pod "busybox-1465m" deleted
pod "busybox-14uz1" deleted
pod "busybox-15raj" deleted
pod "busybox-160to" deleted
pod "busybox-16191" deleted
$ kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
default busybox-c9rnx 0/1 RunContainerError 0 23s
您需要删除部署,这会依次删除 pods 和副本集 https://github.com/kubernetes/kubernetes/issues/24137
列出所有部署:
kubectl get deployments --all-namespaces
然后删除部署:
kubectl delete -n NAMESPACE deployment DEPLOYMENT
其中 NAMESPACE 是它所在的命名空间,DEPLOYMENT 是部署的名称。如果 NAMESPACE 是 default
,则完全不使用 -n
选项。
在某些情况下,它也可能是 运行ning 由于作业或 daemonset。
检查以下内容和 运行 相应的删除命令。
kubectl get jobs
kubectl get daemonsets.app --all-namespaces
kubectl get daemonsets.extensions --all-namespaces
在某些情况下,即使删除部署,pods 仍不会消失。在这种情况下,要强制删除它们,您可以 运行 以下命令。
kubectl delete pods podname --grace-period=0 --force
如果即使在手动删除 pod 后 pod 仍在自动重新创建,那么那些 pods 已使用 Deployment 创建。
创建部署时,它会自动创建 ReplicaSet 和 Pods。根据您在部署脚本中提到的 pod 副本的数量,它最初会创建这些数量的 pods。
当您尝试手动删除任何 pod 时,它会自动再次创建这些 pod。
是的,有时您需要强行删除pods。但在这种情况下,force 命令不起作用。
如果您的 pod 名称类似于 name-xxx-yyy
,它可以由名为 name-xxx
的 replicasets.apps
控制,您应该在删除 pod 之前先删除那个 replicaset
:
kubectl delete replicasets.apps name-xxx
您可以尝试删除 replicaSet,而不是删除 NS
kubectl get rs --all-namespaces
然后删除副本集
kubectl delete rs your_app_name
还要注意 statefulset
kubectl get sts --all-namespaces
删除命名空间中的所有状态集
kubectl --namespace <yournamespace> delete sts --all
一一删除
kubectl --namespace ag1 delete sts mssql1
kubectl --namespace ag1 delete sts mssql2
kubectl --namespace ag1 delete sts mssql3
在完成 interactive tutorial 之后,我得到了一堆 pods、服务、部署:
me@pooh ~ > kubectl get pods,services
NAME READY STATUS RESTARTS AGE
pod/kubernetes-bootcamp-5c69669756-lzft5 1/1 Running 0 43s
pod/kubernetes-bootcamp-5c69669756-n947m 1/1 Running 0 43s
pod/kubernetes-bootcamp-5c69669756-s2jhl 1/1 Running 0 43s
pod/kubernetes-bootcamp-5c69669756-v8vd4 1/1 Running 0 43s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 37s
me@pooh ~ > kubectl get deployments --all-namespaces
NAMESPACE NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
default kubernetes-bootcamp 4 4 4 4 1h
docker compose 1 1 1 1 1d
docker compose-api 1 1 1 1 1d
kube-system kube-dns 1 1 1 1 1d
为了清理一切,delete --all
工作正常:
me@pooh ~ > kubectl delete pods,services,deployments --all
pod "kubernetes-bootcamp-5c69669756-lzft5" deleted
pod "kubernetes-bootcamp-5c69669756-n947m" deleted
pod "kubernetes-bootcamp-5c69669756-s2jhl" deleted
pod "kubernetes-bootcamp-5c69669756-v8vd4" deleted
service "kubernetes" deleted
deployment.extensions "kubernetes-bootcamp" deleted
这给我留下了(我认为是)一个空的 Kubernetes 集群:
me@pooh ~ > kubectl get pods,services,deployments
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 8m
如果您有一份工作继续 运行,您需要搜索该工作并将其删除:
kubectl get job --all-namespaces | grep <name>
和
kubectl delete job <job-name>
而不是试图弄清楚它是一个部署、deamonset、statefulset...还是什么(在我的例子中,它是一个不断跨越新的复制控制器 pods :)
为了确定是什么一直跨越图像,我使用以下命令获取了所有资源:
kubectl get all
当然你也可以获取所有命名空间的所有资源:
kubectl get all --all-namespaces
或定义您要检查的命名空间:
kubectl get all -n NAMESPACE_NAME
一旦我发现复制控制器是我的问题的根源,我就删除了它:
kubectl delete replicationcontroller/CONTROLLER_NAME
这将提供有关所有 pods、部署、服务和工作的信息
在命名空间中。
kubectl get pods,services,deployments,jobs
pods 可以由 deployments 或 jobs
创建
kubectl delete job [job_name]
kubectl delete deployment [deployment_name]
如果删除部署或作业,则可以停止 pods 的重新启动。
您可以kubectl get replicasets
根据年龄或时间检查旧部署
如果要删除应用程序的相同当前 运行 pod,请根据时间删除旧部署
kubectl delete replicasets <Name of replicaset>
我也遇到了这个问题,我用下面的命令删除部署。
kubectl delete deployments DEPLOYMENT_NAME
但 pods 仍在重新创建,所以我使用以下命令交叉检查副本集
kubectl get rs
然后将副本集编辑为 1 到 0
kubectl edit rs REPICASET_NAME
问题的根本原因是 deployment/job/replicasets 规范属性 strategy->type
,它定义了当 pod 被销毁时应该发生什么(隐式或显式)。就我而言,它是 Recreate
.
根据@nomad 的 ,删除 deployment/job/replicasets 是一种简单的修复方法,可以避免在作为新手用户弄乱集群之前尝试致命的组合。
在进入调试之前,尝试使用以下命令了解幕后操作:
kubectl get all -A -o name
kubectl get events -A | grep <pod-name>
在我的例子中,我通过像 kubectl apply -f deployment.yaml
这样的 YAML 文件部署,解决方案似乎是通过 kubectl delete -f deployment.yaml
删除
这里的很多答案都告诉你删除一个特定的k8s对象,但是你可以一次删除多个对象,而不是一个一个地删除:
kubectl delete deployments,jobs,services,pods --all -n <namespace>
就我而言,我是 运行 OpenShift 集群与 OLM - Operator Lifecycle Manager 。 OLM 是控制部署的人,所以当我删除部署时,不足以阻止 pods 重新启动。
只有当我删除 OLM 及其 订阅 时,部署、服务和 pods 才消失。
首先列出您命名空间中的所有 k8s 对象:
$ kubectl get all -n openshift-submariner
NAME READY STATUS RESTARTS AGE
pod/submariner-operator-847f545595-jwv27 1/1 Running 0 8d
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/submariner-operator-metrics ClusterIP 101.34.190.249 <none> 8383/TCP 8d
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/submariner-operator 1/1 1 1 8d
NAME DESIRED CURRENT READY AGE
replicaset.apps/submariner-operator-847f545595 1 1 1 8d
OLM没有和get all
一起列出,所以我特地搜索了一下:
$ kubectl get olm -n openshift-submariner
NAME AGE
operatorgroup.operators.coreos.com/openshift-submariner 8d
NAME DISPLAY VERSION
clusterserviceversion.operators.coreos.com/submariner-operator Submariner 0.0.1
现在删除所有对象,包括 OLM、订阅、部署、副本集等:
$ kubectl delete olm,svc,rs,rc,subs,deploy,jobs,pods --all -n openshift-submariner
operatorgroup.operators.coreos.com "openshift-submariner" deleted
clusterserviceversion.operators.coreos.com "submariner-operator" deleted
deployment.extensions "submariner-operator" deleted
subscription.operators.coreos.com "submariner" deleted
service "submariner-operator-metrics" deleted
replicaset.extensions "submariner-operator-847f545595" deleted
pod "submariner-operator-847f545595-jwv27" deleted
再次列出对象 - 全部消失:
$ kubectl get all -n openshift-submariner
No resources found.
$ kubectl get olm -n openshift-submariner
No resources found.
我遇到了类似的问题:删除部署后 (kubectl delete deploy <name>
),pods 保留 "Running" 并在删除后自动重新创建 (kubectl delete po <name>
) .
原来是由于某种原因没有自动删除关联的副本集,删除后(kubectl delete rs <name>
),可以删除pods。
对于具有状态集(或服务、作业等)的部署,您可以使用此命令:
此命令终止在指定 <NAMESPACE>
中运行的所有内容
kubectl -n <NAMESPACE> delete replicasets,deployments,jobs,service,pods,statefulsets --all
又霸道
kubectl -n <NAMESPACE> delete replicasets,deployments,jobs,service,pods,statefulsets --all --cascade=true --grace-period=0 --force
显然有什么东西正在重生吊舱。虽然许多其他答案让您查看所有内容(副本集、作业、部署、有状态集,...)以找到可能重生 Pod 的内容,但您可以只查看 Pod 以查看是什么生成了它。例如:
$ kubectl describe pod $mypod | grep 'Controlled By:'
Controlled By: ReplicaSet/foobar
这会告诉您究竟是什么创建了 pod。然后你可以去删除它。
这发生在我身上,有一些损坏的 'helm' 安装。您的部署可能有点混乱。如果 none 之前的建议有效,请查找 daemonset 并将其删除。
例如
kubectl get daemonset --namespace
然后删除 daemonset
kubectl delete daemonset --namespace <NAMESPACE> --all --force
然后尝试删除 pods。
kubectl delete pod --namespace <NAMESPACE> --all --force
检查 pods 是否消失了。
kubectl get pods --all-namespaces
基本上有两种方法可以删除PODS
- kubectl scale --replicas=0 deploy name_of_deployment。
这会将副本数设置为 0,因此不会再次重新启动 pods。
- 使用 helm 卸载您在管道中实现的图表。
不要直接删除部署,而是使用 helm 卸载图表,这将删除它创建的所有对象。
对我来说最快的解决方案是安装 Lens IDE 并在 de DEPLOYMENTS 选项卡下删除该服务。只需从此选项卡中删除,副本也会被删除。
此致
我已经开始 pods 使用命令
$ kubectl run busybox \
--image=busybox \
--restart=Never \
--tty \
-i \
--generator=run-pod/v1
出了点问题,现在我不能删除这个Pod
。
我尝试使用下面描述的方法,但 Pod
不断被重新创建。
$ kubectl delete pods busybox-na3tm
pod "busybox-na3tm" deleted
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
busybox-vlzh3 0/1 ContainerCreating 0 14s
$ kubectl delete pod busybox-vlzh3 --grace-period=0
$ kubectl delete pods --all
pod "busybox-131cq" deleted
pod "busybox-136x9" deleted
pod "busybox-13f8a" deleted
pod "busybox-13svg" deleted
pod "busybox-1465m" deleted
pod "busybox-14uz1" deleted
pod "busybox-15raj" deleted
pod "busybox-160to" deleted
pod "busybox-16191" deleted
$ kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
default busybox-c9rnx 0/1 RunContainerError 0 23s
您需要删除部署,这会依次删除 pods 和副本集 https://github.com/kubernetes/kubernetes/issues/24137
列出所有部署:
kubectl get deployments --all-namespaces
然后删除部署:
kubectl delete -n NAMESPACE deployment DEPLOYMENT
其中 NAMESPACE 是它所在的命名空间,DEPLOYMENT 是部署的名称。如果 NAMESPACE 是 default
,则完全不使用 -n
选项。
在某些情况下,它也可能是 运行ning 由于作业或 daemonset。 检查以下内容和 运行 相应的删除命令。
kubectl get jobs
kubectl get daemonsets.app --all-namespaces
kubectl get daemonsets.extensions --all-namespaces
在某些情况下,即使删除部署,pods 仍不会消失。在这种情况下,要强制删除它们,您可以 运行 以下命令。
kubectl delete pods podname --grace-period=0 --force
如果即使在手动删除 pod 后 pod 仍在自动重新创建,那么那些 pods 已使用 Deployment 创建。 创建部署时,它会自动创建 ReplicaSet 和 Pods。根据您在部署脚本中提到的 pod 副本的数量,它最初会创建这些数量的 pods。 当您尝试手动删除任何 pod 时,它会自动再次创建这些 pod。
是的,有时您需要强行删除pods。但在这种情况下,force 命令不起作用。
如果您的 pod 名称类似于 name-xxx-yyy
,它可以由名为 name-xxx
的 replicasets.apps
控制,您应该在删除 pod 之前先删除那个 replicaset
:
kubectl delete replicasets.apps name-xxx
您可以尝试删除 replicaSet,而不是删除 NS
kubectl get rs --all-namespaces
然后删除副本集
kubectl delete rs your_app_name
还要注意 statefulset
kubectl get sts --all-namespaces
删除命名空间中的所有状态集
kubectl --namespace <yournamespace> delete sts --all
一一删除
kubectl --namespace ag1 delete sts mssql1
kubectl --namespace ag1 delete sts mssql2
kubectl --namespace ag1 delete sts mssql3
在完成 interactive tutorial 之后,我得到了一堆 pods、服务、部署:
me@pooh ~ > kubectl get pods,services
NAME READY STATUS RESTARTS AGE
pod/kubernetes-bootcamp-5c69669756-lzft5 1/1 Running 0 43s
pod/kubernetes-bootcamp-5c69669756-n947m 1/1 Running 0 43s
pod/kubernetes-bootcamp-5c69669756-s2jhl 1/1 Running 0 43s
pod/kubernetes-bootcamp-5c69669756-v8vd4 1/1 Running 0 43s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 37s
me@pooh ~ > kubectl get deployments --all-namespaces
NAMESPACE NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
default kubernetes-bootcamp 4 4 4 4 1h
docker compose 1 1 1 1 1d
docker compose-api 1 1 1 1 1d
kube-system kube-dns 1 1 1 1 1d
为了清理一切,delete --all
工作正常:
me@pooh ~ > kubectl delete pods,services,deployments --all
pod "kubernetes-bootcamp-5c69669756-lzft5" deleted
pod "kubernetes-bootcamp-5c69669756-n947m" deleted
pod "kubernetes-bootcamp-5c69669756-s2jhl" deleted
pod "kubernetes-bootcamp-5c69669756-v8vd4" deleted
service "kubernetes" deleted
deployment.extensions "kubernetes-bootcamp" deleted
这给我留下了(我认为是)一个空的 Kubernetes 集群:
me@pooh ~ > kubectl get pods,services,deployments
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 8m
如果您有一份工作继续 运行,您需要搜索该工作并将其删除:
kubectl get job --all-namespaces | grep <name>
和
kubectl delete job <job-name>
而不是试图弄清楚它是一个部署、deamonset、statefulset...还是什么(在我的例子中,它是一个不断跨越新的复制控制器 pods :) 为了确定是什么一直跨越图像,我使用以下命令获取了所有资源:
kubectl get all
当然你也可以获取所有命名空间的所有资源:
kubectl get all --all-namespaces
或定义您要检查的命名空间:
kubectl get all -n NAMESPACE_NAME
一旦我发现复制控制器是我的问题的根源,我就删除了它:
kubectl delete replicationcontroller/CONTROLLER_NAME
这将提供有关所有 pods、部署、服务和工作的信息 在命名空间中。
kubectl get pods,services,deployments,jobs
pods 可以由 deployments 或 jobs
创建kubectl delete job [job_name]
kubectl delete deployment [deployment_name]
如果删除部署或作业,则可以停止 pods 的重新启动。
您可以kubectl get replicasets
根据年龄或时间检查旧部署
如果要删除应用程序的相同当前 运行 pod,请根据时间删除旧部署
kubectl delete replicasets <Name of replicaset>
我也遇到了这个问题,我用下面的命令删除部署。
kubectl delete deployments DEPLOYMENT_NAME
但 pods 仍在重新创建,所以我使用以下命令交叉检查副本集
kubectl get rs
然后将副本集编辑为 1 到 0
kubectl edit rs REPICASET_NAME
问题的根本原因是 deployment/job/replicasets 规范属性 strategy->type
,它定义了当 pod 被销毁时应该发生什么(隐式或显式)。就我而言,它是 Recreate
.
根据@nomad 的
在进入调试之前,尝试使用以下命令了解幕后操作:
kubectl get all -A -o name
kubectl get events -A | grep <pod-name>
在我的例子中,我通过像 kubectl apply -f deployment.yaml
这样的 YAML 文件部署,解决方案似乎是通过 kubectl delete -f deployment.yaml
这里的很多答案都告诉你删除一个特定的k8s对象,但是你可以一次删除多个对象,而不是一个一个地删除:
kubectl delete deployments,jobs,services,pods --all -n <namespace>
就我而言,我是 运行 OpenShift 集群与 OLM - Operator Lifecycle Manager 。 OLM 是控制部署的人,所以当我删除部署时,不足以阻止 pods 重新启动。
只有当我删除 OLM 及其 订阅 时,部署、服务和 pods 才消失。
首先列出您命名空间中的所有 k8s 对象:
$ kubectl get all -n openshift-submariner
NAME READY STATUS RESTARTS AGE
pod/submariner-operator-847f545595-jwv27 1/1 Running 0 8d
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/submariner-operator-metrics ClusterIP 101.34.190.249 <none> 8383/TCP 8d
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/submariner-operator 1/1 1 1 8d
NAME DESIRED CURRENT READY AGE
replicaset.apps/submariner-operator-847f545595 1 1 1 8d
OLM没有和get all
一起列出,所以我特地搜索了一下:
$ kubectl get olm -n openshift-submariner
NAME AGE
operatorgroup.operators.coreos.com/openshift-submariner 8d
NAME DISPLAY VERSION
clusterserviceversion.operators.coreos.com/submariner-operator Submariner 0.0.1
现在删除所有对象,包括 OLM、订阅、部署、副本集等:
$ kubectl delete olm,svc,rs,rc,subs,deploy,jobs,pods --all -n openshift-submariner
operatorgroup.operators.coreos.com "openshift-submariner" deleted
clusterserviceversion.operators.coreos.com "submariner-operator" deleted
deployment.extensions "submariner-operator" deleted
subscription.operators.coreos.com "submariner" deleted
service "submariner-operator-metrics" deleted
replicaset.extensions "submariner-operator-847f545595" deleted
pod "submariner-operator-847f545595-jwv27" deleted
再次列出对象 - 全部消失:
$ kubectl get all -n openshift-submariner
No resources found.
$ kubectl get olm -n openshift-submariner
No resources found.
我遇到了类似的问题:删除部署后 (kubectl delete deploy <name>
),pods 保留 "Running" 并在删除后自动重新创建 (kubectl delete po <name>
) .
原来是由于某种原因没有自动删除关联的副本集,删除后(kubectl delete rs <name>
),可以删除pods。
对于具有状态集(或服务、作业等)的部署,您可以使用此命令:
此命令终止在指定 <NAMESPACE>
kubectl -n <NAMESPACE> delete replicasets,deployments,jobs,service,pods,statefulsets --all
又霸道
kubectl -n <NAMESPACE> delete replicasets,deployments,jobs,service,pods,statefulsets --all --cascade=true --grace-period=0 --force
显然有什么东西正在重生吊舱。虽然许多其他答案让您查看所有内容(副本集、作业、部署、有状态集,...)以找到可能重生 Pod 的内容,但您可以只查看 Pod 以查看是什么生成了它。例如:
$ kubectl describe pod $mypod | grep 'Controlled By:'
Controlled By: ReplicaSet/foobar
这会告诉您究竟是什么创建了 pod。然后你可以去删除它。
这发生在我身上,有一些损坏的 'helm' 安装。您的部署可能有点混乱。如果 none 之前的建议有效,请查找 daemonset 并将其删除。
例如 kubectl get daemonset --namespace
然后删除 daemonset
kubectl delete daemonset --namespace <NAMESPACE> --all --force
然后尝试删除 pods。
kubectl delete pod --namespace <NAMESPACE> --all --force
检查 pods 是否消失了。
kubectl get pods --all-namespaces
基本上有两种方法可以删除PODS
- kubectl scale --replicas=0 deploy name_of_deployment。 这会将副本数设置为 0,因此不会再次重新启动 pods。
- 使用 helm 卸载您在管道中实现的图表。 不要直接删除部署,而是使用 helm 卸载图表,这将删除它创建的所有对象。
对我来说最快的解决方案是安装 Lens IDE 并在 de DEPLOYMENTS 选项卡下删除该服务。只需从此选项卡中删除,副本也会被删除。
此致