管理巨页(HugePage)

将巨页作为集群中的可调度资源来配置和管理

特性状态: Kubernetes v1.14 [stable]

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

准备开始

为了使节点能够上报巨页容量,Kubernetes 节点必须预先分配巨页

节点能够预先分配多种规格的巨页。例如,在 /etc/default/grub 中的以下这一行分配了 2*1GiB 的 1 GiB 页面和 512*2 MiB 的 2 MiB 页面。

  1. GRUB_CMDLINE_LINUX="hugepagesz=1G hugepages=2 hugepagesz=2M hugepages=512"

节点将自动发现并报告所有巨页资源作为可调度资源。

当你描述 Node 时,你应该在 CapacityAllocatable 节中看到类似以下内容:

  1. Capacity:
  2. cpu: ...
  3. ephemeral-storage: ...
  4. hugepages-1Gi: 2Gi
  5. hugepages-2Mi: 1Gi
  6. memory: ...
  7. pods: ...
  8. Allocatable:
  9. cpu: ...
  10. ephemeral-storage: ...
  11. hugepages-1Gi: 2Gi
  12. hugepages-2Mi: 1Gi
  13. memory: ...
  14. pods: ...

说明:

对于动态分配的页面(引导后),kubelet 需要被重新启动才能更新为新的分配。

API

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

同一 Pod 的 spec 中可能会消耗不同尺寸的巨页。在这种情况下,它必须对所有挂载卷使用 medium: HugePages-<hugepagesize> 标识。

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: huge-pages-example
  5. spec:
  6. containers:
  7. - name: example
  8. image: fedora:latest
  9. command:
  10. - sleep
  11. - inf
  12. volumeMounts:
  13. - mountPath: /hugepages-2Mi
  14. name: hugepage-2mi
  15. - mountPath: /hugepages-1Gi
  16. name: hugepage-1gi
  17. resources:
  18. limits:
  19. hugepages-2Mi: 100Mi
  20. hugepages-1Gi: 2Gi
  21. memory: 100Mi
  22. requests:
  23. memory: 100Mi
  24. volumes:
  25. - name: hugepage-2mi
  26. emptyDir:
  27. medium: HugePages-2Mi
  28. - name: hugepage-1gi
  29. emptyDir:
  30. medium: HugePages-1Gi

Pod 只有在请求同一大小的巨页时才使用 medium:HugePages

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: huge-pages-example
  5. spec:
  6. containers:
  7. - name: example
  8. image: fedora:latest
  9. command:
  10. - sleep
  11. - inf
  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 作用域的,因此每个容器在 spec 中都对 cgroup 沙盒有自己的限制。
  • 巨页可用于 EmptyDir 卷,不过 EmptyDir 卷所使用的巨页数量不能够超出 Pod 请求的巨页数量。
  • 通过带有 SHM_HUGETLBshmget() 使用巨页的应用,必须运行在一个与 proc/sys/vm/hugetlb_shm_group 匹配的补充组下。
  • 通过 ResourceQuota 资源,可以使用 hugepages-<size> 标记控制每个命名空间下的巨页使用量, 类似于使用 cpumemory 来控制其他计算资源。