学习 Kubernetes(十八):资源管理

容器资源

Kubernetes 为 Pod 中的容器提供了以下可配置的资源类型:

  • CPU spec.containers[].resources.requests.cpuspec.containers[].resources.limits.cpu
  • Memory spec.containers[].resources.requests.memoryspec.containers[].resources.limits.memory
  • Huge Page(Kubernetes v1.14 以上)spec.containers[].resources.requests.hugepages-<size>spec.containers[].resources.limits.hugepages-<size>

其中,Request 定义了请求资源大小,Limit 定义了使用资源的上限。

对于 Kubernetes 上的 Node 有:

$$\sum_{container\in node}{request.cpu_{container}} <= cpu_{node}$$

$$\sum_{container\in node}{request.memory_{container}} <= memory_{node}$$

CPU

单位 CPU 单元,1 为 1 个 CPU,0.1 或者 100m 为千分之 100 个 CPU(millicpu)。

对于 Docker Runtime,spec.containers[].resources.requests.cpu 会以 docker run 参数 --cpu-share requests.cpu * 1024 启动 Docker 容器。spec.containers[].resources.limits.cpu 会以 docker run 参数 --cpu-quota limits.cpu * 100000 --cpu-period 1000000 启动 Docker 容器。

Memory

单位 Gi、Mi、Ki。注意,MiB 和 KiB 是二进制表示的字节单位,MB 和 KB 是十进制表示的字节单位。

举🌰:

1 KB = 1000 Bytes = 8000 Bits

1 KiB = ${2}^{10}$ Bytes = 1024 Bytes = 8192 Bits

对于 Docker Runtime,spec.containers[].resources.requests.memory 不会传递任何参数。spec.containers[].resources.limits.memory 会以 docker run 参数 --memory limits.memory 启动 Docker 容器。

QoS

QoS 意为服务质量(Quality of Service),在 Kubernetes 中所有 Pod 被划分分三个 QoS 类别:

  • Guaranteed 等级高
  • Burstable 等级中
  • BestEffort 等级低

在资源不足时,低等级的 Pod 会被清理,从而确保高等级的 Pod 的稳定运行。

Guaranteed 条件:

  • Pod 中所有容器都且仅设置了 limits;
  • Pod 中所有容器都设置了 requests 和 limits,且 requests 等于 limits。

Burstable 条件:Pod 中最少一个容器 requests 不等于 limits。

BestEffort 条件:Pod 中所有容器均未设置 requests 和 limits。

资源配额

Kubernetes 提供了 ResourceQuota 资源用于约束命名空间资源的消费。

支持的资源包括:

  • requests.cpu
  • limits.cpu
  • requests.memory
  • limits.memory
  • …… 等

举🌰:

apiVersion: v1  
kind: ResourceQuota  
metadata:  
  name: resource-quota
spec:  
  hard:
    requests.cpu: 4
    requests.memory: 40Gi
    limits.cpu: 5
    limits.memory: 50Gi

资源限制

Kubernetes 提供了 LimitRange 资源用于限制命名空间 Pod 或者容器可以消费的资源。

支持的限制包括:

  • default 默认 Limit 资源
  • defaultRequest 默认 Request 资源
  • maxLimitRequestRatio Limit / Request 最大比率
  • max 资源使用的最大值
  • min 资源使用的最小值

限制 Container 举🌰:

apiVersion: v1  
kind: LimitRange  
metadata:  
  name: container-limits
spec:  
  limits:
  - max:
      cpu: 1
      memory: 4Gi
    default:
      cpu: 50m
      memory: 512Mi
    defaultRequest:
      cpu: 10m
      memory: 128Mi
    type: Container

限制 Pod 举🌰:

apiVersion: v1  
kind: LimitRange  
metadata:  
  name: pod-limits
spec:  
  limits:
    - max:
        cpu: 2
        memory: 8Gi
      type: Pod

参考