Kubernetes命名空间
什么是Kubernetes命名空间?
Kubernetes命名空间是一种虚拟集群机制,它允许在同一个物理集群中创建多个隔离的环境。命名空间为资源名称提供了一个作用域,使得资源名称在命名空间内必须是唯一的,但可以跨命名空间重复使用。
命名空间在同一个物理集群中创建虚拟集群
命名空间是Kubernetes实现多租户功能的核心机制,它允许不同的团队、项目或环境共享同一个Kubernetes集群,同时保持资源的隔离性和组织的清晰性。
命名空间的核心特性
资源隔离
命名空间提供了一种逻辑隔离机制,允许不同团队或项目在同一个集群中工作而不会相互干扰。
名称作用域
资源名称只需在命名空间内保持唯一,不同命名空间可以有相同名称的资源。
资源配额
可以为每个命名空间设置资源配额,限制其可以使用的计算资源和对象数量。
访问控制
通过RBAC(基于角色的访问控制),可以精细控制用户对特定命名空间的访问权限。
网络策略
可以使用网络策略控制命名空间内外的网络流量,增强安全性。
资源组织
命名空间帮助组织和分类集群中的资源,使管理更加清晰和高效。
默认命名空间
Kubernetes集群安装后会自动创建几个默认的命名空间:
| 命名空间 | 用途 |
|---|---|
| default | 未指定命名空间的对象的默认命名空间 |
| kube-system | 由Kubernetes系统创建的对象的命名空间 |
| kube-public | 对所有用户可读的资源的命名空间(包括未认证用户) |
| kube-node-lease | 用于节点租约对象的命名空间,提高节点心跳性能 |
命名空间操作指南
创建命名空间
可以使用YAML文件或直接使用kubectl命令创建命名空间:
# 通过YAML文件创建
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Namespace
metadata:
name: development
EOF
# 使用kubectl命令直接创建
kubectl create namespace production
查看命名空间
# 列出所有命名空间
kubectl get namespaces
kubectl get ns # 简写形式
# 查看特定命名空间的详细信息
kubectl describe namespace development
在命名空间中创建资源
创建资源时,可以通过命令行参数或YAML文件指定命名空间:
# 命令行指定命名空间
kubectl run nginx --image=nginx -n development
# 在YAML中指定命名空间
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
name: my-pod
namespace: development
spec:
containers:
- name: nginx
image: nginx
EOF
设置默认命名空间
可以配置kubectl使用特定的命名空间作为默认值:
# 查看当前上下文
kubectl config current-context
# 设置默认命名空间
kubectl config set-context --current --namespace=development
# 验证更改
kubectl config view --minify | grep namespace
删除命名空间
注意:删除命名空间将删除其中的所有资源,此操作不可逆!
# 删除命名空间及其所有资源
kubectl delete namespace development
# 使用YAML文件删除
kubectl delete -f namespace.yaml
命名空间使用场景
多团队环境
为每个团队创建独立的命名空间,实现资源隔离和权限控制。
环境隔离
为开发、测试和生产环境创建不同的命名空间,确保环境一致性。
实验和测试
在独立的命名空间中运行实验性工作负载,避免影响生产环境。
资源配额管理
为不同项目或客户设置资源配额,确保公平分配集群资源。
资源配额和限制范围
命名空间可以与ResourceQuota和LimitRange资源结合使用,实现精细的资源管理:
# 创建资源配额
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: ResourceQuota
metadata:
name: compute-resources
namespace: development
spec:
hard:
requests.cpu: "10"
requests.memory: 20Gi
limits.cpu: "20"
limits.memory: 40Gi
pods: "50"
EOF
# 创建限制范围
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: LimitRange
metadata:
name: mem-limit-range
namespace: development
spec:
limits:
- default:
memory: 512Mi
defaultRequest:
memory: 256Mi
type: Container
EOF
最佳实践
- 为每个应用程序或微服务使用独立的命名空间
- 使用资源配额防止单个命名空间消耗过多集群资源
- 通过RBAC实施最小权限原则,限制对命名空间的访问
- 使用网络策略控制命名空间之间的网络流量
- 为不同的环境(开发、测试、生产)使用不同的命名空间
- 定期清理不再使用的命名空间,释放集群资源
更多推荐



所有评论(0)