Kubernetes Namespace Terminating Problemi

on

Hayatımızın önemli ve mikroservis mimarisinin değişilmez noktası haline gelen orchestration platformları ile bir çoğumuz içli dışlıyız. Konu başlığından anlayabileceğiniz gibi; namespace terminating problemi, kubernetes ile deep dive uğraşanların bir çoğunun karşılaştığı veya karşılaşabileceği bir problemdir.

Namespace , kubernetes cluster kaynakları içerisinde bir depolama alanıdır.Benim yorumum ise namespace ; kubernetes içerisinde fiziksel kaynak tarafından desteklenen sanal bir alan veya alanlar topluluğunun ismidir. Kubernetes ‘te, birbirinden bağımsız servisleri etkisine göre ayrı namespaceler de, birbiri ile ilişkili servisleride aynı namespacelerde konumlandırabilirsiniz. Bir namespace  pods, services, replication controllers, etc.. gibi katmanlardan oluşur.

Resim-1

Namespace çalışma yapısı ile ilgili örnek bir mimariyi yukarıda paylaştım. Namespace direk silindiği zaman çeşitli nedenlerleden terminating durumunda askıda kalabilir. Azure ve AWS gibi bulut hizmeti sağlayan ortamlardaki AKS, EKS gibi servislerde sıklıkla karşılaşılan bir durumdur. Runtime ortamlarda problem ortaya çıktığı zaman, ortamı komple silen ve yeniden oluşturarak uygulamarı taşıyanla da karşılaştım, kritik bir ortam ise hemen case açarak supporttan destek almak isteyenle de karılaştım.

Çözüm aslında çok basit ve daha derinlerde bir problem yok ise korkulacak bir etki göstermemektedir.

1- Öncelikle problem yaşadığınız ortamda terminating statüsündeki namespace ‘i görüntülemek için aşağıdaki komutu çalıştıralım.

 kubectl get namespaces

Örnek:

Resim-2

2- Terminating statüsünde kalan namespace’ in adını aşağıda gösterilen yere yazarak komutu çalıştıralım.

 kubectl get namespace "terminating-namespace" -o yaml

Komutun çıktısı:

 apiVersion: v1
 kind: Namespace
 metadata:
   creationTimestamp: 2020-05-19T18:48:30Z
   deletionTimestamp: 2020-05-19T18:59:36Z
   name: "terminating-namespace"
   resourceVersion: "1585088"
   selfLink: /api/v1/namespaces/"terminating-namespace"
   uid: ****-ec2b-11e8-a0be-**********
 spec:
   finalizers:
   - kubernetes
 status:
   phase: Terminating

3- Yukarıdaki çıktıyı json formatına aktarıp üzerinde değişiklik yapabilmek için yine namespace ismini ilgili alana girerek aşağıdaki komutu çalıştıralım.

 kubectl get namespace <terminating-namespace> -o json > terminating.json

4- Yukarıdaki komut ile bilgisayarınıza json formatında kaydettiğiniz dosyayı düzenleyin ve “finalizers” altındaki “- kubernetes” kısmını siliniz.

Düzenlediğiniz terminating.json aşağıdaki şekilde olmalıdır :

  {
      "apiVersion": "v1",
      "kind": "Namespace",
      "metadata": {
          "creationTimestamp": "2020-05-19T18:48:30Z",
          "deletionTimestamp": "2020-05-19T18:59:36Z",
          "name": "terminating-namespace",
          "resourceVersion": "1585088",
          "selfLink": "/api/v1/namespaces/terminating-namespace",
          "uid": "*****-ec2b-11e8-a0be-********"
      },
      "spec": {
         "finalizers": 
      },
      "status": {
          "phase": "Terminating"
      }
  }

5- Geçici bir proxy ip ‘si ile kubernetes api üzerinden yapacağımız işlem için aşağıdaki komutu çalıştıralım.

 kubectl proxy

Komutun çıktısı:

 Starting to serve on 127.0.0.1:8001

6-  Yukarıdaki komutu çalıştırdığımız terminali açık tutarak yeni bir terminal daha açalım ve aşağıdaki komutu eksiksiz bir şekilde çalıştıralım.

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

Komutun çıktısı:

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

   },
   "status": {
     "phase": "Terminating"
   }
}

7-  Son olarak aşağıdaki komutu çalıştırarak terminating statüde olan namespace ‘in silindiğini göreceksiniz.

 kubectl get namespaces

Yukarıdaki süreçlerin tamamını daha kısa bir şekilde otomatize etmeniz açısından daha önce hazırlanan aşağıdaki scriptide sizlerle paylaşıyorum.

#!/bin/bash
#Can Alptekin / Software and DevOps Architect
terminating_namespace=$1
kubectl get namespaces -o json | grep "${terminating_namespace}"
kubectl get namespace ${terminating_namespace} -o json > terminating.json
wait 3
vi terminating.json
curl -H "Content-Type: application/json" -X PUT --data-binary @terminating.json http://127.0.0.1:8080/api/v1/namespaces/${terminating_namespace}/finalize
wait 12
kubectl get namespaces
echo "...done."

Bu konuyla ilgili sorularınızı  alt kısımda bulunan yorumlar alanını kullanarak sorabilirsiniz.

Referanslar        

www.mshowto.org

https://github.com/kubernetes/kubernetes/issues/60807

TAGs:AKS, aws, azure, ECS, Kubernetes, Namespace, Terminating

 

 

Yazı gezinmesi

Mobil sürümden çık