Пространство имен "застряло" как Завершение, Как я удалил его

У меня было "застрявшее" пространство имен, которое я удалил, показывая в этом вечном "завершающем" состоянии.

36 ответов

Предполагая, что вы уже пытались принудительно удалить ресурсы, такие как: Бобы застряли на завершающем статусе, и вы в конце концов пытаетесь восстановить пространство имен...

Вы можете принудительно удалить пространство имен (возможно, оставив висячие ресурсы):

(
NAMESPACE=your-rogue-namespace
kubectl proxy &
kubectl get namespace $NAMESPACE -o json |jq '.spec = {"finalizers":[]}' >temp.json
curl -k -H "Content-Type: application/json" -X PUT --data-binary @temp.json 127.0.0.1:8001/api/v1/namespaces/$NAMESPACE/finalize
)
  • Это уточнение ответа здесь, которое основано на комментарии здесь.

  • Я использую jq утилита для программного удаления элементов в разделе финализаторов. Вы можете сделать это вручную вместо этого.

  • kubectl proxy создает слушателя в 127.0.0.1:8001 по умолчанию Если вы знаете имя хоста /IP вашего кластера, вы можете использовать его вместо этого.

  • Самое смешное, что этот подход работает даже при использовании kubectl edit внесение того же самого изменения не имеет никакого эффекта.

Это вызвано тем, что в пространстве имен все еще существуют ресурсы, которые контроллер пространства имен не может удалить.

Эта команда (с kubectl 1.11+) покажет вам, какие ресурсы остаются в пространстве имен:

kubectl api-resources --verbs=list --namespaced -o name \
  | xargs -n 1 kubectl get --show-kind --show-all --ignore-not-found -n <namespace>

Как только вы найдете и решите и удалите их, пространство имен будет очищено

Как упоминалось ранее в этом потоке, есть другой способ завершить пространство имен с помощью API, не предоставляемого kubectl, с помощью современной версии kubectl, где kubectl replace --rawдоступно (не уверен, с какой версии). Таким образом, вам не нужно будет создаватьkubectl proxyprocess и избегайте зависимости от curl (что в некоторых средах, таких как busybox, недоступно). В надежде, что это поможет кому-то другому, я оставил это здесь:

kubectl get namespace "stucked-namespace" -o json \
  | tr -d "\n" | sed "s/\"finalizers\": \[[^]]\+\]/\"finalizers\": []/" \
  | kubectl replace --raw /api/v1/namespaces/stucked-namespace/finalize -f -

Нужно убрать финализатор для кубернетов.

Шаг 1:

kubectl get namespace <YOUR_NAMESPACE> -o json > <YOUR_NAMESPACE>.json
  • удалить кубернеты из массива финализаторов, который находится под спецификацией

Шаг 2:

kubectl replace --raw "/api/v1/namespaces/<YOUR_NAMESPACE>/finalize" -f ./<YOUR_NAMESPACE>.json

Шаг 3:

kubectl get namespace

Вы можете видеть, что раздражающее пространство имен исчезло.

Шаг 1: В одной команде запуска терминала ниже:

kubectl прокси

Шаг 2. Откройте другой терминал, затем выгрузите дескриптор как JSON в файл.

kubectl получить пространство имен YOURNAMESPACE -o json > logging.json

Откройте файл в текстовом редакторе:

{
    "apiVersion": "v1",
    "kind": "Namespace",
    "metadata": {
        "creationTimestamp": "2019-05-14T13:55:20Z",
        "labels": {
            "name": "logging"
        },
        "name": "logging",
        "resourceVersion": "29571918",
        "selfLink": "/api/v1/namespaces/logging",
        "uid": "e9516a8b-764f-11e9-9621-0a9c41ba9af6"
    },
    "spec": {
        "finalizers": [
            **"kubernetes"**
        ]
    },
    "status": {
        "phase": "Terminating"
    }
}

