×

概述

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

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

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

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

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

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

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

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

瞬态存储类型

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

Root

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

Runtime

这是一个可选分区,运行时可以使用它来创建覆盖文件系统。Red Hat OpenShift Service on AWS尝试识别并提供共享访问以及对该分区的隔离。容器镜像层和可写层存储在此处。如果存在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% /