跳至主要内容

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 的資源範圍,避免極端資源請求導致的問題。