Kubernetes Namespace Terminating Problemi
  1. Anasayfa
  2. Container

Kubernetes Namespace Terminating Problemi

0

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

 

 

Bu İçeriğe Tepkin Ne Oldu?
  • 6
    harika_
    Harika!!
  • 0
    be_enmedim
    Beğenmedim
  • 1
    _ok_iyi
    Çok iyi
  • 0
    sevdim_
    Sevdim!
  • 0
    bilemedim_
    Bilemedim!
  • 0
    olmad_
    Olmadı!
  • 0
    k_zd_m_
    Kızdım!

1984 Aydın doğumluyum, Lise eğitimi Aydın Anadolu Lisesi, Üniversite eğitimi Burslu olarak Girne Amerikan Üniversitesi Bilgisayar Mühendisliği ve Yüksek Lisans içinde Beykent Üniversitesi Yüksek Bilgisayar Mühendisliği Bölümlerini bitirdikten sonra 2009 yılında profesyonel iş hayatıma başladım. Yazılım Mühendisi olarak başladığım meslek hayatımın içerisinde bir çok kurumsal firmada çalışma fırsatı buldum. Şuan Migros bünyesinde Yazılım ve DevOps Mimari olarak görev yapmaktayım. OpenSource, DevOps ve Container yakından ilgi duyduğum teknolojilerdir.

Yazarın Profili
İlginizi Çekebilir

Bültenimize Katılın

Tıklayın, üyemiz olun ve yeni güncellemelerden haberdar olan ilk kişi siz olun.

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir