命名空间与配额

KubernetesBeginner
立即练习

简介

Kubernetes 集群就像一栋大型公寓楼。

如果所有人都住在大堂里,场面会非常混乱。你无法分清家具属于谁,而且一个吵闹的邻居可能会影响所有人。

命名空间(Namespace)会在逻辑上划分集群,使不同的团队、环境或应用能够分别组织资源。

ResourceQuota 会限制某个命名空间可以使用的特定资源数量。这有助于防止某个团队或工作负载耗尽集群共享容量。

在本实验中,你将:

  • 创建一个名为 dev 的新「公寓」(命名空间)。
  • 为这个公寓设置严格的「用电上限」(ResourceQuota)。
  • 尝试将家具(Pod)搬入公寓,并检查是否超出限制。

创建命名空间

在此步骤中,你将创建一个新的命名空间,为开发团队隔离资源。

命名空间是同一个集群内部的逻辑边界,并不是独立的集群。团队仍然共享同一个控制平面和底层节点,但名称、策略以及许多资源视图可以分开管理,从而保持工作井然有序。

默认情况下,所有资源都会进入 default 命名空间,也就是大堂。先查看当前已有的命名空间:

kubectl get namespaces

你应该能看到 default、kube-system(大楼管理员所在的位置)以及其他几个命名空间。

现在创建 dev 公寓:

kubectl create namespace dev

确认它已经创建:

kubectl get namespaces

你会在列表中看到 dev。此时它还是一个没有隔断和限制的空公寓,可以向其中放入任何资源。

应用资源限制

现在需要设置规则。我们不希望 dev 团队耗尽整个集群的 CPU 和内存。

接下来创建一个 ResourceQuota 对象,用它规定:「在 dev 命名空间中,最多可以使用 2 个 CPU 和 2Gi 内存。」

在共享集群中,配额尤其重要,因为 CPU 和内存都是有限资源。如果没有配额,某个资源使用量过高的工作负载可能会占用超过合理份额的资源,使整个集群对其他用户都变得不可靠。因此,配额不仅用于统计资源使用量,也是保障稳定性的工具。

创建名为 quota.yaml 的文件:

nano quota.yaml

粘贴以下配置:

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

保存并退出(按 Ctrl+X、Y、Enter)。

将此规则应用到集群:

kubectl apply -f quota.yaml

查看规则详情。输出会显示「Hard」限制(你设置的上限)和「Used」用量(当前为 0)。

kubectl describe resourcequota dev-quota --namespace=dev

部署 Pod

规则设置完成后,尝试把家具搬进来。

重要规则:当公寓存在资源限制时,搬入的每件家具都必须声明自己的大小。在 Kubernetes 中,这意味着:如果命名空间设置了配额,每个 Pod 都必须明确指定 resources(请求量和限制量)。如果没有指定,楼宇管理员 Kubernetes 会在入口处阻止 Pod 创建。

这里会涉及两个相关概念。请求量(request)告诉调度器,Pod 被放置时应获得多少资源保障。限制量(limit)是容器最多可以使用的资源量。配额会汇总命名空间中所有 Pod 的请求量和限制量,确保总量符合策略。

创建名为 pod.yaml 的文件:

nano pod.yaml

粘贴以下内容。注意,其中明确声明了这个 Pod 的资源大小:

apiVersion: v1
kind: Pod
metadata:
  name: dev-pod
  namespace: dev ## <-- Putting it in the 'dev' apartment
spec:
  containers:
    - name: nginx
      image: nginx
      resources:
        requests:
          memory: "128Mi"
          cpu: "250m"
        limits:
          memory: "256Mi"
          cpu: "500m"

保存并退出(按 Ctrl+X、Y、Enter)。

部署 Pod:

kubectl apply -f pod.yaml

检查它是否正在 dev 命名空间中运行:

kubectl get pods --namespace=dev

等待状态显示为 Running。

现在再次检查配额使用情况。你会看到「Used」列中的数值已经增加!

kubectl describe resourcequota dev-quota --namespace=dev

这表示你已经成功根据资源预算跟踪资源使用情况。

验证隔离

最后,验证我们的「公寓」隔断确实生效。

命名空间隔离主要体现在名称、策略和操作范围上。默认情况下,它并不意味着工作负载会运行在物理上完全分开的硬件上。之后学习节点选择和更强的隔离机制时,这一区别非常重要。

我们已经将 dev-pod 放入 dev。从大堂(default)中应该看不到它。

列出 default 命名空间中的 Pod:

kubectl get pods

你应该看到「No resources found in default namespace」(或者至少看不到 dev-pod)。

现在查看 default 命名空间中的配额:

kubectl get resourcequota

你应该看不到任何内容。我们设置的用电上限只适用于 dev 公寓,不适用于整栋大楼。

这表明命名空间可以为不同团队提供真正的资源隔离。

总结

在本实验中,你成为了 Kubernetes 集群的楼宇管理员。

你已经成功完成以下任务:

  1. 为团队创建了一个私有的命名空间(dev)。
  2. 设置了严格的 ResourceQuota(用电上限),防止资源被过度消耗。
  3. 部署了一个遵守这些限制的应用。
  4. 验证了命名空间之间的隔断能够保持资源隔离。

大型组织正是通过这种方式,让数百个团队共享同一个 Kubernetes 集群,同时避免互相影响。