假如我们不为Pod设置资源控制,那么
CPU属于弹性资源,因为CPU可以通过时间片轮转等算法实现多进程调度。
因此CPU资源是按比例的形式为Pod进行分配,k8s将CPU资源定义为1000个单位,设置cpu.requests = 0.5 和cpu.requests = 500m是等价的,它代表该Pod所请求的资源是CPU资源的一半。
但请记住,CPU资源是按每个Pod设置值的比例进行分配的,权重大的Pod会获得比权重小的Pod更多的 CPU 时间。CPU调度的公平性由操作系统内核算法来保证。
CPU资源限制并不是绝对的,Pod可能会使用超出限制的CPU资源而不会被杀死。但节点CPU满负荷运转的最终结果是系统无法承载外部更多的请求,应用延时增加,响应变慢,同时节点会禁止新的Pod创建。
内存属于不可压缩资源,因为内存资源是进程独占的,这意味k8s对内存使用限制更加严格。
一旦节点可用内存耗尽,或者Pod使用资源超过limits,Pod一定会被杀死并重启。
内存分配的最小单位是字节,1m = 0.001字节。
正常情况下我们会使用 M(Mi), G(Gi) 作为分配单位。 1M = 2^20字节。
下面是官网上的一个例子:
apiVersion: v1
kind: Pod
metadata:
name: frontend
spec:
containers:
- name: app
image: images.my-company.example/app:v4
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
- name: log-aggregator
image: images.my-company.example/log-aggregator:v6
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
requests 代表Container向节点申请的资源,节点必须确保有充足的空间满足Pod的requests,否则k8s会将Pod分配到其它节点,如果Pod的资源申请无法被满足,则将会一直陷入失败重启状态。
limits代表Container最高资源使用限制。
当CPU资源使用超过限制时,Pod将被限制使用CPU。对于没有设置limits的 pod ,一旦节点的空闲 CPU 资源耗尽,之前分配的 CPU 资源也会逐渐减少。
而当内存资源使用超过限制时,Pod将被强制重启。