名稱空間

在 Kubernetes 中,**名稱空間(Namespaces)**提供了一種機制,用於在單個叢集內隔離資源組。資源的名稱在名稱空間內必須是唯一的,但在不同名稱空間之間則不必。基於名稱空間的範圍劃分僅適用於名稱空間內的物件(例如 Deployment、Service 等),而不適用於叢集範圍內的物件(例如 StorageClass、Node、PersistentVolume 等)。

何時使用多個名稱空間

名稱空間旨在用於擁有多個團隊或專案、使用者眾多的環境。對於只有少量到數十個使用者的叢集,你完全不需要建立或考慮名稱空間。當你需要名稱空間提供的功能時,才開始使用它們。

名稱空間為名稱提供了作用域。資源的名稱在名稱空間內必須是唯一的,但在不同名稱空間之間則不必。名稱空間不能相互巢狀,每個 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 條目。此條目的形式為 `<service-name>.<namespace-name>.svc.cluster.local`,這意味著如果容器只使用 `<service-name>`,它將解析為名稱空間本地的服務。這對於在多個名稱空間(如開發、預釋出和生產)之間使用相同的配置非常有用。如果你想跨名稱空間訪問,則需要使用完全限定域名(FQDN)。

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

並非所有物件都位於名稱空間中

大多數 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`。該標籤的值是名稱空間名稱。

下一步

上次修改於 2024 年 9 月 3 日太平洋標準時間晚上 8:30:更新 namespaces.md 以刪除 Note 塊中的等寬字型格式 (f6ddca16f9)