Kubernetes Namespace 使用指南

Kubernetes Namespace 使用指南

什麼是 Namespace?

Kubernetes Namespace 是一個 API 物件,用於在 Kubernetes 叢集中創建虛擬的資源隔離環境。Namespace 提供了一種將叢集資源劃分為多個獨立區域的方式,讓不同的團隊、專案或環境可以在同一個叢集中安全地共存。

Namespace 的主要功能:

  • 資源隔離:將不同的應用程式或環境分隔在不同的命名空間中
  • 存取控制:透過 RBAC 實現細粒度的權限管理
  • 資源配額管理:限制每個命名空間可使用的叢集資源量
  • 名稱空間管理:避免資源名稱衝突,支援相同名稱的資源存在於不同命名空間

為什麼使用 Namespace?

相較於將所有資源都放在預設命名空間中,Namespace 提供了更好的資源管理方式:

  1. 多租戶支援:讓多個團隊或專案安全地共享同一個 Kubernetes 叢集
  2. 環境分離:清楚區分開發、測試、生產等不同環境的資源
  3. 資源管理:透過資源配額控制每個環境的資源使用量
  4. 權限控制:實現精細的存取權限管理,提升安全性

預設 Namespace

Kubernetes 叢集預設會創建四個系統命名空間:

  • kube-system: 存放 Kubernetes 系統元件,如 kube-dns、kube-proxy、etcd 等核心服務
  • kube-public: 公開可讀的命名空間,通常用於存放叢集資訊,所有使用者(包括未認證使用者)都可以讀取
  • kube-node-lease: 用於 Node 租約物件,幫助確定 Node 的可用性和健康狀態
  • default: 預設命名空間,當沒有指定命名空間時,資源會被創建在這裡

建立自定義 Namespace

方法一:使用 YAML 檔案建立

建立 dockertest-namespace.yaml 檔案:

1
2
3
4
5
6
7
apiVersion: v1
kind: Namespace
metadata:
name: dockertest-namespace
labels:
name: dockertest-namespace
environment: dev

套用設定檔:

1
kubectl create -f dockertest-namespace.yaml

方法二:使用指令直接建立

1
kubectl create namespace dockertest-namespace

檢視所有 Namespace

1
2
3
kubectl get namespaces
# 或使用簡寫
kubectl get ns

在指定 Namespace 中操作資源

在特定 Namespace 建立資源

1
2
3
4
5
# 在指定的 namespace 中建立 pod
kubectl run nginx --image=nginx -n dockertest-namespace

# 使用 YAML 檔案建立資源到指定 namespace
kubectl apply -f dockertest-deployment.yaml -n dockertest-namespace

設定預設 Namespace

1
2
3
4
5
# 設定當前 context 的預設 namespace
kubectl config set-context --current --namespace=dockertest-namespace

# 確認目前的 context 設定
kubectl config view --minify | grep namespace

檢視 Namespace 中的資源

1
2
3
4
5
6
7
8
# 檢視指定 namespace 中的所有 pod
kubectl get pods -n dockertest-namespace

# 檢視所有 namespace 中的 pod
kubectl get pods --all-namespaces

# 檢視 namespace 的詳細資訊
kubectl describe namespace dockertest-namespace

刪除 Namespace

注意:刪除 Namespace 會同時刪除該命名空間內的所有資源!

1
kubectl delete namespace dockertest-namespace

資源配額管理

為 Namespace 設定資源限制,避免某個環境消耗過多叢集資源:

1
2
3
4
5
6
7
8
9
10
11
12
13
apiVersion: v1
kind: ResourceQuota
metadata:
name: compute-quota
namespace: dockertest-namespace
spec:
hard:
requests.cpu: "4"
requests.memory: 8Gi
limits.cpu: "8"
limits.memory: 16Gi
persistentvolumeclaims: "10"
pods: "10"

最佳實踐建議

  1. 環境分離:為不同環境(開發、測試、生產)建立獨立的命名空間
  2. 團隊隔離:為不同團隊或專案建立專用的命名空間
  3. 命名規範:採用一致的命名規範,如 team-environment 格式
  4. 資源配額:為每個命名空間設定合適的資源配額
  5. 權限控制:結合 RBAC 實現細粒度的權限管理
  6. 監控標籤:為命名空間加上有意義的標籤,便於監控和管理

範例命名建議:

  • frontend-devfrontend-prod
  • backend-stagingbackend-prod
  • team-alpha-devteam-beta-prod