Pod 好比一个虚拟机。虚拟机能分配固定的 CPU、Mem、Disk 和网络资源。Pod 也是如此,那么 Pod 是如何使用和控制这些资源的呢?
首先,我们先了解 CPU 资源的分配模式。
计算机里 CPU 的资源是按时间片的方式分配给请求的,系统里的每一个操作都需要 CPU 处理,我们知道 CPU 的单位是 Hz、GHz(1Hz=次/秒,即在单位时间内完成振动的次数,1GHz=1 000 000 000Hz=1 000 000 000次/秒),频率越大,单位时间内完成的处理次数就越多。所以,任务申请的 CPU 时间片越多,它得到的 CPU 资源就越多。
我们再来了解 Cgroup 里资源的换算单位,CPU 换算单位如下所示。
- 1CPU=1000millicpu (1core=1000m)
- 0.5CPU=500millicpu (0.5core=500m)
这里 m 是毫核的意思,Kubernetes 集群中的每一个节点都可以通过操作系统的命令确认本节点的 CPU 内核数量,然后将这个数量乘以 1000,得到的就是节点 CPU 总毫数。比如一个节点有 4 核,那么该节点的 CPU 总毫数为 4000m。
Kubernetes 是通过以下两个参数来限制和请求 CPU 的资源的。
spec.containers[].resources.limits.cpu
:CPU 上限值, 短暂超出上限值,容器不会被停止。spec.containers[].resources.requests.cpu
: CPU 请求值,是 Kubernetes 调度算法里的依据值,可以超出。
这里需要说明一点,如果 resources.requests.cpu
设置的值大于集群里每个节点的最大 CPU 核心数,那么这个 Pod 将无法调度(没有节点能满足它)。
我们在 YAML 里定义一个容器 CPU 资源如下。
resources:
requests:
memory: 50Mi
cpu: 50m
limits:
memory: 100Mi
cpu: 100m
这里,CPU 我们给的是 50m,也就是 0.05core,这 0.05core
占了 1CPU里 5% 的资源时间。
另外,我们还要知道,Kubernetes CPU 是一个可压缩的资源。如果容器达到了 CPU 的设定值,就会开始限制 CPU 的资源,容器性能
也会随之下降,但是不会终止和退出。
最后我们了解一下内存的资源控制。
单位换算方法: 1 MiB=1024KiB,注意 MiB≠MB,MB 是十进制单位,MiB 是二进制,很多人以为 1MB=1024KB,其实 1MB=1000KB,1MiB=1024KiB。
在 Kubernetes 里,内存单位一般用的是 MiB,当然你也可以根据具体的业务需求和资源容量使用 KiB、GiB 甚至 PiB 为单位。
这里要注意的是,内存是不可压缩资源,容器使用的内存资源到达了上限会造成内存溢出,容器就会终止运行并退出。
评论区