×

概述

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

Pod 使用临时的本地存储用于临时空间、缓存和日志。与缺乏本地存储会计和隔离相关的问题包括:

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

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

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

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

与持久卷不同,瞬态存储是非结构化的,空间在节点上运行的所有 Pod 之间共享,此外还包括系统、容器运行时和 OpenShift Dedicated 的其他用途。瞬态存储框架允许 Pod 指定其临时的本地存储需求。它还允许 OpenShift Dedicated 在适当的情况下调度 Pod,并保护节点免受本地存储过度使用。

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

瞬态存储类型

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

Root

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

Runtime

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

瞬态存储管理

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

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

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

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

瞬态存储限制和请求单位

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

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

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

瞬态存储请求和限制示例

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

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

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

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

    • 在本例中,Pod 级别的总存储使用量是所有容器磁盘使用量与 Pod 的emptyDir卷的总和。

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

带有配额和限制的临时存储配置示例
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。

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

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

监控临时存储

您可以使用/bin/df命令作为工具来监控临时容器数据所在的卷上的临时存储使用情况,该卷位于/var/lib/kubelet/var/lib/containers。如果集群管理员将/var/lib/containers放在单独的磁盘上,则使用df命令时,只会显示/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% /