Kubernetes-Namespace
1. 简介
Kubernetes 支持多个虚拟集群,它们底层依赖于同一个物理集群。 这些虚拟集群被称为namespace
。
在一些文档里namespace
也称为命名空间
。
namespace
为资源提供了一个范围。
资源的名称需要在namespace
内是唯一的。
namespace
不能相互嵌套,每个 Kubernetes 资源只能在一个namespace
中。
2. quick start
2.1 查看namespace
# kubectl get ns
$ kubectl get namespaces
NAME STATUS AGE
default Active 11d
kube-system Active 11d
kube-public Active 11d
初始状态下,Kubernetes 具有三个namespace
:
default
无namespace
对象的默认namespace
kube-system
由 Kubernetes 系统创建的对象的namespace
kube-public
自动创建且被所有用户可读的namespace
(包括未经身份认证的)。此namespace
通常在某些资源在整个集群中可见且可公开读取时被集群使用。此namespace
的公共方面只是一个约定,而不是一个必要条件。
或用下面的命令获取详细信息:
$ kubectl describe namespaces <name>
Name: default
Labels: <none>
Annotations: <none>
Status: Active
No resource quota.
Resource Limits
Type Resource Min Max Default
---- -------- --- --- ---
Container cpu - - 100m
请注意,这些详情同时显示了资源配额(如果存在)以及资源限制区间。
资源配额跟踪并聚合 Namespace 中资源的使用情况,并允许集群运营者定义 Namespace 可能消耗的 Hard 资源使用限制。
限制区间定义了单个实体在一个 Namespace 中可使用的最小/最大资源量约束。
namespace
可以处于下列两个阶段中的一个:
Active
namespace
正在被使用中Terminating
namespace
正在被删除,且不能被用于新对象。
2.2 创建namespace
说明: 避免使用前缀
kube-
创建namespace
,因为它是为 Kubernetes 系统namespace
保留的。
-
新建一个名为
my-namespace.yaml
的 YAML 文件,并写入下列内容:apiVersion: v1 kind: Namespace metadata: name: <insert-namespace-name-here>
然后运行:
$ kubectl create -f ./my-namespace.yaml
-
或者,你可以使用下面的命令创建
namespace
:$ kubectl create namespace <insert-namespace-name-here>
2.3 删除namespace
-
使用资源文件删除:
$ kubectl delete -f ./my-namespace.yaml
-
使用命令删除:
kubectl delete namespaces <insert-some-namespace-name>
警告: 这会删除
namespace
下的 所有内容 !
删除是异步的,所以有一段时间你会看到namespace
处于 Terminating
状态。
3. 理解使用namespace的动机
单个集群应该能满足多个用户及用户组的需求(以下称为 “用户社区”)。
Kubernetes namespace
帮助不同的项目、团队或客户去共享 Kubernetes 集群。
namespace
通过以下方式实现这点:
- 为资源设置作用域.
- 为集群中的部分资源关联鉴权和策略的机制。
使用多个namespace
是可选的。
每个用户社区都希望能够与其他社区隔离开展工作。
每个用户社区都有自己的:
- 资源(pods、服务、 副本控制器等等)
- 策略(谁能或不能在他们的社区里执行操作)
- 约束(该社区允许多少配额,等等)
集群运营者可以为每个唯一用户社区创建namespace
。
namespace
为下列内容提供唯一的作用域:
- 命名资源(避免基本的命名冲突)
- 将管理权限委派给可信用户
- 限制社区资源消耗的能力
用例包括:
- 作为集群运营者, 我希望能在单个集群上支持多个用户社区。
- 作为集群运营者,我希望将集群分区的权限委派给这些社区中的受信任用户。
- 作为集群运营者,我希望能限定每个用户社区可使用的资源量,以限制对使用同一集群的其他用户社区的影响。
- 作为群集用户,我希望与我的用户社区相关的资源进行交互,而与其他用户社区在该集群上执行的操作无关。
4. 理解namespace和 DNS
当你创建服务时,Kubernetes 会创建相应的 DNS 条目。 此条目的格式为 <服务名称>.<namespace名称>.svc.cluster.local
。 这意味着如果容器使用 <服务名称>
,它将解析为namespace
本地的服务。 这对于在多个namespace
(如开发、暂存和生产)中使用相同的配置非常有用。 如果要跨namespace
访问,则需要使用完全限定的域名(FQDN)。