Удалите кубернеты из массива финализаторов:

    {
        "apiVersion": "v1",
        "kind": "Namespace",
        "metadata": {
            "creationTimestamp": "2019-05-14T13:55:20Z",
            "labels": {
                "name": "logging"
            },
            "name": "logging",
            "resourceVersion": "29571918",
            "selfLink": "/api/v1/namespaces/logging",
            "uid": "e9516a8b-764f-11e9-9621-0a9c41ba9af6"
        },
        "spec": {
            "finalizers": [
            ]
        },
        "status": {
            "phase": "Terminating"
        }
    }

Шаг 3: Выполнение команды очистки, чтобы избавиться от этого раздражающего пространства имен:

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

наслаждаться

Мне понравился этот ответ, извлеченный отсюда. Это всего лишь 2 команды.

В одном терминале:

kubectl proxy

В другом терминале:

kubectl get ns delete-me -o json | \
  jq '.spec.finalizers=[]' | \
  curl -X PUT http://localhost:8001/api/v1/namespaces/delete-me/finalize -H "Content-Type: application/json" --data @-

Простой трюк

Вы можете редактировать пространство имен только на консоли kubectl edit <namespace name>удалите / удалите "Kubernetes" из раздела финализатора и нажмите ввод или сохраните / примените изменения.

за один шаг вы тоже можете это сделать.

Уловка: 1

  1. kubectl получить пространство имен раздражающее пространство имен для удаления -o json > tmp.json

  2. затем редактировать tmp.json и удалите "кубернеты"

  3. Откройте другой терминал и запустите kubectl proxy

curl -k -H "Content-Type: application / json" -X PUT --data-binary @tmp.json https://localhost:8001/api/v1/namespaces/<NAMESPACE NAME TO DELETE>/ завершить

и он должен удалить ваше пространство имен.

Уловка: 2

Проверьте информацию о кластере kubectl

1. kubectl cluster-info

Мастер Kubernetes работает по адресу https://localhost:6443/

KubeDNS работает по адресу https://localhost:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy.

Для дальнейшей отладки и диагностики проблем кластера используйте

2. kubectl cluster-info dump

теперь запустите прокси с помощью команды:

3. kubectl proxy

Прокси-сервер kubectl и начало обслуживания на 127.0.0.1:8001

найти пространство имен

4. `kubectl get ns`

{Имя вашего пространства имен} Прекращение действия 1d

поместите это в файл

5. kubectl get namespace {Your namespace name} -o json > tmp.json

отредактируйте файл tmp.json и удалите финализаторы

}, "spec": { "finalizers": [ "kubernetes" ] },

после редактирования это должно выглядеть так

}, "spec": {"финализаторы": [ ] },

мы почти там, просто теперь запускаем команду

curl -k -H "Content-Type: application/json" -X PUT --data-binary @tmp.json http://127.0.0.1:8001/api/v1/namespaces/{Your namespace name}/finalize

и все

**

Для нас это было metrics-server сбой.

Поэтому, чтобы проверить, относится ли это к вашему случаю, выполните следующую команду: kubectl api-resources

Если вы получаете

error: unable to retrieve the complete list of server APIs: metrics.k8s.io/v1beta1: the server is currently unable to handle the request

Тогда его, вероятно, та же проблема

Кредиты идут на @javierprovecho здесь

Я написал однострочный скрипт Python3 на основе общих ответов здесь. Этот скрипт удаляетfinalizers в проблемном пространстве имен.

python3 -c "namespace='<my-namespace>';import atexit,subprocess,json,requests,sys;proxy_process = subprocess.Popen(['kubectl', 'proxy']);atexit.register(proxy_process.kill);p = subprocess.Popen(['kubectl', 'get', 'namespace', namespace, '-o', 'json'], stdout=subprocess.PIPE);p.wait();data = json.load(p.stdout);data['spec']['finalizers'] = [];requests.put('http://127.0.0.1:8001/api/v1/namespaces/{}/finalize'.format(namespace), json=data).raise_for_status()"

переименовать namespace='<my-namespace>'с вашим пространством имен. напримерnamespace='trust'


Полный сценарий: https://gist.github.com/jossef/a563f8651ec52ad03a243dec539b333d

