概念解析
Namespace是Kubernetes中用於實現資源隔離和多租户管理的機制。它將集羣資源劃分為多個虛擬集羣,每個Namespace內的資源名稱必須唯一,但不同Namespace間的資源可以重名。
核心概念
- 資源隔離:將集羣資源劃分為多個邏輯分區
- 命名空間:為資源提供作用域,避免命名衝突
- 多租户支持:支持多個團隊或項目共享同一集羣
- 資源配額:可以為Namespace設置資源限制
Namespace的工作原理
- 作用域隔離:同一Namespace內的資源必須有唯一的名稱
- 網絡隔離:通過網絡策略實現不同Namespace間的網絡隔離
- 資源管理:通過ResourceQuota限制Namespace的資源使用
- 訪問控制:通過RBAC控制不同用户對Namespace的訪問權限
核心特性
- 資源隔離:將集羣資源劃分為多個邏輯分區
- 命名作用域:為資源提供命名作用域,避免命名衝突
- 資源配額:支持為Namespace設置CPU、內存、存儲等資源限制
- 訪問控制:支持基於角色的訪問控制(RBAC)
- 默認Namespace:默認提供default、kube-system、kube-public等Namespace
- 標籤和註解:支持為Namespace添加標籤和註解進行分類管理
實踐教程
創建Namespace
# 使用kubectl創建
kubectl create namespace development
# 使用YAML文件創建
cat <<EOF > namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
name: production
labels:
environment: production
team: backend
EOF
kubectl apply -f namespace.yaml
在Namespace中創建資源
# 指定Namespace創建Pod
kubectl create deployment nginx --image=nginx -n development
# 使用YAML文件指定Namespace
cat <<EOF > pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: my-pod
namespace: production
spec:
containers:
- name: app
image: busybox
command: ["sleep", "3600"]
EOF
kubectl apply -f pod.yaml
切換Namespace上下文
# 設置默認Namespace
kubectl config set-context --current --namespace=development
# 查看當前上下文
kubectl config view | grep namespace
# 臨時指定Namespace
kubectl get pods -n production
真實案例
案例:企業級多環境管理平台
某大型企業在Kubernetes集羣中運行開發、測試、預發佈和生產等多個環境,通過Namespace實現環境隔離和資源管理:
# 開發環境Namespace
apiVersion: v1
kind: Namespace
metadata:
name: dev
labels:
environment: development
team: all
annotations:
description: "Development environment for all teams"
---
# 測試環境Namespace
apiVersion: v1
kind: Namespace
metadata:
name: test
labels:
environment: testing
team: qa
annotations:
description: "Testing environment for QA team"
---
# 預發佈環境Namespace
apiVersion: v1
kind: Namespace
metadata:
name: staging
labels:
environment: staging
team: operations
annotations:
description: "Staging environment for pre-production testing"
---
# 生產環境Namespace
apiVersion: v1
kind: Namespace
metadata:
name: production
labels:
environment: production
team: operations
annotations:
description: "Production environment - handle with care"
---
# ResourceQuota for development environment
apiVersion: v1
kind: ResourceQuota
metadata:
name: dev-resource-quota
namespace: dev
spec:
hard:
requests.cpu: "2"
requests.memory: 4Gi
limits.cpu: "4"
limits.memory: 8Gi
persistentvolumeclaims: "10"
services.loadbalancers: "0"
services.nodeports: "0"
---
# ResourceQuota for production environment
apiVersion: v1
kind: ResourceQuota
metadata:
name: prod-resource-quota
namespace: production
spec:
hard:
requests.cpu: "16"
requests.memory: 32Gi
limits.cpu: "32"
limits.memory: 64Gi
persistentvolumeclaims: "50"
services.loadbalancers: "10"
services.nodeports: "5"
---
# LimitRange for development environment
apiVersion: v1
kind: LimitRange
metadata:
name: dev-limit-range
namespace: dev
spec:
limits:
- default:
cpu: 200m
memory: 256Mi
defaultRequest:
cpu: 100m
memory: 128Mi
type: Container
---
# LimitRange for production environment
apiVersion: v1
kind: LimitRange
metadata:
name: prod-limit-range
namespace: production
spec:
limits:
- default:
cpu: 1
memory: 2Gi
defaultRequest:
cpu: 500m
memory: 1Gi
type: Container
---
# Network Policy for production environment
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: prod-network-policy
namespace: production
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
ingress:
- from:
- namespaceSelector:
matchLabels:
environment: staging
- podSelector:
matchLabels:
app: monitoring
egress:
- to:
- namespaceSelector:
matchLabels:
environment: production
---
# RBAC for development team
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: dev
name: dev-developer
rules:
- apiGroups: [""]
resources: ["pods", "services", "configmaps", "secrets"]
verbs: ["get", "list", "create", "update", "delete"]
- apiGroups: ["apps"]
resources: ["deployments", "statefulsets", "daemonsets"]
verbs: ["get", "list", "create", "update", "delete"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: dev-developers
namespace: dev
subjects:
- kind: User
name: alice
apiGroup: rbac.authorization.k8s.io
- kind: User
name: bob
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: dev-developer
apiGroup: rbac.authorization.k8s.io
這種多環境管理方案的優勢:
- 環境隔離:不同環境的資源完全隔離
- 資源控制:為不同環境設置不同的資源配額
- 訪問控制:為不同團隊設置不同的訪問權限
- 網絡安全:通過網絡策略控制環境間的通信
- 標準化管理:統一的環境管理規範
配置詳解
Namespace標籤和註解
apiVersion: v1
kind: Namespace
metadata:
name: example-namespace
labels:
environment: production
team: backend
cost-center: cc-1234
compliance: pci-dss
annotations:
description: "Example namespace for production workloads"
contact: "backend-team@example.com"
sla-level: "high"
backup-required: "true"
ResourceQuota配置
apiVersion: v1
kind: ResourceQuota
metadata:
name: compute-resources
namespace: example
spec:
hard:
# 計算資源配額
requests.cpu: "4"
requests.memory: 8Gi
limits.cpu: "8"
limits.memory: 16Gi
# 存儲資源配額
requests.storage: 500Gi
persistentvolumeclaims: "20"
# 對象數量配額
pods: "50"
services: "20"
services.loadbalancers: "5"
services.nodeports: "10"
configmaps: "100"
secrets: "100"
replicationcontrollers: "20"
resourcequotas: "1"
LimitRange配置
apiVersion: v1
kind: LimitRange
metadata:
name: container-limits
namespace: example
spec:
limits:
# 容器資源限制
- default:
cpu: 500m
memory: 512Mi
defaultRequest:
cpu: 100m
memory: 256Mi
max:
cpu: "2"
memory: 2Gi
min:
cpu: 50m
memory: 64Mi
type: Container
# Pod資源限制
- max:
cpu: "4"
memory: 4Gi
type: Pod
# PersistentVolumeClaim限制
- default:
storage: 10Gi
max:
storage: 50Gi
min:
storage: 1Gi
type: PersistentVolumeClaim
故障排除
常見問題及解決方案
-
資源配額不足
# 查看Namespace配額 kubectl describe quota -n <namespace> # 查看資源使用情況 kubectl describe namespace <namespace> # 調整配額 kubectl edit resourcequota <quota-name> -n <namespace> -
跨Namespace訪問被拒絕
# 檢查網絡策略 kubectl get networkpolicy -n <namespace> # 檢查RBAC權限 kubectl auth can-i <verb> <resource> --namespace <namespace> # 檢查服務賬户權限 kubectl describe rolebinding -n <namespace> -
對象創建失敗
# 檢查對象創建事件 kubectl describe <resource> <name> -n <namespace> # 檢查LimitRange限制 kubectl describe limitrange -n <namespace> # 檢查ResourceQuota kubectl describe quota -n <namespace> -
Namespace刪除卡住
# 查看Namespace狀態 kubectl get namespace <namespace> # 檢查Finalizers kubectl get namespace <namespace> -o yaml # 強制刪除(謹慎使用) kubectl delete namespace <namespace> --force --grace-period=0
最佳實踐
-
命名規範:
- 使用有意義的Namespace名稱
- 遵循統一的命名約定
- 為不同環境使用不同的前綴或後綴
-
資源管理:
- 為每個Namespace設置ResourceQuota
- 配置合適的LimitRange
- 定期監控資源使用情況
-
訪問控制:
- 為不同團隊設置獨立的Namespace
- 使用RBAC控制訪問權限
- 定期審計訪問日誌
-
標籤管理:
- 為Namespace添加環境、團隊等標籤
- 使用標籤進行資源分類和查詢
- 建立標籤使用規範
-
安全管理:
- 為生產環境設置網絡策略
- 限制特權容器的使用
- 定期審查Namespace配置
安全考慮
使用網絡策略隔離Namespace
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-all
namespace: production
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-from-monitoring
namespace: production
spec:
podSelector: {}
policyTypes:
- Ingress
ingress:
- from:
- namespaceSelector:
matchLabels:
name: monitoring
使用RBAC控制Namespace訪問
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: production
name: prod-admin
rules:
- apiGroups: ["*"]
resources: ["*"]
verbs: ["*"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: prod-admins
namespace: production
subjects:
- kind: User
name: admin-user
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: prod-admin
apiGroup: rbac.authorization.k8s.io
限制特權操作
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
name: restricted-psp
spec:
privileged: false
allowPrivilegeEscalation: false
requiredDropCapabilities:
- ALL
volumes:
- 'configMap'
- 'emptyDir'
- 'projected'
- 'secret'
- 'downwardAPI'
- 'persistentVolumeClaim'
hostNetwork: false
hostIPC: false
hostPID: false
runAsUser:
rule: 'MustRunAsNonRoot'
seLinux:
rule: 'RunAsAny'
supplementalGroups:
rule: 'MustRunAs'
ranges:
- min: 1
max: 65535
fsGroup:
rule: 'MustRunAs'
ranges:
- min: 1
max: 65535
命令速查
| 命令 | 描述 |
|---|---|
kubectl get namespaces |
查看Namespace列表 |
kubectl describe namespace <name> |
查看Namespace詳細信息 |
kubectl create namespace <name> |
創建Namespace |
kubectl delete namespace <name> |
刪除Namespace |
kubectl config set-context --current --namespace=<name> |
設置默認Namespace |
kubectl get pods -n <namespace> |
查看指定Namespace的Pod |
kubectl get quota -n <namespace> |
查看Namespace的資源配額 |
kubectl get limitrange -n <namespace> |
查看Namespace的限制範圍 |
kubectl get networkpolicy -n <namespace> |
查看Namespace的網絡策略 |
kubectl get all -n <namespace> |
查看Namespace中的所有資源 |
總結
Namespace是Kubernetes中實現資源隔離和多租户管理的核心機制。通過本文檔的學習,你應該能夠:
- 理解Namespace的概念和工作機制
- 創建和管理Namespace
- 配置資源配額和限制範圍
- 實現環境隔離和訪問控制
- 排查常見的Namespace問題
- 遵循Namespace管理的最佳實踐和安全考慮
在下一文檔中,我們將學習RBAC權限控制,它是保障Kubernetes集羣安全的重要機制。