k8s强制删除pod、svc、namespace(Terminating)驱逐pod


如果名称空间、pod、pv、pvc全部处于“Terminating”状态时,此时的该名称空间下的所有控制器都已经被删除了,之所以出现pod、pvc、pv、ns无法删除,那是因为kubelet 阻塞,有其他的资源在使用该namespace,比如CRD等,尝试重启kubelet,再删除该namespace 也不好使。

正确的删除方法:删除pod–> 删除pvc —> 删除pv --> 删除名称空间

一:强制删除pod

1、命令加参方法:

加参数 --force --grace-period=0,grace-period表示过渡存活期,默认30s,在删除POD之前允许POD慢慢终止其上的容器进程,从而优雅退出,0表示立即终止POD

kubectl delete pod <your-pod-name> -n <name-space> --force --grace-period=0

kubectl patch pod xxx -n  xxx -p '{"metadata":{"finalizers":null}}'

二:强制删除pv、pvc

直接删除k8s etcd数据库中的记录!

# 删除 namespace下的pod名为pod-to-be-deleted-0
    export ETCDCTL_API=3 
etcdctl del /registry/pods/《namespace》/《》
# 删除需要删除的
    etcdctl del /registry/namespaces/NAMESPACENAME

命令,将PV的状态设置为“released”。

kubectl patch pv xxx -p '{"metadata":{"finalizers":null}}'
kubectl patch pvc xxx -p '{"metadata":{"finalizers":null}}'
kubectl delete pv my-pv

三、强制删除ns,以namespace:kubesphere-system为例

1、以下强制删除也不好使:

kubectl delete ns kubesphere-system --force --grace-period=0

kubectl get namespace my-namespace -o json | kubectl delete -f -  (未实验)

2、最终解决方法:

1)查看处于“Terminating”状态的namespace:

kubectl get ns -A

在这里插入图片描述

2、查看Terminating namespace中的finalizer。

kubectl get ns kubesphere-system -o yaml

在这里插入图片描述

3、导出json格式到文件

kubectl get ns kubesphere-system -o json >tmp.json

4、编辑tmp.josn,删除finalizers 字段的值

5行 : 5dd
{​

5、开启proxy:8001端口

kubectl proxy

在这里插入图片描述

5注:(按顺序无需注意这一步)

如果不用Proxy 模式, 要想用curl直接访问API,则需要自带密码认证信息:

APISERVER=$(kubectl config view --minify | grep server | cut -f 2- -d ":" | tr -d " ")
SECRET_NAME=$(kubectl get secrets | grep ^default | cut -f1 -d ' ')
TOKEN=$(kubectl describe secret $SECRET_NAME | grep -E '^token' | cut -f2 -d':' | tr -d " ")
 
curl $APISERVER/api --header "Authorization: Bearer $TOKEN" --insecure

6、新开窗口、调用8001–api

curl -k -H "Content-Type: application/json" -X PUT --data-binary @tmp.json http://127.0.0.1:8001/api/v1/namespaces/kubesphere-system/finalize

在这里插入图片描述

7、确认namespace删除

在这里插入图片描述

四:重启deploy的方式:

1. 有yaml文件的重启方式

kubectl replace --force -f xxx.yaml

2. 没有yaml文件重启方式

2.1 使用scale命令

kubectl scale <deployment>  --replicas=0 -n {namespace}
kubectl scale <deployment>  --replicas=1 -n {namespace}

2.2 直接删除重启

此方式只针对使用的deployment对象,并且重启策略为可以重启,则可以尝试删除重启

kubectl delete replicaset {rs_name} -n {namespace}

2.3 使用 "-o yaml"参数导出Pod模板并重建模板(推荐)

kubectl get pod {podname} -n {namespace} -o yaml | kubectl replace --force -f -

五:驱逐pod

1、 设置节点不可调用。

 kubectl cordon 192.168.220.131

2、驱逐pod

kubectl drain 192.168.220.131 --delete-local-data --ignore-daemonsets --force 

3、可调度

kubectl uncordon   192.168.220.131

4、删除evicted状态pod

kubectl -n kube-system  get pods | grep -i evicted | awk '{print$1}'|xargs kubectl -n kube-system delete pods

etcd报错

1 台 master 加入集群后发现忘了修改主机名,而在 k8s 集群中修改节点主机名非常麻烦,将 master 退出集群改名并重新加入集群(前提是用的是高可用集群)。

问题:
k8s现在使用的是etcd v3,必须提供ca、key、cert,否则会出现Error: context deadline exceeded
不加–endpoint参数时,默认访问的127.0.0.1:2379,而使用–endpoint参数时,必须提供ca,key,cert。

Failed to get etcd status for with maintenance client: context deadline exc...

code = DeadlineExceded desc = latest balancer error: last connection error: connection closed before server preface received"

查询

etcdctl --write-out=table member list



etcdctl --endpoints=$ETCD_ENDPOINTS \
--cert=/srv/etcd/etc/ssl/etcd.crt \
--key=/srv/etcd/etc/ssl/etcd.key \
--cacert=/srv/etcd/etc/ssl/ca.crt \
member list --write-out=table 

删除

docker exec -it $(docker ps -f name=etcd_etcd -q) /bin/sh

etcdctl --endpoints 127.0.0.1:2379 --cacert /etc/kubernetes/pki/etcd/ca.crt --cert /etc/kubernetes/pki/etcd/server.crt --key /etc/kubernetes/pki/etcd/server.key member remove <id>

六、docker overaly2占用巨量空间内容删除

#删除所有未使用的镜像:
docker image prune -a

#删除未使用的Docker数据卷:
docker volume prune

¥清理overlay2目录中未使用的文件。使用以下命令列出所有未使用的文件:
docker system df

#使用以下命令删除所有未使用的文件:
docker system prune --all --force --volumes

七、k8s调度之容器亲和性

系列文章

八、报错Readiness probe failed

Readiness probe failed: HTTP probe failed with statuscode: 503

kubectl get clusterrole | grep minio
kubectl edit clusterrole system:coredns 增加权限

九、清除未使用镜像,卷,网络,容器

1、自行删除镜像,容器

##docker删除none镜像
docker rmi $(docker images | grep "none" | awk '{print $3}')

docker rm -f  $(docker ps -a | grep "Exited" | awk '{print $1 }')

2、docker 命令

## docker删除所有无用镜像,缓存,卷,容器网络
docker system prune
##  -a 所有的中间镜像也会被删除。


## 单删
docker network prune

docker image prune
docker image prune -a --filter "until=24h"

docker container prune

docker volume prune

3、时间任务定时清理

定时任务生成

 crontab -e  ##每周日执行一次
0 0 * * SUN docker image prune -a --force --filter "until=72h"
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@王先生1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值