Kubernetes Namespace 命名空间
Kubernetes Namespace 命名空间
什么是 Namespace
Namespace 是 Kubernetes 中用于将集群资源划分为多个虚拟集群的机制。它为不同团队、项目或环境提供逻辑隔离,避免资源名称冲突,并支持基于命名空间的访问控制和资源配额。
默认命名空间
Kubernetes 默认创建以下命名空间:
kubectl get namespaces
输出示例:
NAME STATUS AGE
default Active 1d
kube-system Active 1d
kube-public Active 1d
kube-node-lease Active 1d
创建 Namespace
通过命令行创建
kubectl create namespace dev
kubectl create namespace staging
kubectl create namespace production
通过 YAML 文件创建
apiVersion: v1
kind: Namespace
metadata:
name: dev
labels:
env: development
team: backend
kubectl apply -f namespace.yaml
使用 Namespace
指定命名空间创建资源
kubectl run my-pod --image=nginx --namespace=dev
kubectl create deployment my-app --image=nginx --namespace=dev
kubectl apply -f deployment.yaml -n dev
切换默认命名空间
# 临时切换
kubectl config set-context --current --namespace=dev
# 查看当前命名空间
kubectl config view --minify | grep namespace
查看所有命名空间的资源
# 查看所有命名空间的 Pod
kubectl get pods --all-namespaces
# 查看特定命名空间的资源
kubectl get pods -n dev
资源配额管理
ResourceQuota
限制命名空间的资源使用:
apiVersion: v1
kind: ResourceQuota
metadata:
name: dev-quota
namespace: dev
spec:
hard:
requests.cpu: "4"
requests.memory: "8Gi"
limits.cpu: "8"
limits.memory: "16Gi"
pods: "20"
services: "10"
persistentvolumeclaims: "5"
LimitRange
设置默认资源限制:
apiVersion: v1
kind: LimitRange
metadata:
name: dev-limits
namespace: dev
spec:
limits:
- type: Container
default:
cpu: "500m"
memory: "512Mi"
defaultRequest:
cpu: "100m"
memory: "128Mi"
max:
cpu: "2"
memory: "2Gi"
min:
cpu: "50m"
memory: "64Mi"
命名空间的网络隔离
NetworkPolicy
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: dev-network-policy
namespace: dev
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
ingress:
- from:
- namespaceSelector:
matchLabels:
env: development
egress:
- to:
- namespaceSelector:
matchLabels:
env: development
标签和选择器
给命名空间打标签
kubectl label namespace dev env=development
kubectl label namespace staging env=staging
kubectl label namespace production env=production
按标签选择命名空间
kubectl get namespaces -l env=development
清理 Namespace
# 删除命名空间及其所有资源
kubectl delete namespace dev
# 仅删除命名空间(保留资源)
kubectl delete ns dev --cascade=orphan
命名空间与集群资源
查看命名空间资源使用情况
kubectl top nodes
kubectl top pods -n dev
查看命名空间的资源配额
kubectl get resourcequota -n dev
kubectl describe resourcequota dev-quota -n dev
实践案例:多环境部署
# 创建三个环境的命名空间
for env in dev staging production; do
kubectl create namespace $env
done
# 为每个环境创建资源配额
kubectl apply -f resource-quota.yaml -n dev
kubectl apply -f resource-quota.yaml -n staging
kubectl apply -f resource-quota.yaml -n production
# 在不同环境部署应用
kubectl apply -f deployment.yaml -n dev
kubectl apply -f deployment.yaml -n staging
kubectl apply -f deployment.yaml -n production
最佳实践
- 使用命名空间隔离不同团队和项目
- 设置资源配额防止资源滥用
- 使用 NetworkPolicy 实现网络隔离
- 为命名空间添加有意义的标签
- 定期清理未使用的命名空间
总结
Namespace 是 Kubernetes 多租户和资源隔离的基础。通过合理使用 Namespace,可以有效管理集群资源,实现环境隔离和访问控制。