小于博客 小于博客
首页
  • Java学习笔记
  • Docker专区
  • 实战教程
  • Shell
  • 内存数据库
  • Vue学习笔记
  • Nginx
  • Php
  • CentOS
  • Docker
  • Gitlab
  • GitHub
  • MySql
  • MongoDB
  • OpenVPN
  • 配置文件详解
  • Other
  • ELK
  • K8S
  • Nexus
  • Jenkins
  • 随写编年
  • 电影音乐
  • 效率工具
  • 博客相关
  • 最佳实践
  • 迎刃而解
  • 学习周刊
关于
友链
  • 本站索引

    • 分类
    • 标签
    • 归档
  • 本站页面

    • 导航
    • 打赏
  • 我的工具

    • 备忘录清单 (opens new window)
    • 网站状态 (opens new window)
    • json2go (opens new window)
    • 微信MD编辑 (opens new window)
    • 国内镜像 (opens new window)
    • 出口IP查询 (opens new window)
    • 代码高亮工具 (opens new window)
  • 外站页面

    • 开往 (opens new window)
    • ldapdoc (opens new window)
    • HowToStartOpenSource (opens new window)
    • vdoing-template (opens new window)
GitHub (opens new window)

小于博客

行者常至,为者常成
首页
  • Java学习笔记
  • Docker专区
  • 实战教程
  • Shell
  • 内存数据库
  • Vue学习笔记
  • Nginx
  • Php
  • CentOS
  • Docker
  • Gitlab
  • GitHub
  • MySql
  • MongoDB
  • OpenVPN
  • 配置文件详解
  • Other
  • ELK
  • K8S
  • Nexus
  • Jenkins
  • 随写编年
  • 电影音乐
  • 效率工具
  • 博客相关
  • 最佳实践
  • 迎刃而解
  • 学习周刊
关于
友链
  • 本站索引

    • 分类
    • 标签
    • 归档
  • 本站页面

    • 导航
    • 打赏
  • 我的工具

    • 备忘录清单 (opens new window)
    • 网站状态 (opens new window)
    • json2go (opens new window)
    • 微信MD编辑 (opens new window)
    • 国内镜像 (opens new window)
    • 出口IP查询 (opens new window)
    • 代码高亮工具 (opens new window)
  • 外站页面

    • 开往 (opens new window)
    • ldapdoc (opens new window)
    • HowToStartOpenSource (opens new window)
    • vdoing-template (opens new window)
GitHub (opens new window)
  • Nexus系列文章

  • Jenkins系列文章

  • ELK笔记

  • Kubernetes笔记

    • 手动部署kubernetes-1-8-6集群

    • 其他姿势快速部署

    • 基础学习

    • 从新出发

      • 通过kubedog助力应用部署的状态监测与打印
      • k8s集群接入了kubegems之后删除namespace报错kubegems-local-controller-webhook-not-found
      • k8s删除namespace之后状态一直为Terminating
  • 系列专题
  • Kubernetes笔记
  • 从新出发
小于博客
2023-07-15

k8s删除namespace之后状态一直为Terminating

使用k8s时,执行如下命令删除一个 namespace:

$ kubectl delete ns local
1

随后查看该 ns 的状态,可以看到该 ns 始终保持在 Terminating 状态:

$ kubectl get ns local

NAME    STATUS        AGE
local   Terminating   3d1h
1
2
3
4

如果出现这种问题,一般情况下都是finalizers字段捣的鬼。

参看这篇文章:熟悉又陌生的 k8s 字段:finalizers (opens new window) 可以了解到:

Finalizers 字段属于 Kubernetes GC 垃圾收集器,是一种删除拦截机制,能够让控制器实现异步的删除前(Pre-delete)回调。其存在于任何一个资源对象的 Meta (opens new window) 中,在 k8s 源码中声明为 []string,该 Slice 的内容为需要执行的拦截器名称。

通常删除不掉可能是因为集群内有某些 webhook,从而导致这个问题,如果此时该 webhook 并不能确定是否可以删除,那么网上提到的,直接编辑 ns,删除 finalizers 的值是无法解决的,仍旧会遇到如下报错:

$ kubectl edit ns local

error: namespaces "local" could not be patched: Internal error occurred: failed calling webhook "rancherauth.cattle.io": Post "https://rancher-webhook.cattle-system.svc:443/v1/webhook/validation?timeout=10s": no endpoints available for service "rancher-webhook"
You can run `kubectl replace -f /tmp/kubectl-edit-550962354.yaml` to try this update again.
1
2
3
4

这个时候,可以参考此文档的方案解决:移除該死的Terminating Namespace (opens new window)

上边文档最后留了一个脚本,用于删除这种状态的 namespace 的 finalizers 字段,因为脚本还缺了一些内容,因此调整之后补充如下:

#!/bin/bash
if [[ $# -ne 1 ]]; then
echo "Please input only namespace name"
exit 1
fi
ns=$1
kubectl get ns ${ns} -o json > tmp.json
cat ./tmp.json | jq 'del(.spec.finalizers[])' > ./modify.json
cat ./tmp.json | jq 'del(.metadata.finalizers[])' > ./modify.json
kubectl replace --raw "/api/v1/namespaces/${ns}/finalize" -f ./modify.json
rm -f tmp.json modify.json
1
2
3
4
5
6
7
8
9
10
11

然后执行脚本,将名称空间放在第一个位置参数即可:bash remove-ns.sh local。

1689427249424

上次更新: 2024/01/11, 14:21:50

← k8s集群接入了kubegems之后删除namespace报错kubegems-local-controller-webhook-not-found

最近更新
01
SpringBoot 快速实现 api 加密!
03-21
02
SpringBoot整合SQLite
03-07
03
SpringBoot配置使用H2数据库的简单教程
02-21
更多文章>
Theme by Vdoing | Copyright © 2017-2024 | 点击查看十年之约 | 豫ICP备2022014539号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式