K8s CRD资源一直Terminating删除不掉

解决这个问题的办法:

1
2
3
4
🦄🌈🩷 kubectl patch crd/cephclusters.ceph.rook.io -p '{"metadata":{"finalizers":[]}}' --type=merge
输出
Alias tip: k patch crd/cephclusters.ceph.rook.io -p '{"metadata":{"finalizers":[]}}' --type=merge
customresourcedefinition.apiextensions.k8s.io/cephclusters.ceph.rook.io patched

其实就是修改其 metaddata 下 finalizers 的值为空就可以了。

类似的,如果不是 CRD,是其他资源类型,如 pod、deploy、namespaces 等,都可以把其 finalizers 的值改成空的就可以了。

1
2
3
4
5
6
7
8
9

强制删除 pvc
kubectl patch pvc pvc-9cd01e19-93b4-4bd8-bfc8-9d96cbe03f46  -p '{"metadata":{"finalizers":null}}' -n senyint

强制删除 pod
kubectl delete pod PODNAME --force --grace-period=0   -n senyint

强制删除 namespace
kubectl delete namespace NAMESPACENAME --force --grace-period=0   -n senyint
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
一、强制删除pod
$ kubectl delete pod <your-pod-name> -n <name-space> --force --grace-period=0
解决方法:加参数 --force --grace-period=0,grace-period表示过渡存活期,默认30s,在删除POD之前允许POD慢慢终止其上的容器进程,从而优雅退出,0表示立即终止POD

二、强制删除pv、pvc
$ kubectl patch pv xxx -p '{"metadata":{"finalizers":null}}'
$ kubectl patch pvc xxx -p '{"metadata":{"finalizers":null}}'
直接删除k8s etcd数据库中的记录!

三、强制删除ns
在尝试以下命令强制删除也不好使:

$ kubectl delete ns <terminating-namespace> --force --grace-period=0
解决方法:

1)运行以下命令以查看处于“Terminating”状态的namespace:

$ kubectl get namespaces
2)选择一个Terminating namespace,并查看namespace 中的finalizer。运行以下命令:

$ kubectl get namespace <terminating-namespace> -o yaml

3)导出 json 格式到文件

1
$ kubectl get namespace <terminating-namespace> -o json >tmp.json

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
{
  "apiVersion": "v1",
  "kind": "Namespace",
  "metadata": {
    "creationTimestamp": "2019-11-20T15:18:06Z",
    "deletionTimestamp": "2020-01-16T02:50:02Z",
    "name": "<terminating-namespace>",
    "resourceVersion": "3249493",
    "selfLink": "/api/v1/namespaces/knative-eventing",
    "uid": "f300ea38-c8c2-4653-b432-b66103e412db"
  },
  "spec": {    #从此行开始删除
    "finalizers": []
  },   # 删到此行
  "status": {
    "phase": "Terminating"
  }
}

5)开启 proxy

1
$ kubectl proxy

执行该命令后,当前终端会被卡住 6)打开新的一个窗口,执行以下命令

1
$ curl -k -H "Content-Type: application/json" -X PUT --data-binary @tmp.json http://127.0.0.1:8001/api/v1/namespaces/<terminating-namespace>/finalize

输出信息如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
{
  "kind": "Namespace",
  "apiVersion": "v1",
  "metadata": {
    "name": "istio-system",
    "selfLink": "/api/v1/namespaces/istio-system/finalize",
    "uid": "2e274537-727f-4a8f-ae8c-397473ed619a",
    "resourceVersion": "3249492",
    "creationTimestamp": "2019-11-20T15:18:06Z",
    "deletionTimestamp": "2020-01-16T02:50:02Z"
  },
  "spec": {},
  "status": {
    "phase": "Terminating"
  }
}

7)确认处于 Terminating 状态的 namespace 已经被删除

1
$ kubectl get namespaces

如果还有处于 Terminating 状态的 namespace,重复以上操作,删除即可!

我有梦,有远方,我会为了它们奔跑,奋斗,直到成为连我自己都佩服的人。

