目录

1 解决方案综述

2 错误描述

3 解决方案

    3.1 导出 ns 资源定义

    3.2 编辑 ns 资源定义

    3.3 创建代理服务器

    3.4 curl 调用删除 ns


1 解决方案综述

        创建本地代理服务器,然后通过 curl 客户端调用 http restful api 强行删除 namespace。

2 错误描述

        删除 ns 时(本文是 gitlab-ce,个人根据实际情况修改),发现长期处于 “terminating” 状态:

spacer.gif九析带你轻松完爆 k8s 删除 namespace 卡在 terminating_第1张图片

        于是执行如下语句强行删除:

kubectl delete ns gitlab-ce --force --grace-period=0

        出现如下错误:

Error from server (Conflict): Operation cannot be fulfilled on namespaces "gitlab-ce": The system is ensuring all content is removed from this namespace.  Upon completion, this namespace will automatically be purged by the system.

3 解决方案

3.1 导出 ns 资源定义

kubectl get ns gitlab-ce -o json > gitlab-ce.json

3.2 编辑 ns 资源定义

        打开 gitlab-ce.json 资源文件,然后删除其中的 spec 字段(因为其中会包括 finalizers 字段)。spacer.gif九析带你轻松完爆 k8s 删除 namespace 卡在 terminating_第2张图片

3.3 创建代理服务器

        在本地和 k8s apiserver 之间创建代理服务器,后续会将删除 namespace 的 api 通过代理服务器端口(默认8001)转发到远程 k8s apiserver 服务器处理。

kubectl proxy

clipboard3.pngspacer.gif

3.4 curl 调用删除 ns

        执行 curl 客户端调用,删除 ns。

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

九析带你轻松完爆 k8s 删除 namespace 卡在 terminating_第3张图片

        自此,轻松完爆处于 terminating 状态的 namespace。