Hapus Paksa Namespace di Kubernetes


Apakah Anda memiliki namespace di cluster Kubernetes Anda yang macet dalam status “Terminating”? Ketika sebuah namespace macet dalam status ini, biasanya berarti Kubernetes tidak berhasil membersihkan sumber daya di namespace tersebut. Alasan utamanya adalah finalizer atau sumber daya tidak dibersihkan dengan benar atau macet. Lihat contohnya di bawah ini:

$  kubectl get ns
NAME               STATUS        AGE
calico-apiserver   Active        4d13h
calico-system      Active        4d13h
default            Active        4d13h
kube-node-lease    Active        4d13h
kube-public        Active        4d13h
kube-system        Active        4d13h
longhorn-system    Terminating   18m
tigera-operator    Active        4d13h

Saya dapat mengonfirmasi bahwa pod dan sumber daya lainnya telah dihapus, tetapi status tetap "Terminating". Mari kita pertimbangkan beberapa cara untuk memaksa menghapus namespace ini di Kubernetes.

Atur nama namespace yang macet di variabel NS.

NS=longhorn-system

Sebelum memaksa penghapusan namespace, periksa apakah ada sumber daya yang tertunda yang mungkin menyebabkan masalah:

kubectl get all --namespace=$NS

1. Batalkan finalizer secara manual

Jika sebuah namespace memiliki finalizer yang tidak dihapus dengan benar, namespace tersebut bisa terjebak dalam status “terminating”. Anda dapat mengedit file yaml objek namespace:

kubectl edit namespace $NS

Di editor, temukan field finalizers dan hapus dengan cara mengaturnya seperti berikut:

finalizers: []

2. Paksa Hapus Menggunakan kubectl

Jika opsi pertama tidak berhasil, Anda dapat memaksa penghapusan namespace dengan melakukan patch.

Paksa penghapusan namespace yang macet di Kubernetes.

kubectl get $NS  -o json | jq '.spec.finalizers=[]' | kubectl replace --raw "/api/v1/ $NS/longhorn-system/finalize" -f -

Catatan: jq harus diinstal agar Anda dapat memodifikasi output JSON. Harap diketahui bahwa metode ini melewati finalizer.

3. Paksa hapus namespace

Flag --grace-period=0 dan --force dapat digunakan untuk memaksa penghapusan namespace di Kubernetes. Namun, metode ini mungkin meninggalkan sumber daya yatim dan sebaiknya digunakan dengan hati-hati:

kubectl delete namespace $NS --grace-period=0 --force

Anda dapat memastikan apakah namespace telah dihapus dengan menjalankan perintah berikut:

kubectl get $NS

Output di bawah menunjukkan bahwa itu tidak ada:

error: the server doesn't have a resource type "longhorn-system"