namespace是k8s集群级别的资源,用于将集群分隔为多个隔离的逻辑分区以配置给不同的用户、租户、环境或项目使用,例如,可以为development、qa、和production应用环境分别创建各自的名称空间。
k8s的绝大多数资源都隶属于名称空间级别(另一个是全局级别或集群级别),namespace为这类资源提供了隔离的作用域,同一名称空间内的同一类资源名必须是唯一的,但跨名称空间时并无此限制。k8s还有一些资源隶属于集群级别的,如node、namespace、PersistentVolume等资源,它们不属于任何名称空间,因此资源对象的名称必须全局唯一。
k8s的名称空间资源不同于linux系统的名称空间,它们是各自独立的概念,另外,k8s的名称空间并不能实现pod间的通信隔离,它仅用于限制资源对象名称的作用域。
1、查看名称空间及其资源对象
k8s集群默认提供了几个名称空间用于特定目的,例如,kube-system主要用于运行系统级资源,而default则为那些未指定名称空间的资源操作提供一个默认值。
使用kubectl get namespace可以查看namespace资源,使用kubectl describe namespace $NAME可以查看特定的名称空间的详细信息。
2、管理namespace资源
namespace是k8sapi的标准资源类型之一,namespace资源属性较少,通常只需要指定名称即可创建,如“kubectl create namespace qa”。namespace资源的名称仅能由字母、数字、下划线、连接线等字符组成。然而考虑到声明式对象配置管理机制的强大功能,推荐使用apply和patch等命令进行资源创建及修改等一类的管理操作。而删除namespace资源会级联删除其包含的所有其他资源对象:
命令格式 | 功能 |
kubectl delete TYPE RESOURCE -n NS | 删除指定名称空间内的指定资源 |
kubectl delete TYPE --all -n NS | 删除指定名称空间内的指定类型的所有资源 |
kubectl delete all -n -NS | 删除指定名称空间内的所有资源 |
kubectl delete all --all | 删除所有名称空间中的所有资源 |
PS:namespace对象仅用于资源对象名称的隔离,它自身并不能隔绝跨名称空间的pod间通信,那是网络策略资源的功能