名稱空間
在 Kubernetes 中,**名稱空間(Namespaces)**提供了一種機制,用於在單個叢集內隔離資源組。資源的名稱在名稱空間內必須是唯一的,但在不同名稱空間之間則不必。基於名稱空間的範圍劃分僅適用於名稱空間內的物件(例如 Deployment、Service 等),而不適用於叢集範圍內的物件(例如 StorageClass、Node、PersistentVolume 等)。
何時使用多個名稱空間
名稱空間旨在用於擁有多個團隊或專案、使用者眾多的環境。對於只有少量到數十個使用者的叢集,你完全不需要建立或考慮名稱空間。當你需要名稱空間提供的功能時,才開始使用它們。
名稱空間為名稱提供了作用域。資源的名稱在名稱空間內必須是唯一的,但在不同名稱空間之間則不必。名稱空間不能相互巢狀,每個 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 條目。此條目的形式為 `<service-name>.<namespace-name>.svc.cluster.local`,這意味著如果容器只使用 `<service-name>`,它將解析為名稱空間本地的服務。這對於在多個名稱空間(如開發、預釋出和生產)之間使用相同的配置非常有用。如果你想跨名稱空間訪問,則需要使用完全限定域名(FQDN)。
因此,所有名稱空間名稱都必須是有效的RFC 1123 DNS 標籤。
警告
透過建立與公共頂級域名同名的名稱空間,這些名稱空間中的 Service 可以擁有與公共 DNS 記錄重疊的短 DNS 名稱。任何名稱空間中的工作負載執行不帶尾隨點的 DNS 查詢時,都會被重定向到這些 Service,優先於公共 DNS。
為了緩解此問題,請限制建立名稱空間的許可權,僅限受信任的使用者。如果需要,你還可以配置第三方安全控制措施,例如准入 Webhook,以阻止建立與公共頂級域名同名的任何名稱空間。
並非所有物件都位於名稱空間中
大多數 Kubernetes 資源(例如 Pod、Service、Replication Controller 等)都位於某個名稱空間中。然而,名稱空間資源本身並不位於名稱空間中。低階資源,例如節點和PersistentVolume,也不位於任何名稱空間中。
要檢視哪些 Kubernetes 資源位於名稱空間中,哪些不位於名稱空間中:
# In a namespace
kubectl api-resources --namespaced=true
# Not in a namespace
kubectl api-resources --namespaced=false
自動標籤
Kubernetes 1.22 [stable]
Kubernetes 控制平面在所有名稱空間上設定一個不可變的標籤 `kubernetes.io/metadata.name`。該標籤的值是名稱空間名稱。