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

  • defaultnamespace对象的默认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保留的。

  1. 新建一个名为 my-namespace.yaml 的 YAML 文件,并写入下列内容:

    apiVersion: v1
    kind: Namespace
    metadata:
      name: <insert-namespace-name-here>
    

    然后运行:

    $ kubectl create -f ./my-namespace.yaml
    
  2. 或者,你可以使用下面的命令创建namespace

    $ kubectl create namespace <insert-namespace-name-here>
    

2.3 删除namespace

  1. 使用资源文件删除:

    $ kubectl delete -f ./my-namespace.yaml 
    
  2. 使用命令删除:

    kubectl delete namespaces <insert-some-namespace-name>
    

警告: 这会删除namespace下的 所有内容

删除是异步的,所以有一段时间你会看到namespace处于 Terminating 状态。

3. 理解使用namespace的动机

单个集群应该能满足多个用户及用户组的需求(以下称为 “用户社区”)。

Kubernetes namespace 帮助不同的项目、团队或客户去共享 Kubernetes 集群。

namespace通过以下方式实现这点:

  1. 为资源设置作用域.
  2. 为集群中的部分资源关联鉴权和策略的机制。

使用多个namespace是可选的。

每个用户社区都希望能够与其他社区隔离开展工作。

每个用户社区都有自己的:

  1. 资源(pods、服务、 副本控制器等等)
  2. 策略(谁能或不能在他们的社区里执行操作)
  3. 约束(该社区允许多少配额,等等)

集群运营者可以为每个唯一用户社区创建namespace

namespace为下列内容提供唯一的作用域:

  1. 命名资源(避免基本的命名冲突)
  2. 将管理权限委派给可信用户
  3. 限制社区资源消耗的能力

用例包括:

  1. 作为集群运营者, 我希望能在单个集群上支持多个用户社区。
  2. 作为集群运营者,我希望将集群分区的权限委派给这些社区中的受信任用户。
  3. 作为集群运营者,我希望能限定每个用户社区可使用的资源量,以限制对使用同一集群的其他用户社区的影响。
  4. 作为群集用户,我希望与我的用户社区相关的资源进行交互,而与其他用户社区在该集群上执行的操作无关。

4. 理解namespace和 DNS

当你创建服务时,Kubernetes 会创建相应的 DNS 条目。 此条目的格式为 <服务名称>.<namespace名称>.svc.cluster.local。 这意味着如果容器使用 <服务名称>,它将解析为namespace本地的服务。 这对于在多个namespace(如开发、暂存和生产)中使用相同的配置非常有用。 如果要跨namespace访问,则需要使用完全限定的域名(FQDN)。

posted @ 2021-12-12 21:35  张铁牛  阅读(260)  评论(0编辑  收藏  举报