命名空間
在 Kubernetes 中,命名空間提供了一種機制,用於在單一叢集中隔離資源群組。資源名稱在命名空間內必須是唯一的,但在跨命名空間則不必。基於命名空間的範圍界定僅適用於命名空間作用域的物件(例如,部署、服務等),而不適用於叢集範圍的物件(例如,StorageClass、節點、PersistentVolumes 等)。
何時使用多個命名空間
命名空間旨在用於具有許多使用者分佈在多個團隊或專案中的環境。對於只有少數到數十個使用者的叢集,您應該完全不需要建立或考慮命名空間。當您需要命名空間提供的功能時,才開始使用命名空間。
命名空間為名稱提供範圍。資源名稱在命名空間內必須是唯一的,但在跨命名空間則不必。命名空間不能彼此巢狀內嵌,且每個 Kubernetes 資源只能在一個命名空間中。
命名空間是一種在多個使用者之間劃分叢集資源的方法(透過資源配額)。
不需要使用多個命名空間來分隔稍微不同的資源,例如同一軟體的不同版本:使用標籤來區分同一命名空間內的資源。
注意
對於生產叢集,請考慮不要使用default
命名空間。而是建立其他命名空間並使用它們。初始命名空間
Kubernetes 啟動時有四個初始命名空間
預設 (default)
- Kubernetes 包含此命名空間,以便您可以開始使用新的叢集,而無需先建立命名空間。
kube-node-lease
- 此命名空間保存與每個節點關聯的租用 (Lease)物件。節點租用允許 kubelet 發送心跳訊號,以便控制平面可以偵測節點故障。
kube-public
- 此命名空間可由所有用戶端讀取(包括未經驗證的用戶端)。此命名空間主要保留供叢集使用,以防某些資源應在整個叢集中公開可見和可讀取。此命名空間的公開方面僅是一種慣例,而不是要求。
kube-system
- Kubernetes 系統建立的物件的命名空間。
使用命名空間
命名空間的建立和刪除在命名空間的管理指南文件中說明。
注意
避免建立具有kube-
前綴的命名空間,因為它保留給 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 標籤。
警告
透過建立與 公用頂層網域 同名的命名空間,這些命名空間中的服務可以具有與公用 DNS 記錄重疊的短 DNS 名稱。來自任何命名空間的工作負載執行 DNS 查閱而沒有尾隨點將被重新導向到這些服務,優先於公用 DNS。
為了減輕這種情況,請將建立命名空間的權限限制為受信任的使用者。如果需要,您可以額外設定第三方安全控制,例如許可 Webhook,以阻止建立任何名稱為 公用 TLD 的命名空間。
並非所有物件都在命名空間中
大多數 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
。此標籤的值是命名空間名稱。