Kubernetes 官方文档地址:
在 Kubernetes 中资源又可分为 API资源 与 计算资源,API 资源主要包括 Pod、Service、Deployment 等,计算资源主要包括 CPU、GPU 及 Memory 等
Kubernetes的计算资源分为两种属性。
1、可压缩资源(CPU循环,Disk I/O带宽),当可压缩资源不足时,降低这些资源的使用量而不去杀掉Pod。
2、不可压缩资源(内存、硬盘空间),当不可压缩资源不足时,一般来说不杀掉Pod就没法回收。
注:由于 Pod 可以由多个 Container 组成,所以 CPU 和内存资源的限额,是要配置在每个 Container 的定义上的。这样,Pod 整体的资源配置,就由这些 Container 的配置值累加得到。
**
当 Kubernetes 集群中计算资源不足时(如 Pod 占用资源过多),Kubernetes 提供了资源限制的机制,其核心如下:
- 限制 Pod 资源占用率;
- 为 Pod 划分等级(QoS),当资源不足时先杀死等级低的 Pod 来释放资源;
一、Pod 资源配置参数
Pod的资源类型
- cpu
- memory
- ephemeral-storage
- extended-resource:nvidia.com/gpu
Requests 和 Limits 对调度的影响
K8S 在 pod resources 里面提供了两种填写方式:第一种是 request,第二种是 limit。
它其实是为用户提供了对 Pod 一种弹性能力的定义。比如说我们可以对 request 填 2 个 CPU,对 limit 填 4 个 CPU,这样代表了我希望是有 2 个 CPU 的保底能力,但其实在闲置的时候,可以使用 4 个 GPU。
在调度的时候,kube-scheduler 只会按照 requests 的值进行计算。而在真正设置 Cgroups 限制的时候,kubelet 则会按照 limits 的值来进行设置。
Requests 和 Limits使用示例
apiVersion: apps/v1kind: Deploymentmetadata:name: nginxspec:selector:matchLabels:app: nginxreplicas: 1template:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:latestports:- containerPort: 80resources:requests:cpu: "100m"memory: "256Mi"limits:cpu: "500m"memory: "512Mi"
二、QoS 资源服务质量控制
1、Pod QoS 特点

在 Kubernetes 中资源不足时,根据 QoS 等级杀死 Pod 会有以下特点:
- BestEffort Pod: 优先级最低,在 Kubernetes 资源不足时候会将此 Pod 先杀掉。
- Burstable Pod: 优先级居中,如果整个系统内存资源不足,且已经杀完全部 BestEffort 等级的 Pod 时可能被杀掉。
- Guaranteed Pod: 优先级最高,一般情况下不会被杀掉,除非资源不足且系统 BestEffort 和 Burstable 的 Pod 都不存在的情况下,才可能被杀掉。
2、Pod 是如何分 QoS 等级
(1)、Guaranteed (等级-最高)
如果 Pod 中所有容器都定义了 Limits 和 Requests,并且全部容器的 Limits 值 = Requests 值(值不能为0),那么该 Pod 的 QoS 级别就是 Guaranteed。
注意:这种情况下容器可以只设置 Limits 值即可,引入在只设置 Limits 不设置 Requests 情况下,Requests 值默认等于 Limits 的值。
(2)、BestEffort(等级-最低)
如果 Pod 中所有容器都未定义 Requests 和 Limits 值,该 Pod 的 Qos 即为 BestEffort。
(3)、Burstable(等级-中等)
当一个 Pod 既不是 Guaranteed 级别,也不说 BestEffort 级别时候,该 Pod 的 QoS 级别就是 Burstable。例如,Pod 中全部或者部分容器 Requests 和 Limits 都定义,且 Requests 小于 Limits 值,或者 Pod 中一部分容器未定义 Requests 和 Limits 资源时。
3、三种 Qos 的示例
(1)、Guaranteed
**
每个容器都设置 Limits 而不设置 Requests:
containers:
- name: example-container1
resources:
limits:
cpu: 10m
memory: 512Mi
- name: example-container2
resources:
limits:
cpu: 100m
memory: 100Mi
每个容器都设置 Limits 值和 Requests 值都相等:
containers:
- name: example-container1
resources:
limits:
cpu: 100m
memory: 512Mi
requests:
cpu: 100
memory: 512Mi
- name: example-container2
resources:
limits:
cpu: 200m
memory: 256Mi
requests:
cpu: 200m
memory: 256Mi
(2)、BestEffort
Pod 中的所有容器都未定义 Requests 和 Limits:
containers:
- name: example-container1
resources:
- name: example-container2
resources:
(3)、Burstable
Pod 中只要有一个容器的 Requests 和 Limits 的设置的值不相同:
containers:
- name: example-container1
resources:
limits:
cpu: 100m
memory: 512Mi
requests:
cpu: 100
memory: 512Mi
- name: example-container2
resources:
limits:
cpu: 200m
memory: 256Mi
requests:
cpu: 100m
memory: 128Mi
Pod 都存在 Limits,但是 Limits 中限制的类型不同:
containers:
- name: example-container1
resources:
limits:
memory: 512Mi
- name: example-container2
resources:
limits:
cpu: 200m
Pod 中两个容器只有一个 Limits ,另一个都没有设置:
containers:
- name: example-container1
resources:
limits:
cpu: 100m
memory: 512Mi
requests:
cpu: 100
memory: 512Mi
- name: example-container2
resources:
三、LimitRange资源范围管理对象
四、ResourcesQuota资源配额管理对象
Kubernetes 是允许管理员在命名空间中指定资源 Request 和 Limit 的,这一特性对于资源管理限制非常有用。
apiVersion: v1
kind: ResourceQuota
metadata:
name: mem-cpu-example
spec:
hard:
requests.cpu: 2
requests.memory: 2Gi
limits.cpu: 3
limits.memory: 4Gi
