iT邦幫忙

2026 iThome 鐵人賽

DAY 19
0
Kubernetes

從零到 CKA:30 天掌握 Kubernetes 核心觀念與實作系列 第 19

Day 19|Namespace — Kubernetes 的資源隔離與多租戶管理

  • 分享至 

  • xImage
  •  

前言

昨天我們學了 Sidecar Container —— Pod 內多 Container 協作的核心模式,讓輔助 Container 可以持續協助主要 Container 處理 Log、Proxy、Sync 等工作。

但到目前為止,我們建立的 Pod、Service、Deployment,大多都放在同一個地方 —— default Namespace

當叢集裡的資源越來越多,如果不同團隊、不同環境(Dev / Staging / Prod)的資源全部混在一起,管理起來就會變得很混亂。

這時候,就需要用到今天的主角:Namespace

Namespace 可以把同一個 Kubernetes 叢集中的資源分成不同的邏輯區域,方便進行分類、管理與權限控制。

今天我們來學:

  1. 核心概念 — 什麼是 Namespace?
  2. 用比喻理解 — 辦公大樓的樓層
  3. 預設 Namespace — Kubernetes 內建了哪些 Namespace?
  4. 常用操作 — 建立、查看、切換與刪除 Namespace
  5. 實作練習 — 驗證跨 Namespace 的資源隔離與 DNS 存取

以下操作皆在 master 節點 執行。


一、核心概念

什麼是 Namespace?

Namespace 是 Kubernetes 提供的一種邏輯隔離機制,用來將同一個叢集中的資源分組管理。

你可以把它想成叢集裡的「資料夾」:

  • 同一個 Namespace 裡,同一類資源的名稱必須唯一;不同 Namespace 則可以存在同名資源
  • Namespace 提供的是邏輯上的分組與隔離,不是物理隔離
  • 預設情況下,Pod 之間仍然可以跨 Namespace 通訊
  • 如果要進一步限制「誰可以操作哪些資源」或「哪些 Pod 可以互相通訊」,通常會搭配 RBACNetworkPolicy

Namespace 負責把資源分組;RBAC 負責權限;NetworkPolicy 負責網路存取控制。

為什麼需要 Namespace?

場景 沒有 Namespace 有 Namespace
多環境 Dev / Staging / Prod 的資源全混在一起 每個環境放在不同 Namespace,方便分類與管理
多團隊 團隊 A 和團隊 B 的資源名稱容易互相衝突 各自在自己的 Namespace 裡,名稱可以獨立管理
資源配額 不容易限制某個團隊可以使用多少 CPU / Memory 可以透過 ResourceQuota 限制每個 Namespace 的資源用量
權限控制 權限範圍不容易切分 可以透過 RBAC 控制誰能操作哪些 Namespace 裡的資源

哪些資源有 Namespace?哪些沒有?

Kubernetes 的資源可以分成兩大類:

類型 說明 範例
Namespaced 資源 屬於某個 Namespace,資源名稱與管理範圍會受到 Namespace 影響 Pod、Service、Deployment、ConfigMap、Secret、PVC
Cluster-scoped 資源 屬於整個叢集,不隸屬於任何 Namespace Node、PV、Namespace、ClusterRole、StorageClass

💡如何查詢?

列出所有 Namespaced 資源:

kubectl api-resources --namespaced=true

列出所有 Cluster-scoped 資源:

kubectl api-resources --namespaced=false

二、用比喻理解

想像一棟辦公大樓

  • 大樓(Cluster):整棟建築,包含所有樓層和共用設施
  • 樓層(Namespace):每個樓層是一個獨立的辦公區域,可以放自己的資源
  • 辦公室 / 設備(Pod、Service、Deployment 等):各樓層裡的具體資源
  • 大樓共用設施(Cluster-scoped 資源):不屬於任何樓層,而是整棟大樓共用

對應到 Kubernetes:

辦公大樓 Kubernetes
整棟大樓 Cluster
樓層(3F 行銷部、5F 工程部) Namespace(marketing、engineering)
樓層裡的辦公室、設備 Pod、Service、Deployment 等
大樓共用設施 Node、PV、ClusterRole 等
每層樓的門禁權限 RBAC
樓層之間的通行限制 NetworkPolicy

💡 重要觀念

Namespace 提供的是邏輯上的分組與隔離,不是完整的安全邊界。

預設情況下,不同 Namespace 裡的 Pod 仍然可以互相通訊。

如果要進一步限制:

  • 誰可以操作哪些資源 → 使用 RBAC
  • 哪些 Pod 可以互相通訊 → 使用 NetworkPolicy

三、預設 Namespace

Kubernetes 安裝完成後,通常會看到 4 個預設 Namespace:

kubectl get namespaces
Namespace 用途
default 沒有指定 Namespace 時,資源預設會建立在這裡
kube-system Kubernetes 系統元件與 Add-on 使用
kube-public 預設可讓所有 Client 讀取,包括未認證的使用者
kube-node-lease 存放每個 Node 的 Lease,用於 Node Heartbeat 與故障偵測

💡查看 kube-system 裡有什麼

kubectl get pods -n kube-system

通常可以看到 CoreDNS、kube-proxy 等系統元件。

如果使用的是 kubeadm 建立的叢集,也可能看到 kube-apiserverkube-schedulerkube-controller-manageretcd 等 Control Plane 元件。


四、常用操作

建立 Namespace

方法 1:直接建立

kubectl create namespace dev

方法 2:用 YAML

vim dev-ns.yaml

寫入以下內容:

apiVersion: v1
kind: Namespace
metadata:
  name: dev

儲存後套用:

kubectl apply -f dev-ns.yaml

查看 Namespace

# 列出所有 Namespace
kubectl get namespaces

# 縮寫
kubectl get ns

在指定 Namespace 中操作

# 在 dev namespace 建立 Pod
kubectl run nginx --image=nginx -n dev

# 查看 dev namespace 的 Pod
kubectl get pods -n dev

# 查看所有 Namespace 的 Pod
kubectl get pods --all-namespaces
# 或縮寫
kubectl get pods -A

https://ithelp.ithome.com.tw/upload/images/20260820/201819281yqICtOjs2.png

切換預設 Namespace

如果覺得每次執行指令都加上 -n dev 會有點麻煩,可以直接修改目前 kubectl context 的預設 Namespace:

# 切換預設 Namespace 到 dev
kubectl config set-context --current --namespace=dev

# 確認目前的預設 Namespace
kubectl config view --minify | grep namespace

# 切回 default
kubectl config set-context --current --namespace=default

https://ithelp.ithome.com.tw/upload/images/20260820/20181928FJlYRxnZGq.png

⚠️ 注意

切換預設 Namespace 後,所有沒有加上 -n 的 kubectl 指令,都會操作目前 context 設定的 Namespace。

使用完後記得確認目前所在的 Namespace,避免不小心操作到錯誤的環境。

刪除 Namespace

kubectl delete namespace dev

⚠️ 危險操作

刪除 Namespace 時,該 Namespace 裡的 Pod、Service、Deployment、ConfigMap、Secret 等 Namespaced 資源也會一起被刪除。

執行前一定要再次確認 Namespace 名稱,避免誤刪重要環境。


五、實作練習

練習 1:建立多個 Namespace 並部署同名資源

驗證不同 Namespace 可以有同名的資源:

# 建立兩個 Namespace
kubectl create namespace team-a
kubectl create namespace team-b
# 在兩個 Namespace 各建一個同名的 Pod
kubectl run nginx --image=nginx -n team-a
kubectl run nginx --image=nginx -n team-b
# 查看 — 兩個 Namespace 各有一個 nginx
kubectl get pods -n team-a
kubectl get pods -n team-b

https://ithelp.ithome.com.tw/upload/images/20260820/20181928tx0NUwP2v4.png

會看到:

  • team-ateam-b 裡都可以各自存在一個名叫 nginx 的 Pod
  • 兩者不會互相衝突,因為資源名稱的唯一性是以 Namespace 為範圍判斷

也就是說:

同一個 Namespace 內不能有兩個同名 Pod,但不同 Namespace 可以有相同名稱的 Pod。

# 對照:查看所有 Namespace 的 Pod
kubectl get pods -A | grep nginx

練習 2:跨 Namespace 的 Service 存取

Namespace 隔離了資源的名稱,但 Pod 之間的網路預設是互通的。來驗證一下:

Step 1:在 team-a 建立 Service

# 在 team-a 建立一個 nginx Pod 和 Service(Pod 已經有了)
kubectl expose pod nginx --port=80 --name=web-svc -n team-a

Step 2:從 team-b 存取 team-a 的 Service

# 在 team-b 建立一個測試用 Pod
kubectl run test-pod --image=busybox:1.36 --rm -it -n team-b -- sh

在 test-pod 裡面嘗試:

# 方法 1:只用 Service 名稱 — 失敗!
wget -qO- http://web-svc
# 會失敗,因為 web-svc 在 team-a,不在 team-b

# 方法 2:用完整的 DNS 名稱 — 成功!
wget -qO- http://web-svc.team-a.svc.cluster.local
# 會成功,因為帶上了 Namespace 名稱

# 方法 3:簡短格式也可以
wget -qO- http://web-svc.team-a

https://ithelp.ithome.com.tw/upload/images/20260820/20181928lSrmRAw4NE.png

💡 跨 Namespace 的 Service DNS

  • 同 Namespace:<service-name>
  • 跨 Namespace:<service-name>.<namespace>
  • 完整格式:<service-name>.<namespace>.svc.cluster.local

練習 3:查看資源分布

# 看看目前所有 Namespace 裡有哪些 Pod
kubectl get pods -A

# 只看某個 Namespace
kubectl get all -n team-a

小結

今天我們學了 Namespace —— Kubernetes 的資源隔離與分組管理機制:

重點 說明
Namespace 是什麼 叢集內的邏輯分組單位,可以想成資料夾或辦公大樓的樓層
預設 Namespace defaultkube-systemkube-publickube-node-lease
名稱隔離 不同 Namespace 可以存在同名資源,彼此不衝突
跨 Namespace 存取 Service 可以透過 <service>.<namespace>.svc.cluster.local 存取
刪除 Namespace 會連帶刪除該 Namespace 裡的 Namespaced 資源 ⚠️
邏輯隔離 Namespace 本身不是完整的安全邊界,權限與網路限制通常要搭配 RBAC、NetworkPolicy

到目前為止,我們建立 Kubernetes 資源時,大多都是自己撰寫 YAML,再使用 kubectl apply 一個一個部署。

但當應用越來越複雜,需要同時管理 Deployment、Service、ConfigMap、Secret 等一整組資源時,手動維護就會變得越來越麻煩。

明天我們來學 Helm —— Kubernetes 的套件管理工具,看看如何把一整組 Kubernetes 資源打包、設定並一次部署!


參考資源


上一篇
Day 18|Sidecar Container — Pod 的最佳副手
下一篇
Day 20|Helm — Kubernetes 的套件管理工具
系列文
從零到 CKA:30 天掌握 Kubernetes 核心觀念與實作20
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言