Я пишу простой скрипт для удаления застрявшего пространства имен на основе решения @Shreyangi Saxena.

cat > delete_stuck_ns.sh << "EOF"
#!/usr/bin/env bash

function delete_namespace () {
    echo "Deleting namespace $1"
    kubectl get namespace $1 -o json > tmp.json
    sed -i 's/"kubernetes"//g' tmp.json
    kubectl replace --raw "/api/v1/namespaces/$1/finalize" -f ./tmp.json
    rm ./tmp.json
}

TERMINATING_NS=$(kubectl get ns | awk '$2=="Terminating" {print $1}')

for ns in $TERMINATING_NS
do
    delete_namespace $ns
done
EOF

chmod +x delete_stuck_ns.sh

Этот сценарий может обнаруживать все пространства имен в Terminating состояние и удалите его.


PS:

  • Это может не работать в MacOS, потому что родной sed в macos не совместим с GNU sed.

    вам может потребоваться установить GNU sed в MacOS, см. этот ответ.

  • Подтвердите, что вы можете получить доступ к своему кластеру Kubernetes с помощью команды kubectl.

  • Протестировано на версии Kubernetes v1.15.3

вот (еще одно) решение. Это используетjqдля удаления блока финализаторов из json и не требуетkubectl proxy:

      namespaceToDelete=blah

kubectl get namespace "$namespaceToDelete" -o json \
  | jq 'del(.spec.finalizers)' \
  | kubectl replace --raw /api/v1/namespaces/$namespaceToDelete/finalize -f -

Пробег kubectl get apiservice

Для приведенной выше команды вы найдете apiservice с Available Flag=Flase.

Итак, просто удалите этот apiservice, используя kubectl delete apiservice <apiservice name>

После этого пространство имен со статусом завершения исчезнет.

Forcefully deleting the namespace or removing finalizers is definitely not the way to go since it could leave resources registered to a non existing namespace.

This is often fine but then one day you won't be able to create a resource because it is still dangling somewhere.

Предстоящая версия Kubernetes 1.16 должна дать больше информации о финализаторах пространств имен, пока я бы полагался на стратегии идентификации. Классный скрипт, который пытается автоматизировать это: https://github.com/thyarles/knsk

Однако он работает во всех пространствах имен и может быть опасен. Решение, на котором оно основано: https://github.com/kubernetes/kubernetes/issues/60807#issuecomment-524772920

tl; dr

  1. Проверка того, недоступен ли какой-либо apiservice и, следовательно, не обслуживает его ресурсы: kubectl get apiservice|grep False
  2. Поиск всех ресурсов, которые еще существуют, через kubectl api-resources --verbs=list --namespaced -o name | xargs -n 1 kubectl get -n $your-ns-to-delete

