使用命名空间共享集群

此页面展示了如何查看、使用和删除命名空间。此页面还展示了如何使用 Kubernetes 命名空间来细分你的集群。

准备工作

查看命名空间

使用以下命令列出集群中的当前命名空间

kubectl get namespaces
NAME              STATUS   AGE
default           Active   11d
kube-node-lease   Active   11d
kube-public       Active   11d
kube-system       Active   11d

Kubernetes 以四个初始命名空间启动

  • default 未指定其他命名空间对象的默认命名空间
  • kube-node-lease 此命名空间包含与每个节点关联的 Lease(租约)对象。 节点租约允许 kubelet 发送心跳,以便控制平面可以检测节点故障。
  • kube-public 此命名空间自动创建,所有用户(包括未认证用户)均可读。 此命名空间主要用于集群使用,以防某些资源需要公开并在整个集群中可见和可读。 此命名空间的公共方面仅是一个惯例,并非要求。
  • kube-system Kubernetes 系统创建的对象的命名空间

你还可以使用以下命令获取特定命名空间的摘要

kubectl get namespaces <name>

或者你可以使用以下命令获取详细信息

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

请注意,这些详细信息同时显示资源配额(如果存在)和资源限制范围。

资源配额跟踪命名空间中资源的聚合使用情况,并允许集群操作员定义命名空间可以消耗的**硬性**资源使用限制。

限制范围定义了单个实体在命名空间中可以消耗的资源量的最小/最大约束。

参阅准入控制:限制范围

命名空间可以处于以下两种阶段之一

  • Active 命名空间正在使用中
  • Terminating 命名空间正在被删除,不能用于创建新对象

有关更多详细信息,请参阅 API 参考中的命名空间

创建新命名空间

创建一个名为 my-namespace.yaml 的新 YAML 文件,其内容如下:

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

然后运行

kubectl create -f ./my-namespace.yaml

或者,您可以使用以下命令创建命名空间

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

你的命名空间名称必须是有效的 DNS 标签

有一个可选字段 finalizers,它允许观测者在命名空间被删除时清理资源。请记住,如果你指定了一个不存在的 finalizer,命名空间将被创建,但如果用户尝试删除它,它将卡在 Terminating 状态。

有关 finalizers 的更多信息,请参阅命名空间设计文档

删除命名空间

使用以下命令删除命名空间

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

此删除是异步的,因此在一段时间内你会看到命名空间处于 Terminating 状态。

使用 Kubernetes 命名空间细分你的集群

默认情况下,Kubernetes 集群在配置集群时会实例化一个默认命名空间,以保存集群使用的默认 Pod、Service 和 Deployment。

假设你有一个全新的集群,你可以通过以下方式检查可用的命名空间

kubectl get namespaces
NAME      STATUS    AGE
default   Active    13m

创建新的命名空间

在本练习中,我们将创建另外两个 Kubernetes 命名空间来存储我们的内容。

在组织使用共享 Kubernetes 集群进行开发和生产用例的场景中

  • 开发团队希望在集群中维护一个空间,他们可以在其中查看用于构建和运行应用程序的 Pod、Service 和 Deployment 列表。在这个空间中,Kubernetes 资源会来来去去,对谁可以或不可以修改资源的限制会放宽,以实现敏捷开发。

  • 运营团队希望在集群中维护一个空间,他们可以在其中严格执行谁可以或不可以操作运行生产站点的 Pod、Service 和 Deployment 集的程序。

该组织可以遵循的一种模式是将 Kubernetes 集群划分为两个命名空间:developmentproduction。让我们创建两个新的命名空间来容纳我们的工作。

使用 kubectl 创建 development 命名空间

kubectl create -f https://k8s.io/examples/admin/namespace-dev.json

然后我们使用 kubectl 创建 production 命名空间

kubectl create -f https://k8s.io/examples/admin/namespace-prod.json

为了确保一切正常,请列出我们集群中的所有命名空间。

kubectl get namespaces --show-labels
NAME          STATUS    AGE       LABELS
default       Active    32m       <none>
development   Active    29s       name=development
production    Active    23s       name=production

