什么是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实施最小权限原则,限制对命名空间的访问
  • 使用网络策略控制命名空间之间的网络流量
  • 为不同的环境(开发、测试、生产)使用不同的命名空间
  • 定期清理不再使用的命名空间,释放集群资源
Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