(кредит: https://github.com/kubernetes/kubernetes/issues/60807#issuecomment-524772920)

1. Использование команды Curl

Упомянутая проблема: https://amalgjose.com/2021/07/28/how-to-manually-delete-a-kubernetes-namespace-stuck-in-terminating-state/

      export NAMESPACE=<specifice-namespace>
kubectl get namespace $NAMESPACE -o json > tempfile.json

Отредактируйте файл JSON и удалите все значения из spec.finalizers.

Сохраните его, а затем примените эту команду на отдельной вкладке (должна быть открыта на отдельной вкладке)

      kubectl proxy

И запустите эту команду на той же вкладке:

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

Проверьте пространство имен, если конечное пространство имен удалено или нет


2. Использование команды Kubectl

Упомянутая проблема: https://aws.amazon.com/premiumsupport/knowledge-center/eks-terminated-namespaces/

  1. Сохраните файл JSON, подобный следующему:
      export NAMESPACE=<specific-namespace>
kubectl get namespace $NAMESPACE -o json > tempfile.json
  1. Отредактируйте файл JSON и удалите все значения из spec.finalizers.
  2. Чтобы применить изменения, выполните команду, аналогичную следующей:
      kubectl replace --raw "/api/v1/namespaces/$NAMESPACE/finalize" -f ./tempfile.json
  1. Убедитесь, что завершающее пространство имен удалено:
      kubectl get namespaces

Попробуйте выполнить следующую команду: kubectl patch ns <name_space> -p '{"metadata":{"finalizers":null}}'

В моем случае проблема была вызвана специальными показателями.

Чтобы узнать, что вызывает боли, просто запустите:

kubectl api-resources

Это должно дать вам сведения о том, какие ресурсы api вызывают проблему, после обнаружения просто удалите их.

kubectl delete apiservice v1beta1.custom.metrics.k8s.io

После удаления пространство имен должно исчезнуть

Пробовал 3-5 вариантов удаления ns, но у меня работает только этот.

Этот файл sh удалит все пространства имен со статусом «Завершение».

$ vi force-delete-namespaces.sh

$ chmod +x force-delete-namespaces.sh

$ ./force-delete-namespaces.sh

      #!/usr/bin/env bash

set -e
set -o pipefail

kubectl proxy &
proxy_pid="$!"
trap 'kill "$proxy_pid"' EXIT

for ns in $(kubectl get namespace --field-selector=status.phase=Terminating --output=jsonpath="{.items[*].metadata.name}"); do
    echo "Removing finalizers from namespace '$ns'..."
    curl -H "Content-Type: application/json" -X PUT "127.0.0.1:8001/api/v1/namespaces/$ns/finalize" -d @- \
        < <(kubectl get namespace "$ns" --output=json | jq '.spec = { "finalizers": [] }')

    echo
    echo "Force-deleting namespace '$ns'..."
    kubectl delete namespace "$ns" --force --grace-period=0 --ignore-not-found=true
done

Замените посла своим пространством имен

Проверьте, не застряло ли пространство имен

      kubectl get ns ambassador

NAME         STATUS        AGE
ambassador   Terminating   110d

Это застряло долгое время

Откройте административный терминал / командную строку или PowerShell и запустите

kubectl прокси

[введите описание изображения здесь][1] Будет запущен локальный веб-сервер

Начало обслуживания на 127.0.0.1:8001

Откройте другой терминал и запустите

      kubectl get ns ambassador -o json >tmp.json

отредактируйте tmp.json с помощью vi или nano

из этого

      {
"apiVersion": "v1",
"kind": "Namespace",
"metadata": {
    "annotations": {
        "kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"v1\",\"kind\":\"Namespace\",\"metadata\":{\"annotations\":{},\"name\":\"ambassador\"}}\n"
    },
    "creationTimestamp": "2021-01-07T18:23:28Z",
    "deletionTimestamp": "2021-04-28T06:43:41Z",
    "name": "ambassador",
    "resourceVersion": "14572382",
    "selfLink": "/api/v1/namespaces/ambassador",
    "uid": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
},
"spec": {
    "finalizers": [
        "kubernetes"
    ]
},
"status": {
    "conditions": [
        {
            "lastTransitionTime": "2021-04-28T06:43:46Z",
            "message": "Discovery failed for some groups, 3 failing: unable to retrieve the complete list of server APIs: compose.docker.com/v1alpha3: an error on the server (\"Internal Server Error: \\\"/apis/compose.docker.com/v1alpha3?timeout=32s\\\": Post https://0.0.0.1:443/apis/authorization.k8s.io/v1beta1/subjectaccessreviews: write tcp 0.0.0.0:53284-\u0026gt;0.0.0.0:443: write: broken pipe\") has prevented the request from succeeding, compose.docker.com/v1beta1: an error on the server (\"Internal Server Error: \\\"/apis/compose.docker.com/v1beta1?timeout=32s\\\": Post https://10.96.0.1:443/apis/authorization.k8s.io/v1beta1/subjectaccessreviews: write tcp 0.0.0.0:5284-\u0026gt;10.96.0.1:443: write: broken pipe\") has prevented the request from succeeding, compose.docker.com/v1beta2: an error on the server (\"Internal Server Error: \\\"/apis/compose.docker.com/v1beta2?timeout=32s\\\": Post https://0.0.0.0:443/apis/authorization.k8s.io/v1beta1/subjectaccessreviews: write tcp 1.1.1.1:2284-\u0026gt;0.0.0.0:443: write: broken pipe\") has prevented the request from succeeding",
            "reason": "DiscoveryFailed",
            "status": "True",
            "type": "NamespaceDeletionDiscoveryFailure"
        },
        {
            "lastTransitionTime": "2021-04-28T06:43:49Z",
            "message": "All legacy kube types successfully parsed",
            "reason": "ParsedGroupVersions",
            "status": "False",
            "type": "NamespaceDeletionGroupVersionParsingFailure"
        },
        {
            "lastTransitionTime": "2021-04-28T06:43:49Z",
            "message": "All content successfully deleted",
            "reason": "ContentDeleted",
            "status": "False",
            "type": "NamespaceDeletionContentFailure"
        }
    ],
    "phase": "Terminating"
}

}

к

          {
  "apiVersion": "v1",
  "kind": "Namespace",
  "metadata": {
    "annotations": {
      "kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"v1\",\"kind\":\"Namespace\",\"metadata\":{\"annotations\":{},\"name\":\"ambassador\"}}\n"
    },
    "creationTimestamp": "2021-01-07T18:23:28Z",
    "deletionTimestamp": "2021-04-28T06:43:41Z",
    "name": "ambassador",
    "resourceVersion": "14572382",
    "selfLink": "/api/v1/namespaces/ambassador",
    "uid": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
  },
  "spec": {
    "finalizers": []
  }
}

удалив статус и кубернеты внутри финализаторов

Теперь используйте команду и замените посла своим пространством имен

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

вы увидите другой json, как раньше, затем запустите

затем запустите команду

       kubectl get ns ambassador
Error from server (NotFound): namespaces "ambassador" not found

Если он по-прежнему говорит о завершении или какой-либо другой ошибке, убедитесь, что вы правильно отформатировали свой json, и повторите шаги еще раз.

  1. Выполните следующую команду, чтобы просмотреть пространства имен, которые застряли в состоянии завершения:

    kubectl получить пространства имен

  2. Выберите завершающее пространство имен и просмотрите содержимое пространства имен, чтобы найти финализатор. Выполните следующую команду:

    kubectl получить пространство имен -o yaml

  3. Ваше содержимое YAML может напоминать следующий вывод:

        apiVersion: v1
        kind: Namespace
        metadata:
           creationTimestamp: 2019-12-25T17:38:32Z
           deletionTimestamp: 2019-12-25T17:51:34Z
           name: <terminating-namespace>
           resourceVersion: "4779875"
           selfLink: /api/v1/namespaces/<terminating-namespace>
           uid: ******-****-****-****-fa1dfgerz5
         spec:
           finalizers:
           - kubernetes
         status:
           phase: Terminating
  1. Выполните следующую команду, чтобы создать временный файл JSON:

    kubectl получить пространство имен -o json >tmp.json

  2. Отредактируйте файл tmp.json. Удалите значение kubernetes из поля финализаторов и сохраните файл. Результат будет таким:

    {
        "apiVersion": "v1",
        "kind": "Namespace",
        "metadata": {
            "creationTimestamp": "2018-11-19T18:48:30Z",
            "deletionTimestamp": "2018-11-19T18:59:36Z",
            "name": "<terminating-namespace>",
            "resourceVersion": "1385077",
            "selfLink": "/api/v1/namespaces/<terminating-namespace>",
            "uid": "b50c9ea4-ec2b-11e8-a0be-fa163eeb47a5"
        },
        "spec": {
        },

        "status": {
            "phase": "Terminating"
        }
    }
  1. Чтобы установить временный IP-адрес и порт прокси-сервера, выполните следующую команду. Обязательно держите окно терминала открытым, пока не удалите застрявшее пространство имен:

    kubectl прокси

  2. IP-адрес и порт вашего прокси-сервера могут выглядеть следующим образом:

    Начало обслуживания на 127.0.0.1:8001

  3. В новом окне терминала выполните вызов API с вашим временным IP-адресом прокси и портом:

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

Ваш результат будет таким:

    {
       "kind": "Namespace",
       "apiVersion": "v1",
       "metadata": {
         "name": "<terminating-namespace>",
         "selfLink": "/api/v1/namespaces/<terminating-namespace>/finalize",
         "uid": "b50c9ea4-ec2b-11e8-a0be-fa163eeb47a5",
         "resourceVersion": "1602981",
         "creationTimestamp": "2018-11-19T18:48:30Z",
         "deletionTimestamp": "2018-11-19T18:59:36Z"
       },
       "spec": {

       },
       "status": {
         "phase": "Terminating"
       }
    }
  1. Параметр финализатора удален. Теперь убедитесь, что завершающее пространство имен удалено, выполните следующую команду:

    kubectl получить пространства имен

Есть несколько вещей, которые вы можете запустить. Но обычно это означает, что автоматическое удаление пространства имен не удалось завершить, и есть запущенный процесс, который необходимо удалить вручную. Чтобы найти это, вы можете сделать следующее:

Получите все статьи, прикрепленные к пространству имен. Если это ни к чему не привело, переходите к следующим предложениям

$ kubectl get all -n your-namespace

К некоторым пространствам имен прикреплены apiserivces, и их может быть сложно удалить. Это могут быть любые ресурсы, которые вам нужны. Затем вы удаляете этот ресурс, если он что-то находит

$ kubectl get apiservice|grep False

Но главный вывод заключается в том, что некоторые вещи могут быть удалены не полностью. Таким образом, вы можете увидеть, что у вас изначально было в этом пространстве имен, а затем увидеть, какие вещи разворачиваются в ваших YAML, чтобы увидеть процессы. Или вы можете начать гуглить, почему служба X не удаляется должным образом, и вы найдете что-то.

Обычно я сталкиваюсь с той же проблемой.

Вот что я делаю

      kubectl get ns your-namespace -o json > ns-without-finalizers.json

Отредактируйте ns-without-finalizers.json. заменить все финализаторы пустым массивом.

Запустите прокси kubectl (обычно запускайте его на другом терминале)

Затем сверните эту команду

      curl -X PUT http://localhost:8001/api/v1/namespaces/your-namespace/finalize -H "Content-Type: application/json" --data @ns-without-finalizers.json

Единственный способ, который я нашел, чтобы удалить "terminating"namespace - это удаление записи в разделе" финализаторы ". Я пытался --force удалить его и --grace-period=0 ни один из них не работал, однако, этот метод сделал:

в командной строке выведите информацию из пространства имен:

$ kubectl get namespace your-rogue-namespace -o yaml

Это даст вам вывод yaml, найдите строку, которая выглядит примерно так:

deletionTimestamp: 2018-09-17T13:00:10Z
  finalizers:
  - Whatever content it might be here...
  labels:

Затем просто отредактируйте конфигурацию пространства имен и удалите элементы внутри этого контейнера финализаторов.

$ kubectl edit namespace your-rogue-namespace

Это откроет редактор (в моем случае VI), перешел строку, которую я хотел удалить, и удалил ее, я дважды нажал клавишу D, чтобы удалить всю строку.

Сохраните его, выйдите из редактора и наслаждайтесь магией. Пространство имен-изгоев должно исчезнуть.

И чтобы подтвердить это просто:

$ kubectl get namespace your-rogue-namespace -o yaml

Если пространство имен застряло в состоянии Завершение, в то время как ресурсы в этом пространстве имен уже были удалены, вы можете исправить finalizers пространства имен перед его удалением:

kubectl patch ns ns_to_be_deleted -p '{"metadata":{"finalizers":null}}';

тогда

kubectl delete ns ns_to_be_deleted;

Для тех, кто ищет несколько команд для более поздней версии Kubernetes, это помогло мне.

      NAMESPACE=mynamespace
kubectl get namespace $NAMESPACE -o json | sed 's/"kubernetes"//' | kubectl replace --raw "/api/v1/namespaces/$NAMESPACE/finalize" -f -

Протестировано вKubernetes v1.24.1

Устранение аналогичной проблемы.

Следует учитывать две важные вещи:

1) Подумайте дважды, прежде чем удалять из вашего пространства имен, потому что могут быть ресурсы, которые вы не хотите автоматически удалять или, по крайней мере, понять, что было удалено для устранения неполадок.

