今天來介紹 namespace , 這是 k8s 設計出來抽象的 virtual cluster , 可以應用的層面很廣,下面我們就來依依說明。

namespace 可以應用在不同的商業情境、不同的開發團隊,讓一個實體的 k8s cluster,可以切出幾個虛擬的 cluster。

kubectl --kubeconfig ~/.kube/k3s.yaml get namespace
NAME                 STATUS   AGE
default              Active   8d
kube-system          Active   8d
kube-public          Active   8d
kube-node-lease      Active   8d

Namespace 特點

  • 在同一個 K8s 中,每個 Namespaces 的名稱都是要獨特的
  • 當一個 Namespaces 被刪除時,在該 Namespace 裡的所有物件也會被刪除
  • 可以透過 Resource Quotas 限制一個 Namespaces 所可以存取的資源

資源限制

apiVersion: v1
kind: Namespace
metadata:
  name: test-namespace
---
apiVersion: v1
kind: ResourceQuota
metadata:
  name: compute-quotas
  namespace: test-namespace
spec:
  hard:
    requests.cpu: "1"
    requests.memory: 1Gi
    limits.cpu: "1"
    requests.memory: 10Gi

實務分享

夠過上面的設定就能限制住各個 namespace 硬體資源的控制。

這邊跟大家分享一下,我服務公司的 namespace 架構的討論。

k8s-namespace

我們實體的 k8s 架設了三份,分成 dev、qa、prod。然後每個專案在三個站都會有獨立 namespace。雖然這樣的設定比較花錢 (三套 k8s),但是因為 k8s 本身也是會有需要升級的問題,如果用一個站台依照 dev、qa、prod 去切換 namespace的話,k8s 只要一升級,同時影響的範圍會很大。所以最終我們決定採取拆三套才能保障真正的隔離乾淨。