×

概述

除了持久性存储之外,Pod 和容器可能还需要瞬态或临时的本地存储才能运行。此瞬态存储的生存期不会超过单个 Pod 的生存期,并且此瞬态存储无法在 Pod 之间共享。

Pod 使用瞬态本地存储作为暂存空间、缓存和日志。与缺乏本地存储会计和隔离相关的問題包括:

  • Pod 无法检测有多少本地存储可用。

  • Pod 无法请求保证的本地存储。

  • 本地存储是一种尽力而为的资源。

  • 由于其他 Pod 填满了本地存储,Pod 可能会被驱逐,之后新的 Pod 不会被接纳,直到回收足够的存储空间。

与持久卷不同,瞬态存储是非结构化的,空间在节点上运行的所有 Pod 之间共享,此外系统、容器运行时和 OpenShift Container Platform 也使用该空间。瞬态存储框架允许 Pod 指定其瞬态本地存储需求。它还允许 OpenShift Container Platform 在适当的地方调度 Pod,并防止节点过度使用本地存储。

虽然瞬态存储框架允许管理员和开发人员更好地管理本地存储,但它不会直接影响 I/O 吞吐量和延迟。

瞬态存储类型

瞬态本地存储始终在主分区中可用。创建主分区主要有两种方式:root 和 runtime。

Root

此分区默认包含 kubelet 根目录 /var/lib/kubelet//var/log/ 目录。此分区可在用户 Pod、操作系统和 Kubernetes 系统守护进程之间共享。Pod 可以通过 EmptyDir 卷、容器日志、镜像层和容器可写层来使用此分区。Kubelet 管理此分区的共享访问和隔离。此分区是瞬态的,应用程序无法对此分区的磁盘 IOPS 等性能 SLA 提出任何期望。

Runtime

这是一个可选分区,运行时可以使用它来进行覆盖文件系统。OpenShift Container Platform 尝试识别并提供对该分区的共享访问以及隔离。容器镜像层和可写层存储在此处。如果存在 runtime 分区,则 root 分区不包含任何镜像层或其他可写存储。

瞬态存储管理

集群管理员可以通过设置配额来管理项目中的瞬态存储,这些配额定义了所有非终端状态 Pod 的瞬态存储限制范围和请求数量。开发人员还可以在 Pod 和容器级别设置此计算资源的请求和限制。

您可以通过指定请求和限制来管理本地瞬态存储。Pod 中的每个容器可以指定以下内容:

  • spec.containers[].resources.limits.ephemeral-storage

  • spec.containers[].resources.requests.ephemeral-storage

瞬态存储限制和请求单位

瞬态存储的限制和请求以字节为单位测量。您可以使用以下后缀之一表示存储为普通整数或定点数:E、P、T、G、M、k。您也可以使用以下 2 的幂的等效值:Ei、Pi、Ti、Gi、Mi、Ki。

例如,以下数量都大致表示相同的值:128974848、129e6、129M 和 123Mi。

每个字节数量的后缀区分大小写。请确保使用正确的大小写。“M”(例如“400M”)用于设置 400 兆字节的请求。“400Mi”用于请求 400 兆字节。如果您指定“400m”的瞬态存储,则存储请求仅为 0.4 字节。

瞬态存储请求和限制示例

以下示例配置文件显示了一个包含两个容器的 Pod。

  • 每个容器请求 2 GiB 的本地瞬态存储。

  • 每个容器的本地瞬态存储限制为 4 GiB。

  • 在 Pod 级别,kubelet 通过将该 Pod 中所有容器的限制相加来计算总的 Pod 存储限制。

    • 在这种情况下,Pod 级别的总存储使用量是所有容器的磁盘使用量加上 Pod 的 emptyDir 卷的总和。

    • 因此,该 Pod 的本地瞬态存储请求为 4 GiB,限制为 8 GiB。

带有配额和限制的示例瞬态存储配置
apiVersion: v1
kind: Pod
metadata:
  name: frontend
spec:
  containers:
  - name: app
    image: images.my-company.example/app:v4
    resources:
      requests:
        ephemeral-storage: "2Gi" (1)
      limits:
        ephemeral-storage: "4Gi" (2)
    volumeMounts:
    - name: ephemeral
      mountPath: "/tmp"
  - name: log-aggregator
    image: images.my-company.example/log-aggregator:v6
    resources:
      requests:
        ephemeral-storage: "2Gi"
      limits:
        ephemeral-storage: "4Gi"
    volumeMounts:
    - name: ephemeral
      mountPath: "/tmp"
  volumes:
    - name: ephemeral
      emptyDir: {}
1 容器对本地瞬态存储的请求。
2 容器对本地瞬态存储的限制。

瞬态存储配置对 Pod 调度和驱逐的影响

Pod 说明中的设置会影响调度程序如何决定调度 Pod 以及 kubelet 何时驱逐 Pod。

  • 首先,调度程序确保已调度容器的资源请求总和小于节点的容量。在这种情况下,只有当节点的可用瞬态存储(可分配资源)大于 4 GiB 时,才能将 Pod 分配给该节点。

  • 其次,在容器级别,因为第一个容器设置了资源限制,所以 kubelet 驱逐管理器会测量此容器的磁盘使用情况,如果容器的存储使用量超过其限制 (4 GiB),则会驱逐 Pod。如果总使用量超过总的 Pod 存储限制 (8 GiB),kubelet 驱逐管理器还会将 Pod 标记为要驱逐。

有关定义项目配额的信息,请参阅 每个项目的配额设置

监控瞬态存储

您可以使用 /bin/df 命令作为工具来监控瞬态容器数据所在卷上的瞬态存储使用情况,该卷为 /var/lib/kubelet/var/lib/containers。如果您使用的是 df 命令,如果 /var/lib/containers 由集群管理员放置在单独的磁盘上,则只会显示 /var/lib/kubelet 的可用空间。

要显示 /var/lib 中已用和可用空间的人类可读值,请输入以下命令:

$ df -h /var/lib

输出显示 /var/lib 中的瞬态存储使用情况。

示例输出
Filesystem  Size  Used Avail Use% Mounted on
/dev/disk/by-partuuid/4cd1448a-01    69G   32G   34G  49% /