管理 HugePages

配置和管理大页作为集群中可调度资源。
功能状态: Kubernetes v1.14 [稳定]

Kubernetes 支持 Pod 中应用程序对预分配大页的分配和使用。本页介绍了用户如何使用大页。

开始之前

Kubernetes 节点必须预分配大页,以便节点报告其大页容量。

节点可以为多个大小预分配大页,例如,/etc/default/grub 中的以下行分配了 2*1GiB 的 1 GiB 和 512*2 MiB 的 2 MiB 页

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

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

当您描述节点时,您应该在 CapacityAllocatable 部分中看到类似以下内容

Capacity:
  cpu:                ...
  ephemeral-storage:  ...
  hugepages-1Gi:      2Gi
  hugepages-2Mi:      1Gi
  memory:             ...
  pods:               ...
Allocatable:
  cpu:                ...
  ephemeral-storage:  ...
  hugepages-1Gi:      2Gi
  hugepages-2Mi:      1Gi
  memory:             ...
  pods:               ...

API

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

一个 pod 可以在单个 pod 规范中使用多个大页大小。在这种情况下,它必须对所有卷挂载使用 medium: HugePages-<hugepagesize> 表示法。

apiVersion: v1
kind: Pod
metadata:
  name: huge-pages-example
spec:
  containers:
  - name: example
    image: fedora:latest
    command:
    - sleep
    - inf
    volumeMounts:
    - mountPath: /hugepages-2Mi
      name: hugepage-2mi
    - mountPath: /hugepages-1Gi
      name: hugepage-1gi
    resources:
      limits:
        hugepages-2Mi: 100Mi
        hugepages-1Gi: 2Gi
        memory: 100Mi
      requests:
        memory: 100Mi
  volumes:
  - name: hugepage-2mi
    emptyDir:
      medium: HugePages-2Mi
  - name: hugepage-1gi
    emptyDir:
      medium: HugePages-1Gi

如果 pod 请求一个大小的大页,则它可以使用 medium: HugePages

apiVersion: v1
kind: Pod
metadata:
  name: huge-pages-example
spec:
  containers:
  - name: example
    image: fedora:latest
    command:
    - sleep
    - inf
    volumeMounts:
    - mountPath: /hugepages
      name: hugepage
    resources:
      limits:
        hugepages-2Mi: 100Mi
        memory: 100Mi
      requests:
        memory: 100Mi
  volumes:
  - name: hugepage
    emptyDir:
      medium: HugePages
  • 大页请求必须等于限制。如果指定了限制,但没有指定请求,则这是默认值。
  • 大页在容器范围内隔离,因此每个容器在其 cgroup 沙箱中都有其自己的限制,如容器规范中所请求的那样。
  • 由大页支持的 EmptyDir 卷可能不会消耗超过 pod 请求的大页内存。
  • 通过 shmget() 使用 SHM_HUGETLB 消费大页的应用程序必须使用与 proc/sys/vm/hugetlb_shm_group 相匹配的补充组运行。
  • 可以使用 ResourceQuota 控制命名空间中的大页使用,类似于其他计算资源,如 cpumemory,使用 hugepages-<size> 令牌。