在每个命名空间中创建 Pod

Kubernetes 命名空间为集群中的 Pod、Service 和 Deployment 提供作用域。与一个命名空间交互的用户不会看到另一个命名空间中的内容。为了演示这一点,让我们在 development 命名空间中启动一个简单的 Deployment 和 Pod。

kubectl create deployment snowflake \
  --image=registry.k8s.io/serve_hostname \
  -n=development --replicas=2

我们创建了一个副本大小为 2 的 Deployment,它运行名为 snowflake 的 Pod,其中包含一个提供主机名的基本容器。

kubectl get deployment -n=development
NAME         READY   UP-TO-DATE   AVAILABLE   AGE
snowflake    2/2     2            2           2m
kubectl get pods -l app=snowflake -n=development
NAME                         READY     STATUS    RESTARTS   AGE
snowflake-3968820950-9dgr8   1/1       Running   0          2m
snowflake-3968820950-vgc4n   1/1       Running   0          2m

这很棒,开发人员可以做他们想做的事情,他们不必担心会影响 production 命名空间中的内容。

让我们切换到 production 命名空间,并展示一个命名空间中的资源是如何对其他命名空间隐藏的。 production 命名空间应该为空,以下命令应该不返回任何内容。

kubectl get deployment -n=production
kubectl get pods -n=production

生产环境喜欢运行“畜群”,所以让我们创建一些“畜群” Pod。

kubectl create deployment cattle --image=registry.k8s.io/serve_hostname -n=production
kubectl scale deployment cattle --replicas=5 -n=production

kubectl get deployment -n=production
NAME         READY   UP-TO-DATE   AVAILABLE   AGE
cattle       5/5     5            5           10s
kubectl get pods -l app=cattle -n=production
NAME                      READY     STATUS    RESTARTS   AGE
cattle-2263376956-41xy6   1/1       Running   0          34s
cattle-2263376956-kw466   1/1       Running   0          34s
cattle-2263376956-n4v97   1/1       Running   0          34s
cattle-2263376956-p5p3i   1/1       Running   0          34s
cattle-2263376956-sxpth   1/1       Running   0          34s

此时,应该很清楚,用户在一个命名空间中创建的资源对另一个命名空间是隐藏的。

随着 Kubernetes 中策略支持的发展,我们将扩展此场景,以展示如何为每个命名空间提供不同的授权规则。

了解使用命名空间的动机

单个集群应该能够满足多个用户或用户组(在本文件中称为**用户社区**)的需求。

Kubernetes **命名空间**帮助不同的项目、团队或客户共享一个 Kubernetes 集群。

它通过提供以下功能实现此目的:

  1. 名称的作用域。
  2. 一种将授权和策略附加到集群子部分中的机制。

使用多个命名空间是可选的。

每个用户社区都希望能够独立于其他社区工作。每个用户社区都有自己的

  1. 资源(Pod、Service、ReplicationController 等)
  2. 策略(谁可以在其社区中执行或不能执行操作)
  3. 约束(此社区被允许多少配额等)

集群操作员可以为每个独特的用户社区创建一个命名空间。

命名空间提供了独特的范围,用于

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

用例包括

  1. 作为集群操作员,我希望在单个集群上支持多个用户社区。
  2. 作为集群操作员,我希望将集群分区的权限委托给这些社区中受信任的用户。
  3. 作为集群操作员,我希望限制每个社区可以消耗的资源量,以限制对使用集群的其他社区的影响。
  4. 作为集群用户,我希望与我的用户社区相关的资源进行交互,而无需担心其他用户社区在集群上做什么。

理解命名空间和 DNS

当你创建一个 Service 时,它会创建一个相应的 DNS 条目。 此条目的形式为 ..svc.cluster.local,这意味着如果容器使用 ,它将解析为本地命名空间中的 Service。 这对于在多个命名空间(例如 Development、Staging 和 Production)中使用相同的配置非常有用。 如果你想跨命名空间访问,你需要使用完全限定域名(FQDN)。

下一步

上次修改时间:2023 年 8 月 1 日下午 5:31 PST:添加 kube-node-lease 命名空间 (973280594f)