Kubernetes 的名字空间并不是一个实体对象,只是一个逻辑上的概念。它可以把集群切分成一个个彼此独立的区域,然后我们把对象放到这些区域里,就实现了类似容器技术里 namespace 的隔离效果,应用只能在自己的名字空间里分配资源和运行,不会干扰到其他名字空间里的应用。
Kubernetes面对大规模集群、海量节点时的一种现实考虑。因为集群很大、计算资源充足,会有非常多的用户在 Kubernetes 里创建各式各样的应用,可能会有百万数量级别的 Pod,这就使得资源争抢和命名冲突的概率大大增加了,情形和单机 Linux 系统里是非常相似的。
把集群给适当地“局部化”,为每一类用户创建出只属于它自己的“工作空间”。
Kubernetes 初始化集群的时候也会预设 4 个名字空间:default、kube-system、kube-public、kube-node-lease。我们常用的是前两个,default 是用户对象默认的名字空间,kube-system 是系统组件所在的名字空间,相信你对它们已经很熟悉了。
名字空间的资源配额需要使用一个专门的 API 对象,叫做 ResourceQuota,简称是 quota,我们可以使用命令 kubectl create 创建一个它的样板文件:
export out="--dry-run=client -o yaml" kubectl create quota dev-qt $out
因为资源配额对象必须依附在某个名字空间上,所以在它的 metadata 字段里必须明确写出 namespace(否则就会应用到 default 名字空间)。
在 ResourceQuota 里可以设置各类资源配额,字段非常多。
- CPU 和内存配额,使用 request.*、limits.*,这是和容器资源限制是一样的。
- 存储容量配额,使 requests.storage 限制的是 PVC 的存储总量,也可以用 persistentvolumeclaims 限制 PVC 的个数。
- 核心对象配额,使用对象的名字(英语复数形式),比如 pods、configmaps、secrets、services。
- 其他 API 对象配额,使用 count/name.group 的形式,比如 count/jobs.batch、count/deployments.apps。
很小但很有用的辅助对象了—— LimitRange,简称是 limits,它能为 API 对象添加默认的资源配额限制。
- spec.limits 是它的核心属性,描述了默认的资源限制。
- type 是要限制的对象类型,可以是 Container、Pod、PersistentVolumeClaim。
- default 是默认的资源上限,对应容器里的 resources.limits,只适用于 Container。
- defaultRequest 默认申请的资源,对应容器里的 resources.requests,同样也只适用于 Container。
- max、min 是对象能使用的资源的最大最小值。
备注:
1、名字空间是一个逻辑概念,没有实体,它的目标是为资源和对象划分出一个逻辑边界,避免冲突。
2、ResourceQuota 对象可以为名字空间添加资源配额,限制全局的 CPU、内存和 API 对象数量。
3、LimitRange 对象可以为容器或者 Pod 添加默认的资源配额,简化对象的创建工作。