Kubernetes: namespace висит в Terminating и неразбериха с metrics-server

Thank you for reading this post, don't forget to subscribe!

Столк­нул­ся с весь­ма инте­рес­ной про­бле­мой при уда­ле­нии Kubernetes Namespace.

При попыт­ке уда­лить нейм­с­пейс — он зави­са­ет в ста­ту­се Terminating, и ника­кие попыт­ки его уда­лить не помогали.

Созда­ём тесто­вый namespace:

kubectl create namespace test-ns
namespace/test-ns created
Про­бу­ем его уда­лить — и уда­ле­ние зависает:
kubectl delete namespace test-ns
namespace "test-ns" deleted
Про­ве­ря­ем — висит в Terminating:

При этом в логах API-сер­ве­ра ника­ких оши­бок тол­ком нет.

Попыт­ки уда­ле­ния Namespace
--force и --grace-period
Может, там какие-то ресур­сы, уда­ле­ния кото­рых ждёт Kubernetes? Проверяем:

kubectl -n test-ns get all
No resources found.

Нет, ниче­го.

Да и уда­ле­ние с --force и --grace-period=0 не помогает:

kubectl delete namespace test-ns --force --grace-period=0

Нейм­с­пейс всё ещё на месте, всё в том же ста­ту­се Terminating.

Очист­ка finalizers
Гуг­лим, 99% резуль­та­тов сове­ту­ют уда­лить kubernetes из finalizers — редак­ти­ру­ем неймспейс:

kubectl edit ns test-ns
И удаляем:

Сохра­ня­ем — и ниче­го не меня­ет­ся. Нейм­с­пейс в том же состо­я­нии, а finalizers=kubernetes воз­вра­ща­ет­ся обратно.

APIs: custom.metrics.k8s.io/v1beta1: the server is currently unable to handle the request
Даль­ше — интереснее.

Если выпол­нить kubectl api-resources, то полу­чим ошиб­ку с custom.metrics.k8s.io:

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

Это и натолк­ну­ло на направ­ле­ние даль­ней­ше­го копа­ния — что-то не так с metrics-server.

Вер­сия metrics-server?
Пер­вая мысль — у нас ста­рая его вер­сия, и он не рабо­та­ет, в нашей авто­ма­ти­за­ции до сих пор 0.3.6:

grep -r metrics-server ../roles/controllers/ | grep github
../roles/controllers/tasks/main.yml:  command: "kubectl --kubeconfig={{ kube_config_path }} apply -f https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.3.6/components.yaml"

Пере­уста­нав­ли­ва­ем вер­сию 0.4.2, последнюю:

kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.4.2/components.yaml

Не помо­га­ет.

Аргу­мен­ты metrics-server?
Может, про­бле­ма с под­клю­че­ни­ем к metrics-server?

Про­бу­ем изме­нить --kubelet-insecure-tls, --kubelet-preferred-address-types=InternalIP и даже hostNetwork=true, выгля­де­ло как-то так:

Не помо­га­ет.

При этом kubectl top работает:

 

Зна­чит, Kubernetes мет­ри­ки получает.

Зна­чит — с metrcis-server всё в поряд­ке? Кон­нек­ты есть, дан­ные к нему и от него проходят?

Kubernetes apiservices

Вер­нём­ся к ошибке:

custom.metrics.k8s.io/v1beta1: the server is currently unable to handle the request

Про­ве­ря­ем сам apiservice v1beta1.custom.metrics.k8s.io:

Ага, вот эти ребята:

monitoring/prometheus-adapter False (ServiceNotFound)

Он дол­жен обра­щать­ся к сер­ви­су monitoring/prometheus-adapter — про­ве­ря­ем его наличие:

А prometheus-adapter-то и нету.

Соот­вет­ствен­но, и не рабо­та­ет енд­по­инт custom.metrics.k8s.io.

Уста­нав­ли­ва­ем адаптер:

helm -n monitoring install prometheus-adapter stable/prometheus-adapter

Про­ве­ря­ем ещё раз сервисы:


И apiservices:

И наш неймспейс:

И через минуту: