昨天我們學了 Sidecar Container —— Pod 內多 Container 協作的核心模式,讓輔助 Container 可以持續協助主要 Container 處理 Log、Proxy、Sync 等工作。
但到目前為止,我們建立的 Pod、Service、Deployment,大多都放在同一個地方 —— default Namespace。
當叢集裡的資源越來越多,如果不同團隊、不同環境(Dev / Staging / Prod)的資源全部混在一起,管理起來就會變得很混亂。
這時候,就需要用到今天的主角:Namespace。
Namespace 可以把同一個 Kubernetes 叢集中的資源分成不同的邏輯區域,方便進行分類、管理與權限控制。
今天我們來學:
以下操作皆在 master 節點 執行。
Namespace 是 Kubernetes 提供的一種邏輯隔離機制,用來將同一個叢集中的資源分組管理。
你可以把它想成叢集裡的「資料夾」:
Namespace 負責把資源分組;RBAC 負責權限;NetworkPolicy 負責網路存取控制。
| 場景 | 沒有 Namespace | 有 Namespace |
|---|---|---|
| 多環境 | Dev / Staging / Prod 的資源全混在一起 | 每個環境放在不同 Namespace,方便分類與管理 |
| 多團隊 | 團隊 A 和團隊 B 的資源名稱容易互相衝突 | 各自在自己的 Namespace 裡,名稱可以獨立管理 |
| 資源配額 | 不容易限制某個團隊可以使用多少 CPU / Memory | 可以透過 ResourceQuota 限制每個 Namespace 的資源用量 |
| 權限控制 | 權限範圍不容易切分 | 可以透過 RBAC 控制誰能操作哪些 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
想像一棟辦公大樓:
對應到 Kubernetes:
| 辦公大樓 | Kubernetes |
|---|---|
| 整棟大樓 | Cluster |
| 樓層(3F 行銷部、5F 工程部) | Namespace(marketing、engineering) |
| 樓層裡的辦公室、設備 | Pod、Service、Deployment 等 |
| 大樓共用設施 | Node、PV、ClusterRole 等 |
| 每層樓的門禁權限 | RBAC |
| 樓層之間的通行限制 | NetworkPolicy |
💡 重要觀念
Namespace 提供的是邏輯上的分組與隔離,不是完整的安全邊界。
預設情況下,不同 Namespace 裡的 Pod 仍然可以互相通訊。
如果要進一步限制:
- 誰可以操作哪些資源 → 使用 RBAC
- 哪些 Pod 可以互相通訊 → 使用 NetworkPolicy
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-apiserver、kube-scheduler、kube-controller-manager、etcd等 Control Plane 元件。
方法 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
kubectl get namespaces
# 縮寫
kubectl get ns
# 在 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

如果覺得每次執行指令都加上 -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

⚠️ 注意
切換預設 Namespace 後,所有沒有加上
-n的 kubectl 指令,都會操作目前 context 設定的 Namespace。使用完後記得確認目前所在的 Namespace,避免不小心操作到錯誤的環境。
kubectl delete namespace dev
⚠️ 危險操作
刪除 Namespace 時,該 Namespace 裡的 Pod、Service、Deployment、ConfigMap、Secret 等 Namespaced 資源也會一起被刪除。
執行前一定要再次確認 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

會看到:
team-a 和 team-b 裡都可以各自存在一個名叫 nginx 的 Pod也就是說:
同一個 Namespace 內不能有兩個同名 Pod,但不同 Namespace 可以有相同名稱的 Pod。
# 對照:查看所有 Namespace 的 Pod
kubectl get pods -A | grep nginx
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

💡 跨 Namespace 的 Service DNS
- 同 Namespace:
<service-name>- 跨 Namespace:
<service-name>.<namespace>- 完整格式:
<service-name>.<namespace>.svc.cluster.local
# 看看目前所有 Namespace 裡有哪些 Pod
kubectl get pods -A
# 只看某個 Namespace
kubectl get all -n team-a
今天我們學了 Namespace —— Kubernetes 的資源隔離與分組管理機制:
| 重點 | 說明 |
|---|---|
| Namespace 是什麼 | 叢集內的邏輯分組單位,可以想成資料夾或辦公大樓的樓層 |
| 預設 Namespace | default、kube-system、kube-public、kube-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 資源打包、設定並一次部署!