管理巨页(HugePages)

FEATURE STATE: Kubernetes v1.18 稳定

该功能是“稳定的”,意味着:

  • 版本名是 vX,其中 X 是整数。
  • 该功能将出现在多个后续释出的软件稳定版中。

作为 GA 特性,Kubernetes 支持在 Pod 应用中使用预先分配的巨页。本文描述了用户如何使用巨页,以及当前的限制。

准备开始

  1. 为了使节点能够上报巨页容量,Kubernetes 节点必须预先分配巨页。每个节点只能预先分配一种特定规格的巨页。

节点会自动发现全部巨页资源,并作为可供调度的资源进行上报。

API

用户可以通过在容器级别的资源需求中使用资源名称 hugepages-<size> 来使用巨页,其中的 size 是特定节点上支持的以整数值表示的最小二进制单位。 例如,如果节点支持 2048KiB 的页面规格, 它将暴露可供调度的资源 hugepages-2Mi。 与 CPU 或内存不同,巨页不支持过量使用(overcommit)。 注意,在请求巨页资源时,还必须请求内存或 CPU 资源。

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. generateName: hugepages-volume-
  5. spec:
  6. containers:
  7. - image: fedora:latest
  8. command:
  9. - sleep
  10. - inf
  11. name: example
  12. volumeMounts:
  13. - mountPath: /hugepages
  14. name: hugepage
  15. resources:
  16. limits:
  17. hugepages-2Mi: 100Mi
  18. memory: 100Mi
  19. requests:
  20. memory: 100Mi
  21. volumes:
  22. - name: hugepage
  23. emptyDir:
  24. medium: HugePages
  • 巨页的资源请求值必须等于其限制值。该条件在指定了资源限制,而没有指定请求的情况下默认成立。
  • 巨页是被隔离在 pod 作用域的,计划在将来的迭代中实现容器级别的隔离。
  • 巨页可用于 EmptyDir 卷,不过 EmptyDir 卷所使用的巨页数量不能够超出 Pod 请求的巨页数量。
  • 通过带有 SHM_HUGETLBshmget() 使用巨页的应用,必须运行在一个与 proc/sys/vm/hugetlb_shm_group 匹配的补充组下。
  • 通过 ResourceQuota 资源,可以使用 hugepages-<size> 标记控制每个命名空间下的巨页使用量, 类似于使用 cpumemory 来控制其他计算资源。

待实现的特性

  • 在 pod 级别隔离的基础上,支持巨页在容器级别的隔离。
  • 作为服务质量特性,保证巨页的 NUMA 局部性。
  • 支持 LimitRange 。