Mystery0の小站

Mystery0の小站

K3s删除处于Terminating状态的命名空间以及longhorn卸载踩坑

K3s删除处于Terminating状态的命名空间以及longhorn卸载踩坑

前言

没啥好说的,去年踩过一次longhorn卸载的坑,今晚又踩进去了,去年的解决方案是:重装了整个K3s,甚至宿主机系统(后面做了迁移),这一次是在不重装的前提下找到解决办法。

删除处于Terminating状态的命名空间

(
NAMESPACE=longhorn-system
kubectl proxy &
kubectl get namespace $NAMESPACE -o json |jq '.spec = {"finalizers":[]}' >temp.json
curl -k -H "Content-Type: application/json" -X PUT --data-binary @temp.json 127.0.0.1:8001/api/v1/namespaces/$NAMESPACE/finalize
)

注意:这里依赖一个jq,需要自行安装,homebrew就直接brew install jq就行了,Ubuntu可以sudo apt-get install jq -y

正确卸载longhorn

其实官网有写如何正确卸载,但是我安装的教程是在k3s看的,安装的教程很简单,一行命令就跑完,然后等待启动。 我在启动的过程中觉得这个镜像拉去太慢了,就把yaml下载到本地改了一下镜像地址,再次apply了一下,就出问题了(也可能没出问题,但是我觉得太慢了),所以就开始按照常规方法 kubectl delete -f,然后就开始无限的死锁。 kubectl delete删除了大部分的资源,但是有一些东西卡在那里,例如:longhorn-manager处于Terminating状态、crd/engineimages.longhorn.io里面有一个东西删不掉、nodes.longhorn.io里面有一个node没有ready、nodes状态不正确导致命名空间longhorn-system无法删除。

然后开始尝试恢复,kubectl apply -f再执行了一次,提示命名空间已经处于Terminating状态,无法往里面创建pod这些资源。 期间我通过kubectl delete po instance-manager-r-8239ccb0 --force --grace-period=0强制删除了longhorn-managercrd/engineimages.longhorn.io,命名空间依赖nodes.longhorn.io里面的状态变成ready,强制删除nodes.longhorn.io又会提示webhook内部错误(改动nodes.longhorn.io这个对象似乎会给longhorn-conversion-webhook发送请求),但是longhorn-conversion-webhook已经没了,所以,算是死锁了吧。

最终我找到了上面的命令,把Terminating状态的命名空间强制删掉了,然后再kubectl apply -f去创建一个新的命名空间,这样子就能往这个命名空间里面启动一个longhorn-conversion-webhook之后,打破死锁的条件之一。

再然后就是按照官方的卸载流程:

# 创建一个删除器
kubectl create -f https://raw.githubusercontent.com/longhorn/longhorn/master/uninstall/uninstall.yaml
# 上一步提示需要设置这个确认标记为true,用这个命令修改一下
kubectl -n longhorn-system edit settings.longhorn.io deleting-confirmation-flag
# 删除器会按照正确的流程删除组件,然后我们就删除一开始apply的东西,主要是删除不会导致死锁的组件以及crd定义
kubectl delete -f https://raw.githubusercontent.com/longhorn/longhorn/master/deploy/longhorn.yaml
# 等待删除器完成之后,移除删除器本身
kubectl delete -f https://raw.githubusercontent.com/longhorn/longhorn/master/uninstall/uninstall.yaml

参考链接

K3s - 卷和存储

Uninstall Longhorn

Namespace "stuck" as Terminating, How I removed it