在 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 结果的 rootfs 和 fs 部分显示容量和可用字节数。

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

完成以下步骤以调整具有运行节点的 Oracle Kubernetes Engine 集群上的临时存储大小。
  1. 在 Oracle Kubernetes 引擎集群上的资源下,选择节点池。
  2. 单击编辑。在编辑节点池页上,选择指定定制引导卷大小,然后输入 Boot volume size(引导卷大小)值 (GB)。创建的任何节点都将将此值用于临时存储。
  3. 对于节点池中的每个 worker 节点,请完成以下步骤来调整引导卷的大小。
    1. 单击节点旁边的向下箭头可查看有关节点的详细信息。
    2. 导航到节点的引导卷,然后单击编辑。
    3. 在 Edit volume(编辑卷)页面上的 Volume size and performance(卷大小和性能)下,指定 Volume size(卷大小)值 (GB),然后单击 Save changes(保存更改)。
  4. 完成以下步骤以设置堡垒会话,然后使用它连接到专用 worker 节点。
    1. 在实例详细信息页上,单击 Oracle Cloud Agent 选项卡,然后启用 Bastion 插件。
    2. 在搜索栏中搜索 bastion ,然后在结果中单击“服务”下的 Bastion Identity & Security 。
    3. 单击创建堡垒。
    4. 在创建堡垒页上,为目标虚拟云网络 (VCN) 指定 Oracle Kubernetes Engine VCN,后跟集群名称。对于目标子网,指定 Kubernetes API 端点。对于 CIDR 块允许列表,输入 0.0.0.0/0 ,然后单击创建堡垒。
    5. 单击堡垒以将其打开,然后单击创建会话。
    6. 输入 Username(用户名)值的 opc ,然后从 Compute instance(计算实例)列表中选择节点。
    7. 将 SSH 密钥粘贴在添加 SSH 密钥下。
    8. 单击显示高级选项,然后从目标计算实例 IP 地址列表中选择节点或实例的 IP 地址。这是节点或实例的专用 IPv4 地址,该地址在实例的信息部分中可用。
    9. 单击创建会话。
    10. 从会话的上下文菜单中,单击 Copy SSH command (复制 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