kubernetes-资源限制介绍、驱逐策略

70 阅读4分钟

业务员架构图

image.png

限制namespace可以使用的资源 image.png

资源限制继承原则

1.如果运行的容器没有定义资源(memory、CPU)等限制,但是在namespace定义了LimitRange限制,那么该容器会继承LimitRange中的默认限制。

2.如果namespace没有定义LimitRange限制,那么该容器可以只要宿主机的最大可用资源,直到无资源可用而触发宿主机(OOM Killer)。

参考的官方文档

为容器和 Pods 分配 CPU 资源

kubernetes.io/zh-cn/docs/…

为容器和 Pod 分配内存资源

kubernetes.io/zh-cn/docs/…

  • requests(请求)

    • 为kubernetes scheduler执行pod调度时node节点至少需要拥有的资源
  • limits(限制)

    • 限制pod运行成功后最多可以使用的资源上限

image.png

单位换算

CPU 单位

(kubernetes.io/zh-cn/docs/…)

CPU 资源以 CPU 单位度量。Kubernetes 中的一个 CPU 等同于:

  • 1 个 AWS vCPU
  • 1 个 GCP核心
  • 1 个 Azure vCore
  • 裸机上具有超线程能力的英特尔处理器上的 1 个超线程

小数值是可以使用的。一个请求 0.5 CPU 的容器保证会获得请求 1 个 CPU 的容器的 CPU 的一半。 你可以使用后缀 m 表示毫。例如 100m CPU、100 milliCPU 和 0.1 CPU 都相同。 精度不能超过 1m。

CPU 请求只能使用绝对数量,而不是相对数量。0.1 在单核、双核或 48 核计算机上的 CPU 数量值是一样的。

CPU 以核心为单位进行限制,单位可以是整核、浮点核心数或毫核(m/milli):

2=2核心=200% 0.5=500m=50% 1.2=1200m=120%

memory

以字节为单位,单位可以是E、P、T、G、M、K、Ei、Pi、Ti、Gi、Mi、Ki

1536Mi=1.5Gi

驱逐策略

驱逐(eviction,节点驱逐),用于当node节点资源不足的时候自动将pod进行强制驱逐,以保证当前node节点的正常运行

Kubernetes基于是QoS(服务质量等级,Quality of Service)驱逐Pod , Qos等级包括目前包括以下三个

Guaranteed: #保证值

驱逐的优先级最低 因为是最守信用的

limits和request的值相等,等级最高、最后被驱逐

resources:
    limits:
        cpu: 500m
        memory: 256Mi
    requests:
        cpu: 500m
        memory: 256Mi

Burstable: #可超(requests)限制使用

limit和request不相等,等级居中、中间被驱逐 驱逐的优先级中

resources:
    limits:
        cpu: 500m
        memory: 256Mi
    requests:
        cpu: 256
        memory: 128Mi

BestEffort: #尽可能使用最大值

驱逐的优先级高 会先驱逐这些pod

没有资源上限的使用限制,即resources和limit都为空,此等级最低、会最先被驱逐。

LimitRange

限制namespace中的资源使用

image.png

kubernetes 基于LimitRange实现pod资源限制范围

Limit Range是对具体某个Pod或容器的资源使用进行限制

kubernetes.io/zh/docs/con…

  • 限制namespace中每个Pod或容器的最小与最大计算资源

  • 限制namespace中每个Pod或容器计算资源request、limit之间的比例

  • 限制namespace中每个存储卷声明(PersistentVolumeClaim)可使用的最小与最大存储空间

  • 设置namespace中容器默认计算资源的request、limit,并在运行时自动注入到容器中

apiVersion: v1
kind: LimitRange
metadata:
  name: limitrange-magedu
  namespace: magedu
spec:
  limits:
  - type: Container       #限制的资源类型
    max:
      cpu: "2"            #限制单个容器的最大CPU
      memory: "2Gi"       #限制单个容器的最大内存
    min:
      cpu: "500m"         #限制单个容器的最小CPU
      memory: "512Mi"     #限制单个容器的最小内存
    default:
      cpu: "500m"         #默认单个容器的CPU限制
      memory: "512Mi"     #默认单个容器的内存限制
    defaultRequest:
      cpu: "500m"         #默认单个容器的CPU创建请求
      memory: "512Mi"     #默认单个容器的内存创建请求
    maxLimitRequestRatio:
      cpu: 2              #限制CPU limit/request比值最大为2  
      memory: 2         #限制内存limit/request比值最大为1.5
  - type: Pod
    max:
      cpu: "4"            #限制单个Pod的最大CPU
      memory: "4Gi"       #限制单个Pod最大内存
  - type: PersistentVolumeClaim
    max:
      storage: 50Gi        #限制PVC最大的requests.storage
    min:
      storage: 30Gi        #限制PVC最小的requests.storage

对整个namespace的CPU及memory实现资源限制

kubernetes.io/zh-cn/docs/…

apiVersion: v1
kind: ResourceQuota
metadata:
  name: quota-magedu
  namespace: magedu
spec:
  hard:
    requests.cpu: "8"
    limits.cpu: "8"
    requests.memory: 8Gi
    limits.memory: 8Gi
    requests.nvidia.com/gpu: 4
    pods: "100"
    services: "100"