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使用示例

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: nginx
  5. spec:
  6. selector:
  7. matchLabels:
  8. app: nginx
  9. replicas: 1
  10. template:
  11. metadata:
  12. labels:
  13. app: nginx
  14. spec:
  15. containers:
  16. - name: nginx
  17. image: nginx:latest
  18. ports:
  19. - containerPort: 80
  20. resources:
  21. requests:
  22. cpu: "100m"
  23. memory: "256Mi"
  24. limits:
  25. cpu: "500m"
  26. memory: "512Mi"

二、QoS 资源服务质量控制

1、Pod QoS 特点

image.png

在 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

参考文献:
https://blog.csdn.net/qq_32641153/article/details/99700133?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control&dist_request_id=1329188.20902.16179401521372731&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control