Tìm kiếm trang web

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        4d13h

Tô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-system

Trướ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=$NS

1. 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 $NS

Trong 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 --force

Bạ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"