跳转到内容

Kubernetes命名空间

来自代码酷

Kubernetes命名空间[编辑 | 编辑源代码]

介绍[编辑 | 编辑源代码]

Kubernetes命名空间(Namespace)是Kubernetes中用于组织和隔离集群资源的逻辑分区机制。命名空间允许用户将集群划分为多个虚拟集群,每个命名空间内的资源名称必须唯一,但不同命名空间中的资源可以同名。命名空间常用于以下场景:

  • 多团队/多项目环境下的资源隔离
  • 开发/测试/生产环境分离
  • 权限和资源配额管理

核心特性[编辑 | 编辑源代码]

资源隔离[编辑 | 编辑源代码]

命名空间提供了一种轻量级的隔离机制,不同命名空间中的资源(如Pod、Service等)默认互相不可见,但可以通过特定配置实现跨命名空间通信。

名称唯一性[编辑 | 编辑源代码]

资源名称在命名空间内必须唯一,但在不同命名空间中可以重复。例如:

  • dev/nginxprod/nginx 是两个完全独立的服务

资源配额[编辑 | 编辑源代码]

可以通过ResourceQuota为命名空间设置计算资源(CPU、内存)和对象数量(Pod、Service等)的限制。

默认命名空间[编辑 | 编辑源代码]

Kubernetes安装后会创建以下默认命名空间:

  • default:用户资源的默认命名空间
  • kube-system:Kubernetes系统组件
  • kube-public:对所有用户可读的资源
  • kube-node-lease:节点心跳信息

基本操作[编辑 | 编辑源代码]

查看命名空间[编辑 | 编辑源代码]

# 列出所有命名空间
kubectl get namespaces
# 或简写为
kubectl get ns

输出示例:

NAME              STATUS   AGE
default           Active   15d
kube-system       Active   15d
kube-public       Active   15d
kube-node-lease   Active   15d

创建命名空间[编辑 | 编辑源代码]

# 通过命令行创建
kubectl create namespace dev

# 通过YAML文件创建
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Namespace
metadata:
  name: dev
EOF

在特定命名空间中创建资源[编辑 | 编辑源代码]

# 方法1:使用--namespace参数
kubectl run nginx --image=nginx --namespace=dev

# 方法2:在YAML中指定命名空间
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  name: nginx
  namespace: dev
spec:
  containers:
  - name: nginx
    image: nginx
EOF

高级用法[编辑 | 编辑源代码]

跨命名空间服务访问[编辑 | 编辑源代码]

服务可以通过服务名.命名空间.svc.cluster.local的格式跨命名空间访问:

apiVersion: v1
kind: Pod
metadata:
  name: consumer
  namespace: prod
spec:
  containers:
  - name: busybox
    image: busybox
    command: ["sh", "-c", "wget -O- http://nginx.dev.svc.cluster.local"]

资源配额示例[编辑 | 编辑源代码]

apiVersion: v1
kind: ResourceQuota
metadata:
  name: mem-cpu-quota
  namespace: dev
spec:
  hard:
    requests.cpu: "1"
    requests.memory: 1Gi
    limits.cpu: "2"
    limits.memory: 2Gi

实际应用案例[编辑 | 编辑源代码]

多环境隔离[编辑 | 编辑源代码]

企业通常使用命名空间来隔离不同环境:

  • dev:开发环境
  • staging:预发布环境
  • prod:生产环境

多租户场景[编辑 | 编辑源代码]

SaaS提供商可以为每个客户创建独立的命名空间:

  • tenant-a
  • tenant-b
  • tenant-c

命名空间关系图[编辑 | 编辑源代码]

Cluster
NamespaceA
NamespaceB
NamespaceC
Pod1
Service1
Pod2
Service2

限制与注意事项[编辑 | 编辑源代码]

  • 命名空间不提供网络隔离(需配合NetworkPolicy使用)
  • 部分资源是集群范围的(如PersistentVolume、Node等),不受命名空间限制
  • 删除命名空间会删除其中的所有资源

数学表示[编辑 | 编辑源代码]

命名空间可以形式化表示为: Namespace=(Name,{Resource1,Resource2,...,Resourcen},Quota) 其中:

  • Name 是命名空间标识符
  • {Resource} 是该命名空间下的资源集合
  • Quota 是资源配额配置

最佳实践[编辑 | 编辑源代码]

  • 为不同环境使用不同命名空间
  • 使用有意义的命名空间名称
  • 为关键命名空间设置资源配额
  • 避免在default命名空间中部署应用
  • 定期清理未使用的命名空间