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

容器资源

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

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

其中,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 是十进制表示的字节单位。
举:chestnut::
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
  • …… 等

举:chestnut::

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

资源限制

TODO

参考