Пространство имен "застряло" как Завершение, Как я удалил его
У меня было "застрявшее" пространство имен, которое я удалил, показывая в этом вечном "завершающем" состоянии.
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 proxy
process и избегайте зависимости от 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
kubectl получить пространство имен раздражающее пространство имен для удаления -o json > tmp.json
затем редактировать
tmp.json
и удалите "кубернеты"Откройте другой терминал и запустите
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 не совместим с GNUsed
.вам может потребоваться установить 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
- Проверка того, недоступен ли какой-либо apiservice и, следовательно, не обслуживает его ресурсы:
kubectl get apiservice|grep False
- Поиск всех ресурсов, которые еще существуют, через
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/
- Сохраните файл JSON, подобный следующему:
export NAMESPACE=<specific-namespace>
kubectl get namespace $NAMESPACE -o json > tempfile.json
- Отредактируйте файл JSON и удалите все значения из spec.finalizers.
- Чтобы применить изменения, выполните команду, аналогичную следующей:
kubectl replace --raw "/api/v1/namespaces/$NAMESPACE/finalize" -f ./tempfile.json
- Убедитесь, что завершающее пространство имен удалено:
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, и повторите шаги еще раз.
Выполните следующую команду, чтобы просмотреть пространства имен, которые застряли в состоянии завершения:
kubectl получить пространства имен
Выберите завершающее пространство имен и просмотрите содержимое пространства имен, чтобы найти финализатор. Выполните следующую команду:
kubectl получить пространство имен -o yaml
Ваше содержимое 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
Выполните следующую команду, чтобы создать временный файл JSON:
kubectl получить пространство имен -o json >tmp.json
Отредактируйте файл 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"
}
}
Чтобы установить временный IP-адрес и порт прокси-сервера, выполните следующую команду. Обязательно держите окно терминала открытым, пока не удалите застрявшее пространство имен:
kubectl прокси
IP-адрес и порт вашего прокси-сервера могут выглядеть следующим образом:
Начало обслуживания на 127.0.0.1:8001
В новом окне терминала выполните вызов 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"
}
}
Параметр финализатора удален. Теперь убедитесь, что завершающее пространство имен удалено, выполните следующую команду:
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