AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 1076435
Accepted
solveit
solveit
Asked: 2021-09-03 06:01:53 +0800 CST2021-09-03 06:01:53 +0800 CST 2021-09-03 06:01:53 +0800 CST

如何删除 K3s 集群中除 kube-system 之外的所有命名空间

  • 772

我有一个带有系统 pod(即kube-system命名空间)和我的应用程序 pod 的 K3s 集群:

kube-system   pod/calico-node-xxxx                          
kube-system   pod/calico-kube-controllers-xxxxxx   
kube-system   pod/metrics-server-xxxxx
kube-system   pod/local-path-provisioner-xxxxx
kube-system   pod/coredns-xxxxx
app-system    pod/my-app-xxxx
db-system     pod/my-db-xxxxx

我正在寻找一个 shell/kubectl 命令(用于自动化脚本),它可以删除我的应用程序命名空间(想要修改kubectl delete namespace app-system db-system)而不在命令中提及应用程序命名空间名称(因为将来如果集群中有更多应用程序命名空间,我必须每次编辑此脚本)。

这意味着我想删除集群中的所有命名空间,除了 kube-system

类似的东西 - kubectl delete namespace -v kube-system(我知道-v这里不是一个有效的参数,只是展示了 grep-v是如何使用除了以下单词的。寻找类似的东西kubectl delete ns...)

kubernetes kubectl k3s
  • 3 3 个回答
  • 694 Views

3 个回答

  • Voted
  1. Best Answer
    Valentin Bajrami
    2021-09-03T13:55:41+08:002021-09-03T13:55:41+08:00

    我创建了以下代码,因此您可以将其用作包装器。您可以随意命名脚本。例如exclude_ns_removal

    #!/usr/bin/env bash
    
    die () 
    { 
        echo "$@" 1>&2
        exit 1
    }
    
    usage () 
    { 
        echo "usage: $0 [-h] [-v namespace_to_ignore] " 1>&2
        exit 0
    }
    
    inarray () 
    { 
        local n=$1 h
        shift
        for h in "$@"
        do
            [[ $n = "$h" ]] && return
        done
        return 1
    }
    
    while getopts ":v:h" opt; do
        case $opt in 
            h)
                usage
            ;;
            v)
                case $OPTARG in 
                    '' | *[0-9]*)
                        die "Digits not allowed $OPTARG"
                    ;;
                    *)
                        val=$OPTARG
                    ;;
                esac
            ;;
            :)
                die "argument needed to -$OPTARG"
            ;;
            *)
                die "invalid switch -$OPTARG"
            ;;
        esac
    done
    
    shift $((OPTIND - 1))
    
    while IFS='/' read -r _ ns; do
        a+=("$ns")
    done < <(kubectl get namespaces --no-headers -o name)
    
    if inarray "$val" "${a[@]}"; then
        unset 'a'
        { 
            while IFS='/' read -r _ ns; do
                a+=("$ns")
                for i in "${!a[@]}"
                do
                    if [[ ${a[i]} == $val ]]; then
                        unset 'a[i]'
                    fi
                done
            done
        } < <(kubectl get namespaces --no-headers -o name)
    
        printf '%s\n\n' "Excluding ... $val"
        for namespace in "${a[@]}"
        do
            printf 'Deleting ... %s\n' "$namespace"
        done
    else
        die "No namespace found"
    fi
    

    使脚本可执行:

    chmod u+x exclude_ns_removal
    

    运行如下:

    ./exclude_ns_removal -v kube-system
    

    结果将类似于:

    Excluding ... kube-system
    
    Deleting ... app-system
    Deleting ... db-system
    

    如果输出看起来不错,你应该修改这一行

    printf 'Deleting ... %s\n' "$namespace"
    

    至

    kubectl delete namespace "$namespace"
    
    • 4
  2. SYN
    2021-09-05T23:43:02+08:002021-09-05T23:43:02+08:00

    可能比以前的答案更简单——在这里写脚本或循环是多余的,kubernetes 为你做这一切:

    kubectl label ns foo=bar --all
    kubectl label ns kube-system foo-
    kubectl delete ns --selector foo=bar
    
    • 2
  3. Michał Gacek
    2021-09-04T05:19:05+08:002021-09-04T05:19:05+08:00

    这对于可以解决的事情来说已经很多了

    for i in `k get ns -o name | grep -v kube-system`; do
    k delete $i;
    done
    
    • 1

相关问题

  • 无法通过 Docker 在本地运行 Hyperkube (kubernetes)

  • 跨 Kubernetes 分散工作负载

  • Kubernetes升级回滚机器类型

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve