什麼是 Kubernetes 命名空間?
命名空間可用來將叢集進一步劃分為虛擬子叢集,並於不同團隊或專案共用單一 Kubernetes 叢集時發揮作用。叢集內可支援任何數量的命名空間,就邏輯上而言,每個命名空間都會彼此區隔,但能相互通訊。命名空間不得以巢狀方式存在於其他命名空間中。
存在於 Kubernetes 中的任何資源,都會位於預設命名空間中,或是由叢集作業人員建立的命名空間中。只有節點和持續性儲存磁區會存在於命名空間之外,叢集中的每個命名空間則一律可看到這些低階資源。

Kubernetes 現況

《讓 Kubernetes 準備就緒並開始運作》(Kubernetes Up and Running)
什麼是 Kubernetes 中的「預設」命名空間?
Kubernetes 隨附三個現成的命名空間,分別是:
- default:如名稱所示,這是每個 Kubernetes 指令預設參照的命名空間,也是預設存放每個 Kubernetes 資源的命名空間。在建立新的命名空間之前,整個叢集都會位於「default」命名空間內。
- kube-system:用於 Kubernetes 元件,且應避免使用。
- kube-public:用於公用資源,不建議使用者使用。
為什麼要使用 Kubernetes 命名空間?
Kubernetes 命名空間適用於許多使用情境,包括:
- 可讓團隊或專案存在於專屬的虛擬叢集中,且無需擔心彼此的工作會相互影響。
- 將使用者和流程限縮在特定命名空間中,以強化角色型存取控制 (RBAC)。
- 透過資源配額劃分叢集資源,以提供給多個團隊和使用者使用。
- 透過簡單方法來區隔容器化應用程式的開發、測試和部署,以使用相同叢集來因應整個生命週期。
為什麼要使用多個 Kubernetes 命名空間?
小型團隊或小型企業可能相當適合使用預設命名空間。一切端視於開發人員或使用者是否需要相互隔離。不過,使用多個命名空間可提供眾多實用優勢,包括:
- 隔離:大型或規模持續成長的團隊可使用多個命名空間,將專案和微服務相互隔離開來。團隊可以在不同工作區內重複使用相同的資源名稱,且無需擔心發生問題。此外,在任一工作區採取行動,並不會對其他工作區造成影響。
- 企業:使用單一叢集進行開發、測試和生產作業的企業,可以使用命名空間來劃分開發和測試環境沙箱。這可確保在應用程式生命週期內,開發人員或測試人員於專屬命名空間中進行的變更,將不會對生產程式碼造成影響。
- 權限:命名空間允許使用 Kubernetes 角色型存取控制,因此團隊可定義角色,藉此將權限或功能清單歸類在單一名稱下。這可確保只有經授權的使用者,可存取指定命名空間中的資源。
- 資源控制:只要定義 CPU 或記憶體使用的資源配額,即可在命名空間上設定原則導向的資源限制。這可確保每個專案或命名空間都有執行所需的資源,而且所有可用資源不會遭單一命名空間獨佔。
- 效能:使用命名空間,有助於提升指定叢集的效能。如果叢集已劃分為多個命名空間,以供不同專案使用,則 Kubernetes API 在執行作業時,所需搜尋的項目也會因而減少。如此一來,在叢集上執行的每個應用程式,都可縮短延遲時間,並加快應用程式的整體效能。
Pod 如何在多個 Kubernetes 命名空間中通訊?
雖然命名空間會彼此區隔,卻可輕鬆地相互通訊。Kubernetes DNS 服務目錄可使用網域名稱系統 (DNS) 定址的以下擴充形式,依據名稱來輕鬆找出任何服務:
..svc.cluster.local
只要將命名空間名稱新增至服務名稱,即可針對叢集上任何命名空間中的服務,提供存取權限。舉例來說,若要存取開發命名空間中的薪資服務,可供使用的位址為:
payroll.development
若要存取生產命名空間中的薪資服務,可供使用的位址為:
payroll.production
請注意,您可以選擇使用網路原則,以做為命名空間之間的存取控制。舉例來說,網路原則可允許或拒絕來自其他命名空間的所有流量。網路原則只會套用至連線,且不會取代執行封包檢查的防火牆。
哪些基本 kubectl 指令與命名空間息息相關?
哪個指令可用來尋找目前的 Kubernetes 命名空間?
叢集中的所有命名空間可透過以下指令顯示:
kubectl get namespace
這將傳回列出叢集內所有命名空間 (包括預設命名空間) 的清單,及其狀態和存留期。
哪個指令可用來建立新的 Kubernetes 命名空間?
命名空間可使用以下指令建立:
kubectl create namespace
如同其他 Kubernetes 資源一樣,您也可以建立並套用 YAML 檔案,以建立命名空間:
newspace.yaml:
kind: Namespace
apiVersion: v1
metadata:
name: newspace
labels:
name: newspacekubectl apply -f newspace.yaml
如何切換多個 Kubernetes 命名空間?
若要建立命名空間後為其定址,則動作的指令中必須包含 --namepsace= 選項。鑑於這項作業可能相當繁瑣,您可以使用 kubectl config 指令變更預設命名空間,以設定叢集情境中的命名空間。
舉例來說,若要將預設命名空間變更為「testing」,請輸入下列指令:
kubectl config set-context --current --namespace=testing
如此一來,後續所有 kubectl 指令的預設命名空間,都會設為「testing」。
如何重新命名 Kubernetes 命名空間?
重新命名 Kubernetes 命名空間並不屬於標準實踐方式,因此,請務必謹慎選擇命名空間 (預設以外)。
如何刪除 Kubernetes 命名空間?
命名空間可使用以下指令刪除:
kubectl delete namespaces
由於刪除作業為非同步化活動,在直到實際刪除之前,命名空間將顯示為「terminating」(終止中)。
刪除 Kubernetes 命名空間的警告事項
刪除命名空間為無法回復的操作。命名空間中的每個項目 (包括所有服務、執行中 Pod 和成品),都將遭到刪除。存在於該命名空間內的任何項目,都將執行廢棄項目收集。在採取這項動作前,請務必確認命名空間中的所有項目都應予以刪除。
相關解決方案與產品
實驗室:應用程式現代化改造
在短短數週內,將應用程式移至雲端。
Tanzu Kubernetes for Operation
現代化多雲容器基礎架構的基礎。
Tanzu Application Platform
在 Kubernetes 上享受優異的多雲開發人員體驗。