一個k8s叢集通常被許多團隊一起使用。這些團隊應該如何將物件部署到同一座k8s並組織它們,來讓一個團隊不會意外修改其他團隊建立的物件?

一個大型團隊如何部署了數百個微服務並且組織它們,以便每個團隊成員,即使是團隊的新手,也可以快速了解每個物件的歸屬以及它在系統中的腳色? 例如,ConfigMap或Secret屬於哪個應用程序。

這是兩個不同的問題。k8s使用物件命名空間解決第一個問題,另一個使用物件標籤解決問題。

假設您的公司正在運行由多個工程團隊一起使用的單個k8s叢集。這些團隊中每人自己都部署了整個Kiada應用程式套件來開發和測試它。 您希望每個團隊只處理他們自己的應用程式套件實例 → 每個團隊只想看到他們建立的物件,而不是其他團隊建立的物件。這是利用在k8s中單獨的命名空間中建立物件來實現的。

<aside> 💡 k8s中的命名空間有助於將k8s API物件組織成不重疊的群組。 k8s命名空間與Linux命名空間無關,Linux命名空間有助於將運行在一個容器中的程序與另一個容器中的程序隔離開來。

</aside>

圖 10.1 利用k8s命名空間將一個實體叢集拆分為多個虛擬叢集

圖 10.1 利用k8s命名空間將一個實體叢集拆分為多個虛擬叢集

如上圖,您可以使用命名空間將單個實體k8s叢集劃分為多個虛擬叢集。 取代每個人都在同一個地方建立他們的物件,而是每個團隊都可以存取一個或多個命名空間來建立他們的物件。 因為命名空間幫物件名稱提供了範圍,所以不同團隊在各自的命名空間中建立物件可以使用相同的名稱。一些命名空間可以在不同的團隊或個人用戶之間共用。

使用多個命名空間允許您將複雜系統的大量元件劃分為由不同團隊管理的較小群組。 它們還可用於在多租戶環境中隔離物件。例如,您可以幫每個客戶端建立一個單獨的命名空間(或一組命名空間),並將此客戶端的整個應用程式套件都部署在此命名空間(或組)中。

<aside> 💡 大多數k8s API物件類型都有命名空間,但也有少數沒有。 Pod、ConfigMaps、Secrets、PersistentVolumeClaims 和 Events 都是命名空間。 節點、PV、StorageClasses和命名空間本身不是。 要查看資源是命名空間還是叢集範圍,請執行kubectl api-resources然後檢查NAMESPACED欄列。

</aside>

如果沒有命名空間,叢集的每個用戶都必須幫他的物件名稱增加一個唯一前綴詞,否則每個用戶都必須使用自己的k8s叢集,不然會名稱衝突。

圖 10.2 一些 Kubernetes API 類型是命名空間的,而另一些是叢集範圍的。

圖 10.2 一些 Kubernetes API 類型是命名空間的,而另一些是叢集範圍的。

命名空間還提供了用戶權限的範圍。用戶可能有權管理一個命名空間中的物件,但不能管理其他命名空間中的物件。同樣,資源配額也與命名空間相關。

您建立的每個k8s叢集都包含一些常見的命名空間。讓我們看看它們是什麼。

由於每個命名空間都由Namespace物件表示,可以使用kubectl get顯示它們,就像顯示任何其他物件一樣。要查看叢集中的命名空間,如下:

$ kubectl get namespaces
NAME                 STATUS   AGE
default              Active   1h
kube-node-lease      Active   1h
kube-public          Active   1h
kube-system          Active   1h
local-path-storage   Active   1h

到目前為止,您一直在default命名空間中工作。每次建立物件時,都會在default命名空間中建立它。 同樣,當您使用kubectl get指令列出物件(例如 pod)時,該指令只會顯示此命名空間中的物件。您可能想知道其他命名空間中是否有 pod。讓我們來看看。

<aside> 💡 前綴為kube-的命名空間是幫k8s系統命名空間保留的。

</aside>

要列出kube-system命名空間中的pod,請使用kubectl get搭配--namespace選項執行指令:

$ kubectl get pods --namespace kube-system
NAME                        READY   STATUS    RESTARTS   AGE
coredns-558bd4d5db-4n5zg    1/1     Running   0          1h
coredns-558bd4d5db-tnfws    1/1     Running   0          1h
etcd-kind-control-plane     1/1     Running   0          1h
kindnet-54ks9               1/1     Running   0          1h
...

<aside> 💡 您也可以使用-n代替--namespace

</aside>