Xóa Bắt buộc Namespace trong Kubernetes
Bạn có namespace trong cụm Kubernetes của mình bị kẹt ở trạng thái “Terminating” không? Khi một namespace bị kẹt ở trạng thái này, thường có nghĩa là Kubernetes chưa thành công trong việc dọn dẹp các tài nguyên trong namespace đó. Nguyên nhân chính là các finalizer hoặc tài nguyên không được dọn dẹp đúng cách hoặc bị kẹt. Xem ví dụ dưới đây:
$ 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 4d13hTôi có thể xác nhận rằng các pod và tài nguyên khác đã bị xóa nhưng trạng thái vẫn là “Terminating”. Hãy cùng xem xét một vài cách để chúng ta có thể buộc xóa namespace này trong Kubernetes.
Đặt tên không gian bị kẹt trong biến NS.
NS=longhorn-systemTrước khi buộc xoá không gian tên, hãy kiểm tra xem có tài nguyên nào đang chờ xử lý có thể gây ra sự cố không:
kubectl get all --namespace=$NS1. Hủy thiết lập các bộ kết thúc (finalizer) một cách thủ công
Nếu một namespace có các finalizer không được gỡ bỏ đúng cách, nó có thể bị kẹt ở trạng thái "terminating". Bạn có thể chỉnh sửa tệp yaml của đối tượng namespace:
kubectl edit namespace $NSTrong trình soạn thảo, tìm trường finalizers và xóa bằng cách thiết lập như dưới đây:
finalizers: []2. Xóa cưỡng bức bằng kubectl
Nếu tùy chọn đầu tiên không thành công, bạn có thể buộc xóa namespace bằng cách vá nó.
Ép xóa namespace bị kẹt trong Kubernetes.
kubectl get $NS -o json | jq '.spec.finalizers=[]' | kubectl replace --raw "/api/v1/ $NS/longhorn-system/finalize" -f -Lưu ý: jq cần được cài đặt để bạn có thể chỉnh sửa dữ liệu JSON đầu ra. Hãy lưu ý rằng phương pháp này sẽ bỏ qua các phần kết thúc (finalizers).
3. Xóa namespace một cách cưỡng bức
Các cờ --grace-period=0 và --force có thể được sử dụng để buộc xóa namespace trong Kubernetes. Tuy nhiên, phương pháp này có thể để lại các tài nguyên mồ côi và nên được sử dụng cẩn thận:
kubectl delete namespace $NS --grace-period=0 --forceBạn có thể xác nhận xem namespace đã bị xóa hay chưa bằng cách chạy lệnh sau:
kubectl get $NSĐầu ra dưới đây cho thấy nó không tồn tại:
error: the server doesn't have a resource type "longhorn-system"