Resources - Namespace
Namespace 是什麼?
Namespace 是 Kubernetes 中的一種邏輯隔離機制,主要用於在同一個 Kubernetes 集群中劃分資源。它的作用是為不同的使用者、環境或應用程式提供獨立的資源空間,從而避免資源之間的衝突和干擾。
可以將 Namespace 理解為 Kubernetes 集群內部的「子集群」,雖然所有資源仍在同一集群中,但彼此之間的邏輯上是隔離的。
什麼時候使用 Namespace?
Namespace 適合用於以下場景:
- 多租戶環境 當一個 Kubernetes 集群需要同時支持多個使用者或團隊時,使用 Namespace 可以為每個團隊劃分專屬的資源區域,確保不同團隊的資源互不干擾。
- 環境區分 為了在一個集群中同時管理開發(Dev)、測試(Test)和生產(Prod)環境,可以為每個環境創建對應的 Namespace。
- 資源管理與限制 如果需要對集群資源進行精細化管理,Namespace 可以配合 ResourceQuota 等機制,為每個 Namespace 分配特定的資源(如 CPU、記憶體)。
- 簡化大規模資源管理 當集群中有大量的應用和資源時,Namespace 有助 於組織和分類,避免命名衝突和混亂。
Namespace 的功能
- 資源隔離 Namespace 可以將不同的工作負載(如開發環境、測試環境和生產環境)進行隔離,避免資源競爭或影響。
- 資源配額 配合 ResourceQuota 資源配額,Namespace 可以限制每個使用者或應用程式的資源使用量(如 CPU、記憶體)。
- 方便管理 透過 Namespace,可以更清楚地組織和管理大量的 Kubernetes 資源,如 Pod、Service、ConfigMap 等。
實作 Namespace
- 在同一個 Namespace 中的資源名稱必須是唯一的,但跨命名空間就不需要。
- Namespace 作用範圍只針對帶有 Namespace 的物件(例如:Deployment、Service 等),不是用於叢集物件(例如:StorageClass、Node、PresistentVolume 等)。
查看 Namespace
kubectl.exe get namespaces
---
NAME STATUS AGE
default Active 100d
ingress-nginx Active 2d23h
kube-node-lease Active 100d
kube-public Active 100d
kube-system Active 100d
kubernetes-dashboard Active 94d
預設 Namespace
Kubernetes 預設提供以下幾個 Namespace:
default
:沒有明確指定 Namespace 的資源都會部署到這裡。kube-system
:用於儲存 Kubernetes 系統組件(如 API server、Scheduler)相關資源。kube-public
:公開可訪問的 Namespace,所有使用者都可以查看這裡的資源。kube-node-lease
:用於節點之間的心跳管理。
查看 kubernetes 資源是否在 Namespace 中
- 查看位於命名空間的資源
kubectl.exe api-resources --namespaced=true
- 查看不在命名空間的資源
kubectl.exe api-resources --namespaced=false
建立自訂 Namespace
- 可以使用以下指令建立自訂 Namespace:
kubectl.exe create namespace <namespace-name>
例如:
kubectl.exe create namespace my-namespace
- 查看建立的 namespace
kubectl.exe get namespaces
---
NAME STATUS AGE
default Active 100d
ingress-nginx Active 2d23h
kube-node-lease Active 100d
kube-public Active 100d
kube-system Active 100d
kubernetes-dashboard Active 94d
my-namespace Active 27s
在指定 Namespace 中執行操作
- 要在特定 Namespace 中執行操作,可以使用
--namespace
選項。例如:
kubectl.exe get pods --namespace=my-namespace
- 或者,修改當前上下文的 Namespace:
kubectl.exe config set-context --current --namespace=my-namespace
- 查看當前使用的預設 Namespace:
kubectl.exe config view --minify | Select-String "namespace:"
- 如果想要指定全命名空間的話,則需要使用
--all-namespaces
選項。例如:
kubectl.exe get pods --all-namespaces
刪除 Namespace
刪除 Namespace 的指令為:
kubectl delete namespace <namespace-name>
刪除 Namespace 時,該 Namespace 中的所有資源都會一併被移除,請謹慎操作。
為 Pod 指定 Namespace
在撰寫 Pod 設定檔的時候,我們可以在 metadata.namespace 欄位指定要運行在哪一個 Namespace 中,如果沒有特別設定則在看預設值。
apiversion: v1
kind: Pod
metadata:
namespace: <ns-name>
name: <pod-name>
Namespace 的特性
1. 名稱唯一性
在 Kubernetes 中,Namespace 是一個獨立的邏輯區域,其名稱在整個集群範圍內必須唯一。
- 不同的 Namespace 之間可以包含名稱相同的資源,例如 Pod、Service 等,因為它們彼此隔離。
- 但 Namespace 本身的名稱在整個集群中是唯一的。
範例:
- 在
dev
Namespace 中可以有一個名為web-app
的 Pod。 - 同時在
prod
Namespace 中也可以有一個名為web-app
的 Pod,兩者互不衝突。
2. 跨命名空間名稱共享
雖然 Namespace 提供了邏輯隔離,但在某些情況下需要實現跨命名空間的名稱共享或互通。例如:
- 跨命名空間訪問 Service:可以透過
ServiceName.NamespaceName.svc.cluster.local
的形式訪問其他 Namespace 中的 Service。 - 共享 ConfigMap 或 Secret:可以通過手動複製的方式在多個 Namespace 中使用相同的配置,但 Kubernetes 本身不支持直接跨 Namespace 引用這些資源。
範例:
curl http://my-service.dev.svc.cluster.local
此指令用於從當前 Namespace 中訪問 dev
Namespace 下的 my-service
。
3. 刪除命名空間及其資源
刪除一個 Namespace 時,其中的所有資源(如 Pod、Service、ConfigMap 等)都會被自動刪除。因此,刪除 Namespace 是一個非常危險的操作,尤其在生產環境中,需謹慎執行。
指令範例:
kubectl delete namespace <namespace-name>
注意事項:
- Namespace 中的資源會逐一被清理,因此刪除操作可能需要一些時間完成。
- 若有重要資源需要保留,建議先將資源移動到其他 Namespace 再刪除。
4. 資源配額 (ResourceQuota)
Namespace 支持為資源分配配額,通過 ResourceQuota,集群管理員可以限制每個 Namespace 的資源使用量,例如 Pod 的數量、CPU 和記憶體的上限等。
用途:
- 防止某個 Namespace 過度消耗集群資源,影響其他 Namespace 的運行。
- 幫助進行資源的合理分配和管理。
範例 ResourceQuota 配置:
apiVersion: v1
kind: ResourceQuota
metadata:
name: compute-resources
namespace: dev
spec:
hard:
pods: '10'
requests.cpu: '2'
requests.memory: '4Gi'
limits.cpu: '4'
limits.memory: '8Gi'
應用指令:
kubectl apply -f resource-quota.yaml
效果:
- 限制
dev
Namespace 中最多可以創建 10 個 Pod。 - 該 Namespace 中的資源請求(requests)和限制(limits)分別有 CPU 和記憶體的上限。
5. 資源限制 (LimitRange)
除了 ResourceQuota,Namespace 還可以透過 LimitRange 設定資源使用的範圍,包括:
- 每個 Pod 或 Container 的最低和最高資源請求。
- 避免用戶創建資源過小(如請求 1m CPU)或過大(如超過集群可用資源)。
範例 LimitRange 配置:
apiVersion: v1
kind: LimitRange
metadata:
name: cpu-mem-limits
namespace: dev
spec:
limits:
- type: Container
max:
cpu: '2'
memory: '1Gi'
min:
cpu: '0.1'
memory: '64Mi'
應用指令:
kubectl apply -f limit-range.yaml
效果:
- 每個 Container 的 CPU 請求不能超過 2 cores,且不能少於 0.1 cores。
- 記憶體請求不能超過 1Gi,且不能少於 64Mi。
Namespace 的特性總結
特性 | 描述 |
---|---|
名稱唯一性 | Namespace 的名稱在集群範圍內唯一,能避免命名衝突。 |
跨命名空間名稱共享 | 支持通過全域名稱或服務發現機制進行跨 Namespace 資源訪問。 |
刪除命名空間及資源 | 刪除 Namespace 會自動清理其中的所有資源,需謹慎操作。 |
資源配額 (ResourceQuota) | 限制每個 Namespace 中資源的總使用量,幫助合理分配集群資源。 |
資源限制 (LimitRange) | 控制單個 Pod 或 Container 的資源範圍,避免極端資源請求導致的問題。 |