命名空間

在 Kubernetes 中,命名空間提供了一種機制,用於在單一叢集中隔離資源群組。資源名稱在命名空間內必須是唯一的,但在跨命名空間則不必。基於命名空間的範圍界定僅適用於命名空間作用域的物件(例如,部署、服務等),而不適用於叢集範圍的物件(例如,StorageClass、節點、PersistentVolumes 等)

何時使用多個命名空間

命名空間旨在用於具有許多使用者分佈在多個團隊或專案中的環境。對於只有少數到數十個使用者的叢集,您應該完全不需要建立或考慮命名空間。當您需要命名空間提供的功能時,才開始使用命名空間。

命名空間為名稱提供範圍。資源名稱在命名空間內必須是唯一的,但在跨命名空間則不必。命名空間不能彼此巢狀內嵌,且每個 Kubernetes 資源只能在一個命名空間中。

命名空間是一種在多個使用者之間劃分叢集資源的方法(透過資源配額)。

不需要使用多個命名空間來分隔稍微不同的資源,例如同一軟體的不同版本:使用標籤來區分同一命名空間內的資源。

初始命名空間

Kubernetes 啟動時有四個初始命名空間

預設 (default)
Kubernetes 包含此命名空間,以便您可以開始使用新的叢集,而無需先建立命名空間。
kube-node-lease
此命名空間保存與每個節點關聯的租用 (Lease)物件。節點租用允許 kubelet 發送心跳訊號,以便控制平面可以偵測節點故障。
kube-public
此命名空間可由所有用戶端讀取(包括未經驗證的用戶端)。此命名空間主要保留供叢集使用,以防某些資源應在整個叢集中公開可見和可讀取。此命名空間的公開方面僅是一種慣例,而不是要求。
kube-system
Kubernetes 系統建立的物件的命名空間。

使用命名空間

命名空間的建立和刪除在命名空間的管理指南文件中說明。

檢視命名空間

您可以使用以下命令列出叢集中目前的命名空間

kubectl get namespace
NAME              STATUS   AGE
default           Active   1d
kube-node-lease   Active   1d
kube-public       Active   1d
kube-system       Active   1d

設定請求的命名空間

若要為目前請求設定命名空間,請使用 --namespace 旗標。

例如

kubectl run nginx --image=nginx --namespace=<insert-namespace-name-here>
kubectl get pods --namespace=<insert-namespace-name-here>

設定命名空間偏好設定

您可以永久儲存該環境定義中所有後續 kubectl 命令的命名空間。

kubectl config set-context --current --namespace=<insert-namespace-name-here>
# Validate it
kubectl config view --minify | grep namespace:

命名空間和 DNS

當您建立服務 (Service)時,它會建立對應的DNS 項目。此項目的格式為 <服務名稱>.<命名空間名稱>.svc.cluster.local,這表示如果容器僅使用 <服務名稱>,它將解析為命名空間本機的服務。這適用於跨多個命名空間(例如開發、預備和生產)使用相同的組態。如果您想要跨命名空間訪問,則需要使用完整網域名稱 (FQDN)。

因此,所有命名空間名稱都必須是有效的 RFC 1123 DNS 標籤

並非所有物件都在命名空間中

大多數 Kubernetes 資源(例如 Pod、服務、複寫控制器等)都在某些命名空間中。但是,命名空間資源本身不在命名空間中。而低階資源,例如節點持久磁碟區,則不在任何命名空間中。

若要查看哪些 Kubernetes 資源在命名空間中以及哪些不在

# In a namespace
kubectl api-resources --namespaced=true

# Not in a namespace
kubectl api-resources --namespaced=false

自動標籤

功能狀態: Kubernetes 1.22 [穩定]

Kubernetes 控制平面在所有命名空間上設定一個不可變的 標籤 kubernetes.io/metadata.name。此標籤的值是命名空間名稱。

後續步驟

最後修改於 2024 年 9 月 3 日 晚上 8:30 PST:更新 namespaces.md 以移除 Note 區塊中的等寬格式 (f6ddca16f9)