命名空間是一種將集群組織成虛擬子集群的方法——當(dāng)不同的團隊或項目共享一個 Kubernetes 集群時,它們會很有幫助。集群內(nèi)支持任意數(shù)量的命名空間,每個命名空間在邏輯上彼此分離,但能夠相互通信。命名空間不能相互嵌套。Kubernetes 中存在的任何資源都存在于默認(rèn)命名空間或集群操作員創(chuàng)建的命名空間中。只有節(jié)點和持久存儲卷存在于命名空間之外;這些低級資源對集群中的每個命名空間始終可見。
Kubernetes 中的“默認(rèn)”命名空間是什么?
Kubernetes 提供了三個開箱即用的命名空間。他們是:
- default:顧名思義,這是每個 Kubernetes 命令默認(rèn)引用的命名空間,也是每個 Kubernetes 資源默認(rèn)所在的位置。在創(chuàng)建新的命名空間之前,整個集群都處于“默認(rèn)”狀態(tài)。
- kube-system:用于 Kubernetes 組件 ,應(yīng)避免使用。
- kube-public: 用于公共資源。不推薦用戶使用。
為什么使用 Kubernetes 命名空間?
Kubernetes 命名空間有很多用例,包括:
- 允許團隊或項目存在于自己的虛擬集群中,而不必擔(dān)心影響彼此的工作。
- 通過將用戶和進程限制到某些命名空間來增強基于角色的訪問控制 (RBAC)。
- 通過資源配額實現(xiàn)集群資源在多個團隊和用戶之間的劃分。
- 提供一種分離容器化應(yīng)用程序的開發(fā)、測試和部署的簡單方法,使整個生命周期能夠在同一個集群上進行。
什么時候應(yīng)該使用多個 Kubernetes 命名空間?
小型團隊或小型組織可能會完全滿足使用默認(rèn)命名空間。如果不需要將開發(fā)人員或用戶彼此隔離,這一點尤其重要。但是,擁有多個命名空間有許多有用的好處,包括:
- 隔離。 大型或成長中的團隊可以使用命名空間將他們的項目和微服務(wù)相互隔離。團隊可以毫無問題地在不同的工作區(qū)中重復(fù)使用相同的資源名稱。此外,對一個工作區(qū)中的項目執(zhí)行操作永遠不會影響其他工作區(qū)。
- 組織。 使用單個集群進行開發(fā)、測試和生產(chǎn)的組織可以使用命名空間來沙箱開發(fā)和測試環(huán)境。這可確保生產(chǎn)代碼不受開發(fā)人員或測試人員在整個應(yīng)用程序生命周期中在他們自己的命名空間中所做的更改的影響。
- 權(quán)限。 命名空間支持使用 Kubernetes RBAC,因此團隊可以定義角色,將權(quán)限或能力列表分組到一個名稱下。這可以確保只有授權(quán)用戶才能訪問給定命名空間中的資源。
- 資源控制。 通過定義 CPU 或內(nèi)存利用率的資源配額,可以在命名空間上設(shè)置策略驅(qū)動的資源限制。這可以確保每個項目或命名空間都有運行所需的資源,并且沒有一個命名空間占用所有可用資源。
- 表現(xiàn)。 使用命名空間有助于提高給定集群的性能。如果一個集群被劃分為不同項目的多個命名空間,Kubernetes API 在執(zhí)行操作時將有更少的項目來搜索。這可以減少延遲并加快集群上運行的每個應(yīng)用程序的整體應(yīng)用程序性能。
Pod 如何跨 Kubernetes 命名空間進行通信?
盡管命名空間彼此分離,但它們可以輕松地相互通信。通過使用 DNS 尋址的擴展形式,Kubernetes DNS 服務(wù)目錄可以通過名稱輕松定位任何服務(wù):
..svc.cluster.local
只需將命名空間名稱添加到服務(wù)名稱即可訪問集群上任何命名空間中的服務(wù)。例如,要訪問 development 命名空間中的工資單服務(wù),您將使用地址
payroll.development
要訪問生產(chǎn)命名空間中的工資單服務(wù),您將使用:
payroll.production
請注意,可以選擇使用網(wǎng)絡(luò)策略來控制命名空間之間的訪問。例如,網(wǎng)絡(luò)策略可以允許或拒絕來自其他命名空間的所有流量。網(wǎng)絡(luò)策略僅適用于連接,不能替代執(zhí)行數(shù)據(jù)包檢查的防火墻。
與命名空間相關(guān)的基本 kubectl 命令有哪些?
查找當(dāng)前 Kubernetes 命名空間的命令是什么?
可以使用命令顯示集群中的所有命名空間:
kubectl get namespace
這將返回集群中所有命名空間的列表,包括默認(rèn)命名空間,以及它們的狀態(tài)和年齡。
創(chuàng)建新的 Kubernetes 命名空間的命令是什么?
命名空間只需使用以下命令創(chuàng)建:
kubectl create namespace
與任何其他 Kubernetes 資源一樣,也可以創(chuàng)建 YAML 文件并將其應(yīng)用于創(chuàng)建命名空間:
newspace.yaml:
種類:命名空間
apiVersion:v1
元數(shù)據(jù):
名稱:新空間
標(biāo)簽:
名稱:newspacekubectl apply -f newspace.yaml
如何在 Kubernetes 命名空間之間切換?
要在創(chuàng)建命名空間后對其進行尋址,操作必須在命令中包含 –namepsace= 選項。由于這會變得很麻煩,因此可以通過使用 kubectl config 命令在集群上下文中設(shè)置命名空間來更改默認(rèn)命名空間。
例如,要將默認(rèn)命名空間更改為名為“testing”的命名空間,您需要輸入:
kubectl config set-context --current --namespace=testing
這會將默認(rèn)命名空間設(shè)置為“testing”,以供將來所有 kubectl 命令使用。
如何重命名 Kubernetes 命名空間?
重命名 Kubernetes 命名空間不是標(biāo)準(zhǔn)做法,因此請謹(jǐn)慎選擇命名空間(默認(rèn)值之外)。
如何刪除 Kubernetes 命名空間?
使用以下命令刪除命名空間:
kubectl delete namespaces
由于刪除是異步活動,因此命名空間將顯示為“終止”,直到命名空間被刪除。
關(guān)于刪除 Kubernetes 命名空間的警告
刪除命名空間是最后的動作。命名空間中的所有內(nèi)容,包括所有服務(wù)、正在運行的 pod 和工件都將被刪除。垃圾收集將在該命名空間中存在的任何東西上運行。在執(zhí)行此操作之前,請確保應(yīng)刪除命名空間中的所有內(nèi)容。