K3s 클러스터에서 kube-system을 제외한 모든 네임스페이스를 삭제하는 방법

K3s 클러스터에서 kube-system을 제외한 모든 네임스페이스를 삭제하는 방법

kube-system시스템 포드(예: 네임스페이스)와 애플리케이션 포드 가 있는 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

명령에서 앱 네임스페이스 이름을 언급하지 않고 내 애플리케이션 네임스페이스를 삭제할 수 있는(수정하려는) 쉘/kubectl 명령(자동화 스크립트용)을 찾고 있습니다 kubectl delete namespace app-system db-system(향후에 더 많은 앱 네임스페이스가 클러스터에 들어오면 매번 이 스크립트를 편집하세요).

이는 클러스터의 모든 네임스페이스를 삭제하고 싶다는 의미입니다.제외하고 kube-system

다음과 같은 것 - ( 여기서는 유효한 매개변수가 아니라는 것을 kubectl delete namespace -v kube-system알고 있습니다 . 단지 grep에서 다음 단어를 제외하는 데 사용되는 방법을 보여주는 것뿐입니다. 비슷한 것을 찾고 있습니다 .)-v-vkubectl delete ns...

답변1

래퍼로 사용할 수 있도록 다음 코드를 만들었습니다. 원하는 대로 스크립트 이름을 지정할 수 있습니다. 예를 들어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"

답변2

이전 답변보다 간단할 수 있습니다. 여기서 스크립트나 루프를 작성하는 것은 과잉이며, kubernetes가 모든 작업을 수행합니다.

kubectl label ns foo=bar --all
kubectl label ns kube-system foo-
kubectl delete ns --selector foo=bar

답변3

해결될 수 있는 일이 너무 많아요

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

관련 정보