2) Команды вроде kubectl api-resources --verbs=list может не предоставить вам ресурсы, которые были созданы внешними CRD.


В моем случае:

Я просмотрел реальное состояние своего пространства имен (которое застряло на Terminating) с участием kubectl edit ns <ns-name> и под status -> conditions Я видел, что некоторые внешние CRD, которые я установил, не удалось удалить, потому что они добавляют finalizers определенный:

       - lastTransitionTime: "2021-06-14T11:14:47Z"
    message: 'Some content in the namespace has finalizers remaining: finalizer.stackinstall.crossplane.io
      in 1 resource instances, finalizer.stacks.crossplane.io in 1 resource instances'
    reason: SomeFinalizersRemain
    status: "True"
    type: NamespaceFinalizersRemaining

Завершение и без того отличного ответа nobar. Если вы развернули свой кластер с помощью Rancher, есть предостережение.

Развертывания Rancher изменяют КАЖДЫЙ вызов API, добавляя /k8s/clusters/c-XXXXX/ к URL-адресам.

Идентификатор кластера на ранчо (c-XXXXX) - это то, что вы можете легко получить из пользовательского интерфейса Rancher, так как оно будет там в URL-адресе.

Итак, после того, как вы получите этот идентификатор кластера c-xxxx, просто сделайте, как говорит nobar, просто измените вызов api, включая этот бит ранчера.

