Kubernetesでのエフェメラル・ストレージの管理

Kubernetesポッドにはエフェメラル(一時)ローカル・ストレージが必要です。

Kubernetesポッドは、スクラッチ領域、キャッシュおよびログにエフェメラル・ストレージを使用します。このストレージは一時的なもので、ポッドのライフサイクルに固有です。一時記憶域はポッド間で共有されず、ポッドが削除されると消えます。

Kubernetesエフェメラル・ストレージの詳細は、Kubernetesドキュメントのローカル・エフェメラル・ストレージを参照してください。

次のステップはOracle Kubernetes Engineに適用されますが、他のKubernetes環境では概念が類似しています。

ノード・プールでは、ノードはポッド・ストレージにブート・ボリュームを使用します。イメージは/varディレクトリに格納されるため、エフェメラル記憶域のほとんどはルート・パーティション内のイメージによって占有されます。ブート・ボリュームに必要な領域は、Oracle Blockchain Platform Enterprise Editionのインスタンスをインストールして、そのノードにチェーンコードを作成するたびに増加します。

次のkubelet APIコールを使用して、エフェメラル・ストレージの合計と、特定のノードの各ポッドに割り当てられる量を確認できます:
kubectl get --raw "/api/v1/nodes/<node IP>/proxy/stats/summary"
JSON結果のrootfsおよびfsセクションには、容量と使用可能なバイトが表示されます。

ノードの実行中にブート・ボリュームのサイズを変更して、エフェメラル・ストレージの量を更新できます。詳細は、Oracle Kubernetes Engineのノード・プールの更新を参照してください。

実行中のノードを含むOracle Kubernetes Engineクラスタ上のエフェメラル・ストレージのサイズを変更するには、次のステップを実行します。
  1. Oracle Kubernetes Engineクラスタの「リソース」で、「ノード・プール」を選択します。
  2. 「Edit」をクリックします。「ノード・プールの編集」ページで、「カスタム・ブート・ボリューム・サイズの指定」を選択し、「ブート・ボリューム・サイズ」の値をGBで入力します。作成されるノードは、エフェメラル・ストレージにこの値を使用します。
  3. ノード・プールのワーカー・ノードごとに、次のステップを実行してブート・ボリュームのサイズを変更します。
    1. ノードの横にある下矢印をクリックすると、ノードに関する詳細情報が表示されます。
    2. ノードのブート・ボリュームに移動し、「編集」をクリックします。
    3. 「ボリュームの編集」ページの「ボリューム・サイズおよびパフォーマンス」で、「ボリューム・サイズ」の値をGBで指定し、「変更の保存」をクリックします。
  4. 次のステップを実行して要塞セッションを設定し、それを使用してプライベート・ワーカー・ノードに接続します。
    1. インスタンスの詳細ページで、「Oracle Cloud Agent」タブをクリックし、要塞プラグインを有効にします。
    2. 検索バーで要塞を検索し、「サービス」の下の「要塞アイデンティティとセキュリティ」を結果でクリックします。
    3. 「要塞の作成」をクリックします。
    4. 「要塞の作成」ページで、ターゲット仮想クラウド・ネットワーク(VCN)に対して、Oracle Kubernetes Engine VCNに続けてクラスタ名を指定します。「ターゲット・サブネット」に、Kubernetes APIエンドポイントを指定します。「CIDRブロック許可リスト」0.0.0.0/0と入力し、「要塞の作成」をクリックします。
    5. 要塞をクリックして開き、「セッションの作成」をクリックします。
    6. 「ユーザー名」の値にopcと入力し、「コンピュート・インスタンス」リストからノードを選択します。
    7. 「SSHキーの追加」の下にSSHキーを貼り付けます。
    8. 「拡張オプションの表示」をクリックし、「ターゲット・コンピュート・インスタンスのIPアドレス」リストからノードまたはインスタンスのIPアドレスを選択します。これはノードまたはインスタンスのプライベートIPv4アドレスで、インスタンスの情報セクションで使用できます。
    9. 「セッションの作成」をクリックします。
    10. セッションのコンテキスト・メニューから、「SSHコマンドのコピー」をクリックします。
    11. SSHコマンドで-iパラメータを使用して秘密キーを指定することで、SSH経由でノードにログインできるようになりました。
    12. クラスタ内のワーカー・ノードごとに前のステップを繰り返します。
  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 Engineで実行されているインスタンスのエフェメラル・ストレージ使用量を確認できます。このスクリプトは、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