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
https://github.com/kubernetes/kubernetes/issues/60807
TAGs:AKS, aws, azure, ECS, Kubernetes, Namespace, Terminating