跳至主要内容

Resources - Namespace

Namespace 是什麼?​

Namespace 是 Kubernetes 中的一種邏輯隔離機制,主要用於在同一個 Kubernetes 集群中劃分資源。它的作用是為不同的使用者、環境或應用程式提供獨立的資源空間,從而避免資源之間的衝突和干擾。

可以將 Namespace 理解為 Kubernetes 集群內部的「子集群」,雖然所有資源仍在同一集群中,但彼此之間的邏輯上是隔離的。

resource-namespace


什麼時候使用 Namespace?​

Namespace 適合用於以下場景:

  1. 多租戶環境 當一個 Kubernetes 集群需要同時支持多個使用者或團隊時,使用 Namespace 可以為每個團隊劃分專屬的資源區域,確保不同團隊的資源互不干擾。
  2. 環境區分 為了在一個集群中同時管理開發(Dev)、測試(Test)和生產(Prod)環境,可以為每個環境創建對應的 Namespace。
  3. 資源管理與限制 如果需要對集群資源進行精細化管理,Namespace 可以配合 ResourceQuota 等機制,為每個 Namespace 分配特定的資源(如 CPU、記憶體)。
  4. 簡化大規模資源管理 當集群中有大量的應用和資源時,Namespace 有助於組織和分類,避免命名衝突和混亂。

Namespace 的功能​

  1. 資源隔離 Namespace 可以將不同的工作負載(如開發環境、測試環境和生產環境)進行隔離,避免資源競爭或影響。
  2. 資源配額 配合 ResourceQuota 資源配額,Namespace 可以限制每個使用者或應用程式的資源使用量(如 CPU、記憶體)。
  3. 方便管理 透過 Namespace,可以更清楚地組織和管理大量的 Kubernetes 資源,如 Pod、Service、ConfigMap 等。

實作 Namespace​

  1. 在同一個 Namespace 中的資源名稱必須是唯一的,但跨命名空間就不需要。
  2. 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 中​

  1. 查看位於命名空間的資源
kubectl.exe api-resources --namespaced=true
  1. 查看不在命名空間的資源
kubectl.exe api-resources --namespaced=false

建立自訂 Namespace​

  1. 可以使用以下指令建立自訂 Namespace:
kubectl.exe create namespace <namespace-name>

例如:​

kubectl.exe create namespace my-namespace
  1. 查看建立的 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 中執行操作​

  1. 要在特定 Namespace 中執行操作,可以使用 --namespace 選項。例如:
kubectl.exe get pods --namespace=my-namespace
  1. 或者,修改當前上下文的 Namespace:
kubectl.exe config set-context --current --namespace=my-namespace
  1. 查看當前使用的預設 Namespace:
kubectl.exe config view --minify | Select-String "namespace:"
  1. 如果想要指定全命名空間的話,則需要使用 --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 的資源範圍,避免極端資源請求導致的問題。