4種 Kubernetes 命名空間永遠不要觸碰!

語言: CN / TW / HK

Kubernetes 隨帶許多( N amespace ) 命名空間。 一些 命名空間很重要,事關你的Kubernetes使用是否正常!

搞壞其中一個命名空間即會損壞Kubernetes系統。

這些命名空間包括如下:

  • default:默認的命名空間。

  • kube-system:系統為對象創建的命名空間。

  • kube-public:該命名空間是自動創建的,所有用户(包括未驗證身份的用户) 都可以讀取。該命名空間主要留給集羣使用,以防某些資源在整個集羣中應該可見、公開可讀。這對於提供引導組件所需的集羣信息都很有用。它主要由Kubernetes本身來管理。

  • kube-node-lease:該命名空間含有與每個節點關聯的Lease對象。節點租用允許kubelet發送heartbeat(心跳),以便控制平面能檢測節點故障。

即使您不小心刪除了Kubernetes系統的所有命名空間,它們也會再度重新生成。這是Kubernetes組件竭力所要做到的。

但有時如果您不走運,刪除命名空間在終止階段卡住,那就沒有辦法再度重新生成命名空間了。

所以下面提到了每個命名空間的重要性,以便知道相應的症狀是什麼樣子。

default是什麼命名空間?

default命名空間用作您在未指定命名空間的情況下,創建的任何對象的默認位置。

kube-system是什麼命名空間?

kube-system是Kubernetes中擁有高級權限的對象和服務帳户的命名空間。

Kubernetes控制器的使用源於該命名空間;換句話説,我們會在控制器方面遇到一些問題,在部署新的pods/deployment時可能會出現問題。

不僅如此,該命名空間還包含其他的重要對象,比如kube-dns和kube-proxy,kube-dns是集羣域(cluster.local)的權威命名服務器,它遞歸解析外部名稱。不完全限定的短名稱(比如myservice)先使用本地搜索路徑來完成。

可以在此處

(https://cloud.google.com/kubernetes-engine/docs/how-to/kube-dns)

和此處

(https://www.digitalocean.com/community/tutorials/an-introduction-to-the-kubernetes-dns-service)

找到更多的詳細信息。

kube-proxy管理這項工作:將發送到集羣Kubernetes服務對象的虛擬IP地址,(VIP)的流量轉發到適當的後端pod;想了解更多的詳細信息,請點擊此處(https://www.tigera.io/blog/comparing-kube-proxy-modes-iptables-or-ipvs/)和此處(https://arthurchiao.art/blog/cracking-k8s-node-proxy/)。

這意味着您在解析外部/內部通信時會遇到困難。

kube-public是什麼命名空間?

kube-public含有一個單一的ConfigMap對象cluster-info,它有助於發現和安全引導。

如果您試圖刪除所有上述命名空間,服務器會給出如下響應:

Errorfrom server (Forbidden): namespaces "kube-public"is forbidden:thisnamespace may not be deleted

預計Kubernetes v1.14中添加的kube-node-lease會像任何普通的命名空間一樣被刪除。

kube-node-lease是什麼命名空間?

kube-node-lease這個命名空間含有與每個節點關聯的Lease對象。節點lease允許kubelet發送heartbeat(心跳),以便控制平面(節點控制器)可以檢測節點故障。

那麼,如果我們刪除了kube-node-lease,會發生什麼?Kubernetes通常會為每個節點創建另一個帶有Lease對象的對象,但有時命名空間移除操作會在終止狀態卡住。

到那時我們會有一個節點Lease,過時的heartbeat可能會吿訴節點控制器:該節點訪問不了,從而影響節點之間的整體通信。

如何修復終止時卡住的命名空間刪除?

當然,您可以嘗試弄清楚為何命名空間在終止時卡住,但有時您搞不清楚,這時我們可以使用強行刪除。

創建一個臨時JSON文件

kubectl getnamespace<terminating-namespace>-o json >tmp.json

執行以下命令:

$ kubectl proxy

Starting to serve on 127.0.0.1:8001

編輯您的tmp.json文件。從finalizers字段中刪除Kubernetes值,並保存文件。

執行以下命令,更新命名空間:

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":"<terminating-namespace>",

"selfLink":"/api/v1/namespaces/<terminating-namespace>/finalize",

"uid":"b50c9ea4-ec2b-11e8-a0be-fa163eeb47a5",

"resourceVersion":"1602981",

"creationTimestamp":"2021-10-18T18:48:30Z",

"deletionTimestamp":"2021-10-18T18:59:36Z"

},

"spec":{



},

"status":{

"phase":"Terminating"

}}

但願本文對您有所幫助!

推薦閲讀 點擊標題可跳轉

《Docker是什麼?》

《Kubernetes是什麼?》

《Kubernetes和Docker到底有啥關係?》

《教你如何快捷的查詢選擇網絡倉庫鏡像tag》

《Docker鏡像進階:瞭解其背後的技術原理》

《教你如何修改運行中的容器端口映射》

《k8s學習筆記:介紹&上手》

《k8s學習筆記:縮擴容&更新》

《Docker 基礎用法和命令幫助》

《在K8S上搭建Redis集羣》

《灰度部署、滾動部署、藍綠部署》

《PM2實踐指南》

《Docker垃圾清理》

《Kubernetes(k8s)底層網絡原理刨析》

《容器環境下Node.js的內存管理》

《MySQL 快速創建千萬級測試數據》

《Linux 與 Unix 到底有什麼不同?》

《淺談幾種常見 RAID 的異同》

《Git 筆記-程序員都要掌握的 Git》

《老司機必須懂的MySQL規範》

《Docker中Image、Container與Volume的遷移》

《漫畫|如何用Kubernetes搞定CICD》

《寫給前端的Docker實戰教程》

《Linux 操作系統知識地圖2.0,我看行》

《16個概念帶你入門 Kubernetes》

《程序員因接外包坐牢456天,長文敍述心酸真實經歷》

《IT 行業老鳥,有話對你説》

《HTTPS 為什麼是安全的? 説一下他的底層實現原理?

免責聲明:本文內容來源於網絡,所載內容僅供參考。轉載僅為學習和交流之目的,如無意中侵犯您的合法權益,請及時聯繫Docker中文社區!