AI やビッグデータなど、頻繁なスケールアウトが要求されるシナリオでは、新しいノードがクラスターに参加する際に、コンポーネントやアプリケーションイメージのプルに多くの時間を費やします。ノードが Ready 状態になるまでの速度を向上させるために、コンポーネントやイメージをデータディスクスナップショットに事前にキャッシュできます。これにより、新しいノードはネットワーク経由ではなくローカルディスクから直接データをロードできるようになり、スケールアウトの効率が大幅に向上します。
仕組み
デフォルトのスケールアウトプロセスでは、ノードが作成されてからアプリケーションがノード上で正常に実行されるまでの時間の大半が、以下のネットワークに依存する段階で費やされます:
-
システムイメージのプル:コンテナランタイム (containerd) は、Terway や kube-proxy といったシステム Pod に必要なイメージをプルします。
-
アプリケーションイメージのプル:ノードが Ready 状態になった後、Pod がそのノードにスケジューリングされ、コンテナランタイムはアプリケーションのコンテナイメージをプルします。
ノードプールがデータディスクスナップショットを使用してスケールアウトする場合、ネットワークプル操作はローカルロード操作に置き換えられます:
-
ノードの Ready 状態への移行の高速化:初期化スクリプトは最初にローカルパスをチェックします。スナップショットにはシステムイメージがプリロードされているため、ノードはダウンロードとプルのプロセスをスキップし、より速く Ready 状態に達します。
-
アプリケーションの起動の高速化:アプリケーションイメージがスナップショットに事前キャッシュされているため、Pod が新しいノードにスケジューリングされると、コンテナランタイムは必要なイメージをローカルで見つけることができ、アプリケーションを迅速に起動できます。
ステップ 1:スナップショット用のノードの準備
必要な Container Service for Kubernetes (ACK) のコアコンポーネントとアプリケーションイメージを含む ECS インスタンスを作成します。その後、このインスタンスのデータディスクからスナップショットを作成します。
-
スナップショット作成のために ECS インスタンスを準備します。
-
クラスターに ノードプールを作成し、以下の主要な設定を行います。このプロセス中に、ACK は Terway や kube-proxy コンポーネントイメージなどのアドオンイメージを自動的にデータディスクに保存します。
-
ログイン :インスタンスにログインするためのキーペアまたはパスワードを設定します。
-
想定ノード数 :1 に設定します。
-
データディスク :少なくとも 1 つのデータディスクを追加します。
許可リストへの登録により 初期化設定 機能が利用可能な場合は、フォーマットして、コンテナ実行時の占有ディレクトリにする を選択します。これにより、コンテナランタイム環境がデータディスク上にプロビジョニングされます。
-
-
ノードが Ready 状態になった後、クラスターからノードを削除します。ノードを削除する際は、基盤となる ECS インスタンスを保持するために 同時に ECS をリリースする を選択しないでください。
-
-
保持した ECS インスタンスにログインし、必要なコンポーネントとイメージファイルを手動でデータディスクに追加します。
-
ECS インスタンスにログインし、
lsblk -fコマンドを実行して、/var/lib/containerなどのデータディスクのマウントパスを表示します。 -
kubelet コンポーネントをキャッシュします。
-
前の手順で確認したデータディスクのマウントパスに移動し、ACK コンポーネント用のキャッシュディレクトリを作成します。次のコマンドを実行する際は、/var/lib/container を実際のパスに置き換えてください。
cd /var/lib/container mkdir -p ack -
リージョンとクラスターバージョンの環境変数を設定します。
# この例では cn-shanghai リージョンとバージョン 1.34.1-aliyun.1 を使用します。実際の値に置き換えてください。 export REGION="cn-shanghai" export KUBE_VERSION="1.34.1-aliyun.1" -
kubelet バイナリファイルをダウンロード、展開し、キャッシュディレクトリに移動します。
wget http://aliacs-k8s-$REGION.oss-$REGION-internal.aliyuncs.com/public/pkg/kubernetes/kubernetes-$KUBE_VERSION-linux-amd64.tar.gz tar -xvf kubernetes-$KUBE_VERSION-linux-amd64.tar.gz mv pkg/kubernetes /var/lib/container/ack/ -
スナップショットのサイズを小さく抑えるために、一時ファイルをクリーンアップします。
rm kubernetes-$KUBE_VERSION-linux-amd64.tar.gz rm -rf pkg
-
-
-
(任意) アプリケーションイメージのキャッシュ
頻繁に使用するアプリケーションイメージをローカルインスタンスにプルします。これらのイメージはスナップショットに含まれるため、アプリケーション Pod の起動が高速化されます。
# Docker が環境内で利用可能な場合は 'docker pull' も使用できます。 # 次のコマンドは Nginx イメージを例として使用します。 crictl pull anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
ステップ 2:データディスクスナップショットの作成
キャッシュされたコンポーネントとイメージを含むデータディスクからスナップショットを作成します。このスナップショットは、今後のノードプールのスケールアウトに再利用できます。
-
ECS コンソール - インスタンス に移動し、対象のインスタンスを 停止 状態にします。
インスタンスの停止方法の詳細については、「インスタンスの停止」をご参照ください。
-
インスタンスが停止したら、その詳細ページに移動し、ブロックストレージ タブをクリックします。
-
コンテナランタイムのディレクトリとして機能するデータディスクを見つけます。アクション 列で、[スナップショットの作成] をクリックし、画面の指示に従ってスナップショットを設定します。
スナップショットの設定方法の詳細については、「手動でのスナップショットの作成」をご参照ください。
ステップ 3:スナップショットを使用したスケールアウトと結果の検証
-
ノードプールを作成し、先ほど作成したスナップショットを適用します。主要な設定は以下の通りです:
-
オペレーティングシステム :必要に応じてオペレーティングシステムを選択します。
現在、この機能は ContainerOS 3.5 以降のバージョンではサポートされていません。
-
想定ノード数 :1 以上に設定します。
-
データディスク :
-
[データディスクスナップショットから] を選択し、作成したスナップショットを選択します。
-
許可リストへの登録により 初期化設定 機能が利用可能な場合は、フォーマットして、コンテナ実行時の占有ディレクトリにする を選択します。このフォーマットプロセスでは、スナップショット内のデータは保持されます。
-
-
ユーザーデータ ContainerOS 以外のオペレーティングシステムの場合、次のスクリプトを追加して
yumの更新をスキップし、ノードの初期化を高速化します。touch /var/.skip-yum
-
-
新しいノードが Ready 状態になった後、ノードにログインし、キャッシュが有効になっているかを確認します。
-
イメージキャッシュが有効かを確認します。
kubelet ログを確認します。ログに事前キャッシュされたイメージのプル記録が表示されなければ、キャッシュは有効です。
# このコマンドが出力を返さない場合、または Terway や kube-proxy のような事前キャッシュされたイメージのプル記録が出力に含まれていない場合、キャッシュは有効です。 journalctl -u kubelet | grep "pulled image" -
kubelet キャッシュが有効かを確認します。
ack-deployログを確認します。check cached kubernetes failedというメッセージが表示されなければ、キャッシュは有効です。# このコマンドが出力を返さない場合、キャッシュされた kubelet は正常に使用されています。 cat /var/log/ack-deploy.log |grep "check cached kubernetes failed"
-
課金
スナップショット作成に使用する一時的な ECS インスタンス、そのインスタンスにアタッチされたクラウドディスク、および作成されたスナップショットには、すべて料金が発生します。
プロセスが完了したら、速やかに一時的な ECS インスタンスをリリースしてください。スナップショットのライフサイクルを定期的に管理し、不要なスナップショットを削除してコストを削減してください。
よくある質問
アップグレード後に古いスナップショットを使用できますか?
推奨しません。スナップショットにキャッシュされている kubelet のバージョンが新しいクラスターバージョンと互換性がないため、ノードが正しく登録されない可能性があります。クラスターのアップグレード後は、新しいデータディスクスナップショットを作成することを推奨します。
kubelet やコンテナイメージ以外のファイルもキャッシュできますか?
はい。データディスクのパスに配置されたファイルはすべてスナップショットに含まれます。アプリケーションの要件に応じて、設定ファイルやデータモデルなど、他の依存ファイルをキャッシュできます。ただし、スナップショットのサイズとコンテンツのコンプライアンスを必ず管理してください。