查看集群 CRD

1
$ kubectl -n rook-ceph get cephcluster

如果没有删除干净,需要进行删除

1
$ kubectl -n rook-ceph delete cephcluster --all

如果由于某种原因操作符无法删除终结器(即操作符不再运行),您可以使用以下命令手动删除终结器:

1
2
3
4
for CRD in $(kubectl get crd -n rook-ceph | awk '/ceph.rook.io/ {print $1}'); do
    kubectl get -n rook-ceph "$CRD" -o name | \
    xargs -I {} kubectl patch -n rook-ceph {} --type merge -p '{"metadata":{"finalizers": [null]}}'
done

3.检查哪些资源正在阻止删除,并删除终结器和这些资源

1
$ kubectl api-resources --verbs=list --namespaced -o name | xargs -n 1 kubectl get --show-kind --ignore-not-found -n rook-ceph

4.删除关键资源终结器

Rook 为 Ceph 集群关键的资源添加了终结器ceph.rook.io/disaster-protection,这样资源就不会被意外删除。操作员负责在删除 CephCluster 时删除终结器。如果由于某种原因操作符无法删除终结器(即操作符不再运行),您可以使用以下命令手动删除终结器:

1
2
$ kubectl -n rook-ceph patch configmap rook-ceph-mon-endpoints --type merge -p '{"metadata":{"finalizers": [null]}}'
$ kubectl -n rook-ceph patch secrets rook-ceph-mon --type merge -p '{"metadata":{"finalizers": [null]}}'

创建一个 cleanup.sh 的脚本, 脚本根据实际情况修改需要清空的磁盘。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#!/usr/bin/env bash

# Zap the disk to a fresh, usable state (zap-all is important, b/c MBR has to be clean)

# You will have to run this step for all disks.
#清除磁盘中的链接关联信息
sgdisk --zap-all /dev/sdb2
sgdisk --zap-all /dev/sdb3
sgdisk --zap-all /dev/sdb4
sgdisk --zap-all /dev/sdb5

# Clean hdds with dd
# 擦除磁盘的系统 ,
# ** 此命令危险,需要确认好再执行 **
dd if=/dev/zero of="/dev/sdb2" bs=1M count=100 oflag=direct,dsync
dd if=/dev/zero of="/dev/sdb3" bs=1M count=100 oflag=direct,dsync
dd if=/dev/zero of="/dev/sdb4" bs=1M count=100 oflag=direct,dsync
dd if=/dev/zero of="/dev/sdb5" bs=1M count=100 oflag=direct,dsync

# Clean disks such as ssd with blkdiscard instead of dd
blkdiscard /dev/sdb2
blkdiscard /dev/sdb3
blkdiscard /dev/sdb4
blkdiscard /dev/sdb5

# These steps only have to be run once on each node
# If rook sets up osds using ceph-volume, teardown leaves some devices mapped that lock the disks.
ls /dev/mapper/ceph-* | xargs -I% -- dmsetup remove %

# ceph-volume setup can leave ceph-<UUID> directories in /dev and /dev/mapper (unnecessary clutter)
rm -rf /dev/ceph-*
rm -rf /dev/mapper/ceph--*

# Inform the OS of partition table changes
partprobe /dev/sdb2
partprobe /dev/sdb3
partprobe /dev/sdb4
partprobe /dev/sdb5

# 这里清除的是pod内部挂载到外部的文件信息
rm -rf /app/rook-ceph/
# 这里是pod默认会生成的一些信息。
rm -rf /var/lib/rook/

确认需要清除,且清除脚本确认无误后可以执行脚本进行清除了 *清除脚本很危险, 如果错误清除,可能会导致磁盘系统崩溃,请确认无误后再执行此脚本*

1
2
# 执行清除脚本
bash cleanup.sh

rook-ceph

image-20230906091108843

Licensed under CC BY-NC-SA 4.0
最后更新于 Jan 06, 2025 05:52 UTC
comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
Caret Up