(
NAMESPACE=your-rogue-namespace
kubectl proxy &
kubectl get namespace $NAMESPACE -o json |jq '.spec = {"finalizers":[]}' >temp.json
curl -k -H "Content-Type: application/json" \
  -X PUT --data-binary @temp.json \
  127.0.0.1:8001/k8s/clusters/c-XXXXX/api/v1/namespaces/$NAMESPACE/finalize
)
      kubectl edit namespace ${stucked_namespace}

Затем удалите finlizers в режиме vi и сохраните.

В моем случае это сработало.

Что-то похожее случилось со мной в моем случае, это были pv & pvc, которые я принудительно удалил, установив для финализаторов значение null. Проверьте, можете ли вы сделать то же самое с ns

kubectl patch pvc <pvc-name> -p '{"metadata":{"finalizers":null}}'

Для пространств имен это будет

kubectl patch ns <ns-name> -p '{"spec":{"finalizers":null}}'
curl -k -H "Content-Type: application/json" -X PUT --data-binary @tmp.json 127.0.0.1:8001/k8s/clusters/c-mzplp/api/v1/namespaces/rook-ceph/finalize

Это сработало для меня, пространство имен исчезло.

Подробное объяснение можно найти по ссылке https://github.com/rook/rook/blob/master/Documentation/ceph-teardown.md.

Это произошло, когда я прервал установку кубернетов (Armory Minnaker). Затем я удалил пространство имен и переустановил его. Я застрял с модулем в статусе завершения из-за финализаторов. Я получил пространство имен в tmp.json, удалил финализаторы из файла tmp.json и выполнил команду curl. Как только я справился с этой проблемой, я использовал сценарии для удаления кластера, чтобы удалить остатки, и выполнил переустановку.

Моя попытка со сценариемkubectlверсияv1.26.3иjq:

удалить_finalizers.sh

      #!/usr/bin/bash

set -x

function rmfin() {
  for e in $(kubectl get $1 -o name); do
    kubectl get $e -o json | jq '.metadata.finalizers = []' | kubectl replace $e -f -
  done
}

rmfin $*

Исполнение

      $ sh remove_finalizers ns
Другие вопросы по тегам