Рейтинг:2

Как удалить все пространства имен, кроме kube-system в кластере K3s

флаг ar

У меня есть кластер K3s с системными модулями (т.е. kube-система namespace) и мои модули приложений:

куб-система pod/calico-node-xxxx                          
куб-система pod/calico-kube-controllers-xxxxxx   
kube-система pod/метрика-сервер-xxxxx
kube-system pod/local-path-provisioner-xxxxx
модуль kube-system/coredns-xxxxx
модуль приложения-системы/мое-приложение-xxxx
db-система pod/my-db-xxxxx

Я ищу команду оболочки/kubectl (для скрипта автоматизации), которая может удалить пространство имен моего приложения (хочу изменить kubectl удалить пространство имен app-system db-system) без упоминания имени пространства имен приложения в команде (так как в будущем, если в кластере появится больше пространства имен приложения, мне придется каждый раз редактировать этот скрипт).

Это означает, что я хочу удалить все пространство имен в кластере кроме kube-система

что-то вроде - kubectl удалить пространство имен -v kube-system (Я знаю -v здесь недопустимый параметр, просто показано, как в grep -v используется для исключения следующих слов. Аналогичная вещь ищет kubectl удалить нс... )

Valentin Bajrami avatar
флаг br
Вы можете написать обертку самостоятельно что-то вроде: `{ читать -r; при чтении -r ns _; do [[ $ns == *kube-system* ]] && continue ; эхо "$ns"; сделано ;}
Рейтинг:4
флаг br

Я создал следующий код, так что вы можете использовать его в качестве оболочки. Вы можете назвать скрипт как хотите. Например exclude_ns_removal

#!/usr/bin/env bash

умереть () 
{ 
    эхо "$@" 1>&2
    выход 1
}

Применение () 
{ 
    echo "использование: $0 [-h] [-v namespace_to_ignore] " 1>&2
    выход 0
}

в массиве () 
{ 
    местный n=$1 час
    сдвиг
    для h в "$@"
    делать
        [[ $n = "$h" ]] && возврат
    сделано
    вернуть 1
}

в то время как getopts ":v:h" opt; делать
    case $opt in 
        час)
            Применение
        ;;
        в)
            случай $OPTARG в 
                '' | *[0-9]*)
                    die "Цифры не допускаются $OPTARG"
                ;;
                *)
                    val=$OPTARG
                ;;
            эсак
        ;;
        :)
            die "аргумент, необходимый для -$OPTARG"
        ;;
        *)
            die "неверный ключ -$OPTARG"
        ;;
    эсак
сделано

сдвиг $((OPTIND - 1))

в то время как IFS='/' читать -r _ ns; делать
    а+=("$ns")
сделано < <(kubectl получить пространства имен --no-headers -o имя)

если в массиве "$val" "${a[@]}"; тогда
    сбросить 'а'
    { 
        в то время как IFS='/' читать -r _ ns; делать
            а+=("$ns")
            для i в "${!a[@]}"
            делать
                если [[ ${a[i]} == $val ]]; тогда
                    сбросить 'а [я]'
                фи
            сделано
        сделано
    } < <(kubectl получить пространства имен --no-headers -o имя)

    printf '%s\n\n' "Исключая... $val"
    для пространства имен в "${a[@]}"
    делать
        printf 'Удаление... %s\n' "$namespace"
    сделано
еще
    die "Пространство имен не найдено"
фи

Сделайте скрипт исполняемым:

chmod u+x exclude_ns_removal

Запустите его следующим образом:

./exclude_ns_removal -v куб-система

Результат будет примерно таким:

Исключая... kube-систему

Удаление... app-системы
Удаление... db-системы

Если вывод выглядит хорошо, вы должны изменить эту строку

printf 'Удаление... %s\n' "$namespace"

к

kubectl удалить пространство имен "$ namespace"
Рейтинг:2
флаг hk
SYN

Может быть проще, чем предыдущие ответы - написание скриптов или циклов здесь излишне, kubernetes сделает все за вас:

kubectl label ns foo=bar --all
kubectl label ns kube-system foo-
kubectl удалить ns --selector foo=bar
Valentin Bajrami avatar
флаг br
Я согласен с тем, что сценарий является излишним для этой простой задачи. Вопрос заключался в том, чтобы как-то имитировать функциональность `grep -v`. Также скрипт предлагает большую гибкость, проверяет, существует ли «пространство имен», и может быть расширен для большей функциональности.
SYN avatar
флаг hk
SYN
Однако, используя метки, вам не нужно проверять существование пространства имен.
Рейтинг:1
флаг sk

Это много для чего-то, что можно решить с помощью

for i in `k получить ns -o имя | grep -v kube-система`; делать
k удалить $i;
сделано
Valentin Bajrami avatar
флаг br
Спасибо Михал. Я не знал опции `-o name`. Я часто использую `-o json`. Я включил `-o name` в скрипт

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.