1. 程式人生 > 其它 >k8s強制刪除po&pv&pvc和ns&namespace方法

k8s強制刪除po&pv&pvc和ns&namespace方法

目錄

注意:以下操作方法十分危險,三思而行!!!

如果名稱空間、pod、pv、pvc全部處於“Terminating”狀態時,此時的該名稱空間下的所有控制器都已經被刪除了,之所以出現pod、pvc、pv、ns無法刪除,那是因為kubelet 阻塞,有其他的資源在使用該namespace,比如CRD等,嘗試重啟kubelet,再刪除該namespace 也不好使。

正確的刪除方法:刪除pod--> 刪除pvc ---> 刪除pv --> 刪除名稱空間

一、強制刪除pod

$ kubectl delete pod <your-pod-name> -n <name-space> --force --grace-period=0

解決方法:加引數 --force --grace-period=0,grace-period表示過渡存活期,預設30s,在刪除POD之前允許POD慢慢終止其上的容器程序,從而優雅退出,0表示立即終止POD

二、強制刪除pv、pvc

$ kubectl patch pv xxx -p '{"metadata":{"finalizers":null}}'
$ kubectl patch pvc xxx -p '{"metadata":{"finalizers":null}}'

直接刪除k8s etcd資料庫中的記錄!

三、強制刪除ns

在嘗試以下命令強制刪除也不好使:

$ kubectl delete ns <terminating-namespace> --force --grace-period=0

解決方法:

1)執行以下命令以檢視處於“Terminating”狀態的namespace:

$ kubectl get namespaces

2)選擇一個Terminating namespace,並檢視namespace 中的finalizer。執行以下命令:

$ kubectl get namespace <terminating-namespace> -o yaml

輸出資訊如下:

apiVersion: v1
kind: Namespace
metadata:
  creationTimestamp: "2019-11-20T15:18:06Z"
  deletionTimestamp: "2020-01-16T02:50:02Z"
  name: <terminating-namespace>
  resourceVersion: "3249493"
  selfLink: /api/v1/namespaces/knative-eventing
  uid: f300ea38-c8c2-4653-b432-b66103e412db
spec:
  finalizers:
  - kubernetes
status:

3)匯出json格式到檔案

$ kubectl get namespace <terminating-namespace> -o json >tmp.json

4)編輯tmp.josn,刪除finalizers 欄位的值

{
  "apiVersion": "v1",
  "kind": "Namespace",
  "metadata": {
    "creationTimestamp": "2019-11-20T15:18:06Z",
    "deletionTimestamp": "2020-01-16T02:50:02Z",
    "name": "<terminating-namespace>",
    "resourceVersion": "3249493",
    "selfLink": "/api/v1/namespaces/knative-eventing",
    "uid": "f300ea38-c8c2-4653-b432-b66103e412db"
  },
  "spec": {
    "finalizers": []
  },
  "status": {
    "phase": "Terminating"
  }
}

5)開啟proxy

$ kubectl proxy

執行該命令後,當前終端會被卡住
6)開啟新的終端,執行以下命令

$ curl -k -H "Content-Type: application/json" -X PUT --data-binary @tmp.json http://127.0.0.1:8001/api/v1/namespaces/<terminating-namespace>/finalize

輸出資訊如下:

{
  "kind": "Namespace",
  "apiVersion": "v1",
  "metadata": {
    "name": "istio-system",
    "selfLink": "/api/v1/namespaces/istio-system/finalize",
    "uid": "2e274537-727f-4a8f-ae8c-397473ed619a",
    "resourceVersion": "3249492",
    "creationTimestamp": "2019-11-20T15:18:06Z",
    "deletionTimestamp": "2020-01-16T02:50:02Z"
  },
  "spec": {
    
  },
  "status": {
    "phase": "Terminating"
  }
}

7)確認處於Terminating 狀態的namespace已經被刪除

$ kubectl get namespaces

如果還有處於Terminating 狀態的namespace,重複以上操作,刪除即可!

我有夢,有遠方,我會為了它們奔跑,奮鬥,直到成為連我自己都佩服的人。