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