ステートフルアプリケーション (データベースなど) または多数の短寿命コンテナ (連続統合やバッチ処理など) の高密度展開を伴うシナリオでは、各ポッドはデータを保持するために多数のディスクを必要とします。 多数のポッドが同時に同じノードにスケジュールされている場合、デフォルトのシリアルマウント方法ではポッドの起動時間が長くなります。 この問題を解決するには、ディスク並列マウント機能を有効にします。
前提条件
ACK管理クラスターが作成されました。 クラスターのKubernetesバージョンが1.26以降です。 csi-pluginおよびcsi-provisionerコンポーネントのバージョンは1.30.4以降です。 詳細については、「csi-plugin」および「csi-provisioner」をご参照ください。
Alibaba Cloud CLIがインストールされ、設定されています。 詳細については、「Alibaba Cloud CLIのインストール」をご参照ください。
使用上の注意
パラレルマウント機能は、シリアル番号を持つディスクに対してのみ有効にできます。 ディスクのシリアル番号を照会する方法の詳細については、「ディスクのシリアル番号の照会」をご参照ください。
6月10日より前に作成されたディスクには、2020認識可能なシリアル番号がありません。 これらのディスクの並列マウント機能を有効にすると、マウントエラーが発生します。
複数のディスクが同じノードからアンマウントされている場合、ディスクはシリアルモードでアンマウントされます。
並列マウントを有効にすると、ECS DescribeDisksなどのAPIによって返される
デバイスフィールドと、コンソールに表示されるマウントターゲットが不正確になる場合があります。 ビジネスではこのマウントパスを使用しないでください。 ディスクのシリアル番号を使用して、実際のマウントパスを確認できます。
手順
手動でディスク並列マウントを有効にするか、自動スクリプトを使用してこの機能を有効にすることができます。
自動スクリプトの使用
次のスクリプトをenable_parallel_attach.shという名前のファイルとして保存します。
スクリプトを実行して、並列モードでディスクをマウントします。
bash enable_parallel_attach.sh <Cluster ID>
機能を手動で有効にする
クラスターのノードプールにECSタグを追加します。 タグキーを
supportConcurrencyAttachに設定し、タグ値をtrueに設定します。 タグが新しいECSインスタンスに追加されていることを確認します。ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のナビゲーションウィンドウで、 を選択します。
[ノードプール] ページで、変更するノードプールを見つけ、[操作] 列の [編集] をクリックします。
ページの下部で、[詳細オプション] セクションを見つけ、ESCタグを追加します。 キーを
supportConcurrencyAttachに設定し、値をtrueに設定します。
クラスター内の既存のすべてのノードのECSインスタンスにタグを追加します。 キーを
supportConcurrencyAttachに設定し、値をtrueに設定します。 詳細については、「カスタムタグの追加」をご参照ください。左側のナビゲーションウィンドウで、[操作] > [アドオン] を選択します。 [ストレージ] タブをクリックしてcsi-provisionerコンポーネントを見つけ、コンポーネントの右下隅にある [設定] をクリックし、FeatureGateパラメーターを
DiskADController=true,DiskParallelAttach=trueに設定します。説明DiskADController=trueを指定すると、ディスクに関連するアタッチおよびデタッチ操作がcsi-provisionerによって実行されます。DiskParallelAttach=trueを指定すると、ディスク並列マウント機能が有効になります。csi-provisionerを設定した後、csi-pluginコンポーネントのFeatureGateパラメーターを
DiskADController=trueに設定します。
ディスク並列マウント機能が有効になっていることを確認する
この例では、多数のディスクがマウントされたポッドを同じノードに作成して、並列マウントが有効になった後のポッドの起動加速を確認します。
このトピックで提供される統計は理論値にすぎません。 実際の値は環境によって異なる場合があります。
複数のディスクをサポートするノードをACKクラスターに追加します。 たとえば、ecs.g7se.16xlargeタイプのインスタンスに最大56台のディスクをマウントできます。
attach-stress.yamlという名前のテストファイルを作成し、次の内容をファイルにコピーします。
attach-stress.yamlをノードの実際の名前に置き換えます。次のコマンドを実行して、アプリケーションが期待どおりに起動することを確認します。 次に、ポッドの数を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次のコマンドを実行して、バッチマウントテストを開始し、ポッドの起動に必要な時間を計算します。
説明この場合、クラスターの並列マウントは無効になります。 ノードでサポートされているディスクの最大数に基づいて、テスト用のポッドの数を調整します。
date && \ kubectl scale sts attach-stress --replicas 28 && \ kubectl rollout status sts attach-stress && \ date期待される出力:
Tuesday October 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... <Omitted...> 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... Tuesday October 15 19:24:55 CST 2024出力は、パラレルマウントが無効になっている場合、28個のポッドすべてを起動するのに3分以上かかることを示しています。
[手順] セクションの指示に従って、並列マウントを有効にします。
次のコマンドを実行して、前述のポッドを削除し、その後のテストの準備をします。
説明クラスター内の
volumeattachmentsリソースに注意してください。 リソースが削除されると、ディスクはアンマウントされます。 このプロセスには数分かかります。kubectl scale sts attach-stress --replicas 0次のコマンドを再度実行して、並列マウントを有効にした後のポッドの起動に必要な時間を計算します。 予想される時間は約40秒で、パラレルマウントが無効になっている場合の3分よりもはるかに高速です。
date && \ kubectl scale sts attach-stress --replicas 28 && \ kubectl rollout status sts attach-stress && \ date期待される出力:
Tuesday October 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... <Omitted...> 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... Tuesday October 15 20:03:31 CST 2024
次のコマンドを実行して、クラスター内のテストアプリケーションを削除します。
kubectl delete -f attach-stress.yaml