承接 Day 6(Ingress 與 TLS),今天切入 Kubernetes 安全與多租戶基礎:Namespace 隔離、ResourceQuota、LimitRange 與 Pod Security。這些設定能確保「多使用者共享叢集」時,大家不會互相踩線或濫用資源。
為什麼要做資源與安全隔離?
避免資源爭用:若某個使用者部署了吃滿 GPU/CPU 的 Pod,會影響整個叢集。
清楚邊界:不同專案或團隊放在不同 Namespace,方便管理與清理。
預防風險:限制 Pod 權限,避免惡意或錯誤操作傷害叢集。
A. Namespace:邏輯邊界
預設只有 default、kube-system、kube-public 等 Namespace。
建議每個專案/團隊建立獨立 Namespace,例如:
kubectl create namespace robotics
kubectl create namespace ai-lab
這樣一來:
ResourceQuota / LimitRange 可以針對不同 Namespace 設定。
RBAC 權限也可按 Namespace 維度授予。
B. ResourceQuota:避免資源被耗盡
範例:限制 Namespace 可用總資源
apiVersion: v1
kind: ResourceQuota
metadata:
name: quota-robotics
namespace: robotics
spec:
hard:
requests.cpu: "16"
requests.memory: 64Gi
limits.cpu: "32"
limits.memory: 128Gi
requests.nvidia.com/gpu: "4"
persistentvolumeclaims: "10"
pods: "50"
套用:
kubectl apply -f quota-robotics.yaml
這樣能避免某個團隊一次性開太多 Pod 或霸佔所有 GPU。
C. LimitRange:每個 Pod/Container 的預設限制
ResourceQuota 管總量,LimitRange 管單體:
apiVersion: v1
kind: LimitRange
metadata:
name: limits
namespace: robotics
spec:
limits:
預設 request:如果使用者沒填,會自動套用。
預設 limit:避免單個容器吃光節點資源。
D. Pod Security(v1.25+ 新方式)
舊的 PodSecurityPolicy 已移除,現在用 Pod Security Admission (PSA)。
三個模式:
Privileged:最高權限(建議只給 infra 命名空間)。
Baseline:禁止大多數危險操作(建議大部分專案用)。
Restricted:最嚴格(需 non-root、有限能力)。
範例:對 robotics 命名空間套 Baseline
apiVersion: v1
kind: Namespace
metadata:
name: robotics
labels:
pod-security.kubernetes.io/enforce: baseline
pod-security.kubernetes.io/audit: baseline
pod-security.kubernetes.io/warn: baseline
若 Namespace 已存在,則用 kubectl label ns robotics ... 追加標籤。
常見問題
Quota 設太小:導致正常工作跑不起來 → 請與團隊溝通需求再調整。
LimitRange 忘了設:使用者部署 Pod 沒填資源 → scheduler 難以排程,影響公平性。
PSA 太嚴格:某些應用需要特權 → 建立專用 Namespace 並套用不同標籤,避免波及其他工作負載。
#感想
疲れた