在 Kubernetes 上管理临时存储

Kubernetes 云池需要临时(临时)本地存储。

Kubernetes 云池使用临时存储来处理暂存空间、高速缓存和日志。此存储是临时的,特定于云池的生命周期。临时存储不会在 pod 之间共享,当 pod 被删除时会消失。

有关 Kubernetes 临时存储的更多常规信息,请参见 Kubernetes 文档中的本地临时存储

以下步骤适用于 Oracle Kubernetes 引擎,但这些概念在其他 Kubernetes 环境中类似。

在节点池中,节点将其引导卷用于云池存储。由于映像存储在 /var 目录中,因此大多数临时存储都由根分区中的映像占用。每次安装 Oracle Blockchain Platform Enterprise Edition 实例并在该节点上创建链代码时,引导卷中所需的空间都会增加。

您可以使用以下 kubelet API 调用来检查给定节点中分配给每个 pod 的临时存储总量和数量:
kubectl get --raw "/api/v1/nodes/<node IP>/proxy/stats/summary"
JSON 结果的 rootfsfs 部分显示容量和可用字节。

您可以通过在节点运行时调整引导卷大小来更新临时存储量。有关详细信息,请参阅 Oracle Kubernetes 引擎的更新节点池

完成以下步骤以调整具有运行节点的 Oracle Kubernetes Engine 集群上的临时存储大小。
  1. 在 Oracle Kubernetes Engine 集群上的资源下,选择节点池
  2. 单击编辑。在 Edit node pool(编辑节点池)页面上,选择 Specify a custom boot volume size(指定定制引导卷大小),然后输入 Boot volume size(引导卷大小)值(以 GB 为单位)。创建的任何节点都将使用此值进行临时存储。
  3. 对于节点池中的每个 worker 节点,请完成以下步骤来调整引导卷的大小。
    1. 单击节点旁边的向下箭头可查看有关该节点的详细信息。
    2. 导航到节点的引导卷,然后单击编辑
    3. Volume size and performance(卷大小和性能)下的 Edit volume(编辑卷)页上,以 GB 为单位指定 Volume size(卷大小)值,然后单击 Save changes(保存更改)
  4. 完成以下步骤以设置堡垒会话,然后使用它连接到专用 worker 节点。
    1. 在实例详细信息页上,单击 Oracle Cloud Agent 选项卡,然后启用 Bastion 插件。
    2. 在搜索栏中搜索 bastion ,然后在结果中单击“服务”下的 Bastion Identity & Security
    3. 单击 Create bastion
    4. 创建堡垒页上,为目标虚拟云网络 (VCN) 指定 Oracle Kubernetes 引擎 VCN,后跟集群名称。对于目标子网,指定 Kubernetes API 端点。对于 CIDR 块允许列表,输入 0.0.0.0/0 ,然后单击创建堡垒
    5. 单击堡垒以将其打开,然后单击创建会话
    6. Username(用户名)值输入 opc ,然后从 Compute instance(计算实例)列表中选择节点。
    7. 将 SSH 密钥粘贴在添加 SSH 密钥下。
    8. 单击显示高级选项,然后从目标计算实例 IP 地址列表中选择节点或实例的 IP 地址。这是节点或实例的专用 IPv4 地址,该地址在实例的信息部分中提供。
    9. 单击创建会话
    10. 从会话的上下文菜单中,单击复制 SSH 命令
    11. 现在,您可以通过 SSH 通过在 SSH 命令中提供 -i 参数来登录节点。
    12. 对集群中的每个 worker 节点重复前面的步骤。
  5. 对于每个节点,通过 SSH 登录到节点,然后运行以下命令,扫描添加到实例或节点的新块存储设备,然后在存储可用时扩展文件系统。
    sudo dd iflag=direct if=/dev/oracleoci/oraclevda of=/dev/null count=1
    echo "1" | sudo tee /sys/class/block/`readlink /dev/oracleoci/oraclevda | cut -d'/' -f 2`/device/rescan
    sudo /usr/libexec/oci-growfs -y

确定临时存储使用情况

您可以运行以下脚本来查看在 Oracle Kubernetes 引擎上运行的实例的暂时存储使用情况。该脚本使用 Kubernetes API 检索集群中每个节点上运行的每个云池的临时存储使用情况。

#!/usr/bin/env bash
  
kubectl proxy --append-server-path &
  
set -eo pipefail
  
{
    echo "NODE NAMESPACE POD EPHEMRAL_USED"
    for node in $(kubectl get nodes -o=jsonpath='{range .items[*]}{.metadata.name}{"\n"}{end}'); do
        curl -fsSL "http://127.0.0.1:8001/api/v1/nodes/$node/proxy/stats/summary" |
            yq '.pods[] | [.podRef.namespace, .podRef.name, .ephemeral-storage.usedBytes] | join(" ")' |
            while read -r namespace name usedBytes; do
                # A pod might have no running containers and consequently no ephemeral-storage usage.
                echo "$node" "$namespace" "$name" "$(numfmt --to iec "${usedBytes:-0}")"
            done
    done | sort -k4,4rh
} | column -t