データベースなどのステートフルアプリケーションや、継続的インテグレーション、バッチ処理など短命のコンテナが多数存在するワークロードにおいて、高密度デプロイメントを実施する場合、各 Pod はデータストレージ用に複数のクラウドディスクを必要とします。多くの Pod が同時に同一ノードにスケジュールされる際、デフォルトの直列アタッチ処理により、Pod の起動時間が大幅に増加します。この問題を解決するため、並列クラウドディスクアタッチ機能を有効化してください。
前提条件
-
ACK マネージドクラスター のバージョンが 1.26 以降である必要があります。csi-plugin および csi-provisioner コンポーネントのバージョンは、1.30.4 以降である必要があります。
-
Cloud Assistant CLI をインストールおよび構成します。詳細については、「Cloud Assistant CLI のインストール」をご参照ください。
注意事項
-
並列アタッチをサポートするのは、ディスクシリアル番号を持つクラウドディスクのみです。ディスクシリアル番号の確認方法については、「Elastic Block Storage のシリアル番号の表示」をご参照ください。
2020 年 6 月 10 日以前に作成されたクラウドディスクには、識別可能なシリアル番号情報が含まれません。これらのディスクは正常にマウントできないため、並列アタッチを有効化できません。
-
同一ノードから複数のクラウドディスクをアンマウントする操作は、引き続き直列で実行されます。
-
並列アタッチを有効化した後、ECS の OpenAPI 操作(例:DescribeDisks)で返される
Deviceフィールドおよびコンソールに表示されるマウントポイントは信頼性が低下する場合があります。アプリケーションでは、このマウントパスを使用しないでください。代わりに、クラウドディスクのシリアル番号を用いて実際のマウントパスを確認してください。
有効化手順
並列クラウドディスクアタッチ機能は、自動スクリプトの実行または手動構成のいずれかで有効化できます。
自動スクリプトによる構成
-
以下のスクリプトを enable_parallel_attach.sh として保存します。
-
並列クラウドディスクアタッチ機能を有効化するために、スクリプトを実行します。
bash enable_parallel_attach.sh <クラスター ID>
手動構成
-
クラスターのノードプール構成に ECS ラベル を追加します。キーを
supportConcurrencyAttach、値をtrueに設定し、すべての新規 ECS インスタンスにこのタグが含まれるようにしてください。Container Service Management Console にログインします。左側のナビゲーションウィンドウで、クラスターリスト をクリックします。
クラスターリスト ページで、ご利用のクラスター名をクリックします。左側のナビゲーションウィンドウで、 をクリックします。
-
ノードプールページで、対象のノードプールの アクション をクリックし、[編集] をクリックします。
-
ノードプールの編集ページで、下部の「高度なオプション」セクションに、キーが
supportConcurrencyAttach、値がtrueの ECS ラベル を追加します。
-
クラスター内の既存ノードのすべての ECS インスタンスに、キーが
supportConcurrencyAttach、値がtrueのタグを追加します。詳細については、「カスタムタグの作成とアタッチ」をご参照ください。 -
左側のナビゲーションウィンドウで、操作 > アドオン管理 を選択します。ボリューム タブをクリックし、csi-provisioner コンポーネントを検索して、右下隅の [設定] をクリックします。FeatureGate を
DiskADController=true,DiskParallelAttach=trueに設定します。説明DiskADController=true を設定すると、
csi-provisionerがクラウドディスクのattachおよびdetach操作を処理します。DiskParallelAttach=trueを設定すると、並列クラウドディスクアタッチ機能が有効化されます。 -
csi-provisioner の構成後に、csi-plugin コンポーネントの FeatureGate を
DiskADController=trueに設定します。
クラウドディスクの並列アタッチ性能の検証
この例では、同一ノードにクラウドディスクをマウントする複数の Pod を作成し、並列アタッチ機能の有効化によって Pod の起動速度が向上することを検証します。
本トピックのテストデータは参考用です。実際の結果はご利用の環境によって異なります。
-
複数のクラウドディスクをアタッチできるノードを ACK クラスターに追加します。たとえば、ecs.g7se.16xlarge インスタンスは最大 56 個のクラウドディスクのアタッチをサポートします。
-
以下の内容で attach-stress.yaml というファイルを作成します。
<YOUR-HOSTNAME>は、実際のノード名に置き換えてください。 -
以下のコマンドを実行して、アプリケーションが正常に起動することを確認します。その後、一括アタッチテストの準備として、レプリカ数を 0 にスケールダウンします。
kubectl apply -f attach-stress.yaml kubectl rollout status sts attach-stress kubectl scale sts attach-stress --replicas 0期待される出力:
storageclass.storage.k8s.io/alibabacloud-disk created statefulset.apps/attach-stress created partitioned roll out complete: 1 new pods have been updated... statefulset.apps/attach-stress scaled -
以下のコマンドを実行して一括アタッチテストを開始し、Pod の起動にかかる時間を記録します。
説明このクラスターでは、並列アタッチ機能はまだ有効化されていません。テスト用のレプリカ数は、ご利用のノードがサポートするクラウドディスクの最大数に基づいて調整してください。
date && \ kubectl scale sts attach-stress --replicas 28 && \ kubectl rollout status sts attach-stress && \ date期待される出力:
Tue Oct 15 19:21:36 CST 2024 statefulset.apps/attach-stress scaled Waiting for 28 pods to be ready... Waiting for 27 pods to be ready... ... Waiting for 3 pods to be ready... Waiting for 2 pods to be ready... Waiting for 1 pods to be ready... partitioned roll out complete: 28 new pods have been updated... Tue Oct 15 19:24:55 CST 2024出力より、並列アタッチ機能が無効の場合、28 個のすべての Pod の起動に 3 分以上かかっていることがわかります。
-
「機能の有効化」の手順に従って、このクラスターで並列アタッチ機能を有効化します。
-
以前に作成した Pod をクリーンアップし、次のテストの準備を行います。
説明クリーンアップ中に、クラスター内の
volumeattachmentsリソースを監視してください。これらのリソースが削除されると、クラウドディスクがデタッチされます。このプロセスには数分かかります。kubectl scale sts attach-stress --replicas 0 -
テストコマンドを再度実行し、並列アタッチ機能が有効化された状態での Pod 起動時間を記録します。起動時間は約 40 秒となることが期待され、前述の 3 分と比較して大幅な改善が見込まれます。
date && \ kubectl scale sts attach-stress --replicas 28 && \ kubectl rollout status sts attach-stress && \ date期待される出力:
Tue Oct 15 20:02:54 CST 2024 statefulset.apps/attach-stress scaled Waiting for 28 pods to be ready... Waiting for 27 pods to be ready... ... Waiting for 3 pods to be ready... Waiting for 2 pods to be ready... Waiting for 1 pods to be ready... partitioned roll out complete: 28 new pods have been updated... Tue Oct 15 20:03:31 CST 2024
-
テストアプリケーションをクラスターから削除します。
kubectl delete -f attach-stress.yaml